Пространства адресов

Тема в разделе "WASM.BEGINNERS", создана пользователем defaultplayer, 28 дек 2008.

  1. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    Pavia
    замена CR3 это смена линейного пространства, смена линейно-физического отображения и от этого кто-то другой нестал транслировать адреса, их по прежнему транслирует процессор. Про MmMapIoSpace вообще интересно, это называется использование одних данных для копирования других из одного места памяти в другое, и процессор преобразовал кучу адресов, пока это проделал.
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    defaultplayer
    Знач так... :) Понятия логического и виртуального адреса - это разные способы абстракции.
    1) Логический адрес - это такой, который задаётся селектором сегмента и смещением, т.е. по сути двумя числами. Т.о. это способ абстрагироваться от линейного адреса с помощью его разбиения на два куска.
    2) Понятие виртуального адреса имеет смысл только при включенном страничном механизме трансляции адресов. Логический адрес можно называть виртуальным, если включён пэйджинг. Но от этого он не перестаёт быть логическим, потому как всё ещё задаётся селектором сегмента и смещением. Виртуальность здесь в том, что реально памяти может и нет, но она появится, когда ОС подгрузит её с винта (ИМХО это можно также назвать участием ОС в трансляции адреса). Т.о. это способ абстрагироваться от реально существующей физической памяти.

    Так что, ИМХО SII прав: логический и виртуальный адрес - это один и тот же адрес (при включённом пэйджинге). При отключённом пэйджинге понятие виртуального адреса не определено. Microsoft ИМХО использует понятие виртуального адреса, чтобы подчеркнуть использование страничной подкачки и абстрагирование от реальной физической памяти, создавая процессу иллюзию существования 32-битного виртуального адресного пространства.
    Если честно, я так и не понял, откуда взялись 48 бит. База сегмента в дескрипторе сегмента - 32 бита, смещение - 32 бита. Линейный адрес всегда 32-битный. Откуда взялись 48?
     
  3. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Pavia
    Адресация определяется архитектурой процессора, а не желанием программиста, даже если это создатель оси. Программист может не использовать все возможности процессора -- но от этого разрядность адресов не поменяется, их составные части не исчезнут и т.д. Так что в документации на ось кусок виртуального адреса может называться просто виртуальным адресом -- но это совершенно не означает, что этот кусок и является подлинным виртуальным адресом. Это всего лишь часть виртуального адреса, а другая часть подразумевается. Что мы, собсно, и имеем в случае с любыми осями, использующими плоскую модель памяти на ИА-32. Виртуальный адрес -- всё равно 48 бит, поскольку образуется из селектора сегмента и смещения. Ну а Ваши прибавки вроде компьютера, процесса и т.д. -- это уже Ваша сильно (и неоправданно, ИМХО) расширенная трактовка виртуального адреса.

    defaultplayer
    Звиняйте, но умные книги и прочие ресурсы надо цитировать всё ж не "в вакууме", а с учётом того, для каких условий они писались. МСДН ориентирован на ОС с плоской моделью памяти, поэтому в нём допустима трактовка виртуальный адрес = смещение, хотя это физически всё равно не так.

    Глупость. ОС управляет преобразованием адресов, поэтому именно ей и приходится разбирать, где, что и как. Например, то, что для программиста-прикладника является непрерывной последовательностью адресов, для оси таковым уже обычно не является.

    Чтобы тем было понятно, что такое виртуальная память, как она связана с физической, для чего нужен файл подкачки и т.п.

    Вообще-то FS -- это особый случай, и для упрощения о нём я не упоминал. Ну а если уж говорить про него, тогда стоит заметить, что у Винды -- не плоская, а некая гибридная модель адресации.

    l_inc
    Виртуальный адрес -- это селектор сегмента (16 бит) и смещение (32 бита), а не база из дескриптора и смещение. База -- это информация для формирования линейного адреса, но в виртуальный (тот, с которым работает программист) она не входит.
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    SII
    В принципе могу с этим согласиться. Но тем не менее я бы не стал даже в терминах Microsoft называть виртуальным адресом только смещение, т.к. даже прикладному программисту ничто не мешает сделать свой дескриптор сегмента с ненулевой базой. И опять таки противоречия с терминами Microsoft не будет: 48-битные адреса адресуют 32-битное адресное пространство.
    Но тогда ответьте на такой вопрос: какая разрядность (сколько бит) у адреса в реальном режиме (адресное пространство ясно дело 20-битное)?
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    SII
    Нет. Всё таки не могу. :) Логический адрес - это селектор сегмента и смещение. Но не виртуальный.
    Перечитал ещё раз всю тему. Понял, что зря ввязался. :) Собственно, я согласен с defaultplayer: виртуальный адрес - это линейный адрес. Но (!) только при включённом пэйджинге. При отсутствии пэйджинга понятие виртуального адреса не определено.
    А Microsoft использует именно термин "виртуальный" (а не "линейный") с целью акцентировать внимание на наличии этого самого пэйджинга и страничной подкачке. Т.к. виртуальная память в их определении - это совокупность RAM и файла подкачки.
     
  6. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    l_inc
    А тут я с Вами не соглашусь :) Логический и виртуальный адрес -- по сути одно и то же, эти слова на платформе ИА-32 являются синонимами. Разница фактически в том, что логическими адресами их называют в руководствах по железу, т.е. когда речь идёт о том, как процессор обрабатывает адреса, ну а виртуальными -- когда речь идёт о программировании, т.е. о том, с какими адресами работает программист. Ну а поскольку программист в Винде реально работает только со смещением, можно допустить терминологическую вольность и назвать виртуальным адресом именно смещение, хотя, строго говоря, это будет неправильно.

    Неверно. Численно смещение не обязано совпадать с соответствующим линейным адресом: база может отличаться от нуля. И это не говоря о том, что программа, обращаясь к памяти, формирует адрес всё равно из двух компонентов -- селектора и смещения, а не из одного.

    Что же касается страничной адресации, на которую Вы напираете как на необходимое условие для виртуальной памяти, то это тоже неверно. Виртуальную память можно было реализовать и на 80286, где страничного механизма не было. Но для этого пришлось бы заниматься загрузкой-вытеснением целых сегментов размером до 64 Кбайт. У программы по-прежнему была бы иллюзия присутствия большего количества памяти, чем её есть на самом деле; программист по-прежнему бы понятия не имел, по каким физическим адресам расположена его программа. Ну и чем это отличается от виртуальной памяти на основе страниц, не считая технических деталей, незаметных простому программисту?

    Опять-таки необязательно. Механизм виртуальной памяти работает и без файла подкачки, а файл подкачки может присутствовать и без наличия полноценного механизма виртуальной памяти. Я бы сказал так: виртуальная память -- это возможность загружать программу в произвольные участки физической памяти как целиком, так и отдельными частями, причём для самой программы это должно быть незаметно. "Растягивание" же объёма памяти за счёт файла подкачки является одним из следствий использования виртуальной памяти, но не её основой.

    А вот на этот вопрос однозначный ответ дать сложно :) Дело в том, что адрес, которым оперирует программист (сегмент:смещение) не является виртуальным: он однозначно соответствует физическому...
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А я никак не пойму о чем вы спорите.) Как его не обозвать, смысл не изменится.
    Кому больше нравится называть виртуальным адресом селектор:смещение, пусть называют. Кому нравится называть виртуальным адресом линейный, пусть называют. Все равно в конце концов из контекста будет понятно что имелось в виду.
     
  8. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    SII
    выражайтесь точнее, чтобы можно было определить вашу точку зрения
    когда процессор обрабатывает адреса это и есть его программирование
    это ваша терминологическая вольность, так как исходя из ваших слов майкрософт говорит о разбиении процессором на состовляющие смещения, а это бред, если нет, давайте ссылку
    из этой же оперы, сами себе противоречите. я вам упомянул сегментный регистр fs, вы вспомнили и теперь говорите что смещение(оно же виртуальный адрес именуемый вами) не совпадает с линейным, еще раз - давайте ссылку где майкрософт говорит о разбиении смещения

    Great
    так проще всего сказать. На самом же деле, даже глядя в эту тему у многих большая каша в голове, и это правда. Я хотел написать статью на эту тему, но прежде решил посоветоваться у жителей именно этого форума. А то что каша я легко могу доказать:

    спрошу у SII, исходя из вашего понимания виртуального АП, какой объем его у юзермодной программы в виндоус?
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    SII
    Давайте глянем всё таки в интеловский мануал, том 1, раздел 3.3.2:
    С этого момента именно Intel (руководство по железу) говорит о виртуальной памяти. Так что я не зря напираю на механизм страничной адресации. В IA-32 именно она является определяющим фактором понятия "виртуальная память". А то, что Вы там искусственно реализуете в 80286 - это уже Ваша собственная терминология. А также том 3A, раздел 3.1:
    И здесь становится ясно, какую память называть виртуальной. К тому же Вы называете логический адрес 48-битным. В терминологии Microsoft, как уже показывал defaultplayer, виртуальный адрес 32-битный. Но это, разумеется, не основной аргумент. А основной дальше...
    Напоминаю, что я уже написал: "Даже прикладному программисту ничто не мешает сделать свой дескриптор сегмента с ненулевой базой". Это означает, что программист по Windows может работать, как с селектором сегмента, так и со смещением. Если я создам дескриптор сегмента с базой 80000000h, то это совсем не будет означать, что в АП процесса не существует виртуальных адресов младше. Так что только смещение называть виртуальным адресом нельзя! И Microsoft этого не делает.
    Простите, но этот аргумент защищает мою (по сути defaultplayer) точку зрения, а не Вашу. :)
    Во-первых, я привёл определение. И тут нельзя говорить "необязательно". Это просто так есть. Это факт. А во-вторых, да... механизм виртуальной памяти (он же механизм страничной адресации) работает, и виртуальная память остаётся совокупностью RAM и файла подкачки. Просто файла подкачки нет, но это частный случай. И вот Вам цитата в дополнение к тому, что пишет Intel:
     
  10. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Great
    Если не договариваться о терминах, хаос возникает, и разбираться, что к чему, иногда приходится весьма долго...

    defaultplayer и l_inc
    Виртуальный и логический адрес -- одно и то же. Это тот адрес, с которым имеет дело программа и который посредством аппаратных средств процессора (сегментного и страничного механизмов в случае ИА-32) в конечном счёте преобразуется в физический. Надеюсь, здесь я достаточно ясно выразился?

    Программирование -- это процесс создания программы, а отнюдь не её выпонения. Однако обработку адресов процессор производит во время выполнения программы, а не её создания.

    Выражайтесь точнее, иначе я не могу понять, где я сказал, что "майкрософт говорит о разбиении процессором на составляющие смещения".

    Из этой же оперы. Давайте ссылку, где я говорю, что "майкрософт говорит о разбиении смещения".

    Ватсон, это элементарно. Только уточните сначала, идёт ли речь о доступном для программы объёме виртуального адресного пространства или о том пространстве адресов, которые может формировать программа.

    Извините и не торопитесь. Дайте определение, что такое виртуальная память, и тогда мы сможем решить, является ли страничный механизм единственным способом её реализовать или нет. А то, что это написала аж сама Интел, ещё не означает, что это -- истина в последней инстанции. Хотя б потому, что термин "виртуальная память" появился задолго до появления компании Интел. Лично я утверждаю, что Интел в своём руководстве указывает лишь наиболее простой и удобный, но не единственный способ реализации виртуальной памяти на процессорах её архитектуры.

    Вот и дайте определение, что такое виртуальная память, а тогда поговорим. И, пожалуйста, без дословного цитирования руководства: мало ли как Вы понимаете данный англоязычный текст. Вы сами объясните, что такое, по Вашему мнению, виртуальная память.

    Вообще-то доступ прикладному программисту к таблицам дескрипторов закрыт, поэтому для него сделать свой дескриптор с ненулевой базой проблематично. Это может сделать операционная система.

    Определения Вы не привели. Вы привели пару цитат из интеловского руководства, но это -- не определения. Так что по-прежнему прошу Вас дать именно определение.

    Как раз страничный механизм -- частный случай аппаратных средств, позволяющих реализовать на практике концепцию виртуальной памяти.

    Ну что ж, как раз тут с Майкрософтом спорить по сути не о чем. Однако мы говорили о виртуальных адресах, а не о виртуальной памяти. Если исходить из приведённой Вами цитаты, чем будет являться виртуальный адрес и какая у него будет разрядность?
     
  11. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    SII
    Начну с конца...
    Тогда ж почему Вы выше по тексту просите дать именно определение виртуальной памяти? Но, собственно, не буду придираться... я попробую сформулировать и то, и то. И на самом деле терминов три штуки: виртуальная память, виртуальное адресное пространство процесса, виртуальный адрес в пределах адресного пространства процесса.
    Именно истина и именно в последней инстанции. :) Т.к. общего определения, AFAIR, не существует (если Вы считаете, что существует, дайте ссылку на цитату из надёжного источника типа ISO), каждая фирма в праве давать своё собственное определение для своих процессоров.
    Слишком уверенно. :) Любой процесс может создать собственный дескриптор в LDT. А GDT из ring3, разумеется, закрыта.

    Теперь о моём праве давать определения... это будет всего лишь интерпретация/перевод того, что написано в мануалах от Intel. Право давать формальное незыблемое определение остаётся за Intel.

    Ну а теперь сами определения:
    1) Виртуальная память - совокупность физической памяти и некоторого дискового пространства. Отсутствие файла подкачки - частный случай, но определение от этого не теряет силу. Разумеется, подразумевается в обязательном порядке включённая страничная адресация. Иначе понятие виртуальной памяти не определено.
    2) Виртуальное адресное пространство процесса - 32-битное линейное адресное пространство, предоставляемое каждому процессу (можно даже сузить определение, уточнив, что в ОС Windows), размещённое в виртуальной памяти и адресуемое 32-битными (виртуальными) адресами. Опять таки подразумевается, что включена страничная адресация.
    Разумеется, что оно не ограничивается выбором ненулевой базы сегмента в сегментном дескрипторе, как, например, ограничивается максимальное значение смещения при выборе ненулевой базы. Т.е. если выставить все базы сегментов, на дескрипторы которых указывают сегментные регистры, в значение 8000000h, это не будет означать, что теперь у нас виртуальное адресное пространство вдвое меньше.
    3) Виртуальный адрес - 32-битное число, адресующее определённый байт виртуального адресного пространства. Между множеством байтов виртуального адресного пространства и множеством виртуальных адресов существует взаимнооднозначное соответствие.
     
  12. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    SII
    не имеет значения, говорите и о том и о другом, хотя я уже предвижу ваш ответ, после я отвечу на другие ваши вопросы из данного поста
     
  13. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    l_inc
    По той причине, что без выяснения точного смысла терминов что-либо обсуждать бесполезно.

    Если честно, я не знаю, существует ли такое определение. Однако Интел, как и любая фирма, производящая процессоры, не может быть истиной в последней инстанции относительно того, что касается в первую очередь программного обеспечения. Максимум, на что она может (и, строго говоря, должна) претендовать -- это на истинность в последней инстанции касательно принципов работы выпускаемого ей железа. Т.е. если Интел написала, что преобразование адресов в процессорах архитектуры ИА-32 выполняется вот таким способом, а не эдаким -- это можно считать истиной в последней инстанции (если не выяснилось, что она допустила лажу в описании, но такие случаи, думаю, мы рассматривать не будем). Но вот толкование того, что такое виртуальное адресное пространство процесса, выходит за рамки компетенции Интел, потому что процесс -- это сущность программная, а не аппаратная, и может быть по-разному реализована в различных системах. Собственно, я с такими ситуациями сталкивался: на одной и той же аппаратуре работали разные оси, использовавшие совершенно разную терминологию. Сейчас единобезобразия в этих вопросах, конечно, значительно больше, но полного совпадения всё ж нет.

    Кстати, замечу, что в процитированном Вами отрывке мануала не даётся определение как таковое. Это просто описание, но никак не формальное определение типа "виртуальный адрес есть то-то и то-то".

    Абсолютно уверенно :) Процесс пользователя не имеет возможности загружать регистр LDTR, а значит, не может создать таблицу LDT. Конечно, если ось разместила LDT в области памяти, доступной процессу, или предоставила сервис для изменения LDT, тогда он сможет записать туда что угодно, но такая возможность должна быть предоставлена осью, процесс сам по себе получить её не может. Так что надо уточнять, о какой системе идёт речь: имеющей такую возможность или не имеющей.

    Ну, собственно я уже написал про права Интел, но теперь хочется спросить (полуиронично-полусерьёзно): Вы отказываете Майкрософт в праве давать определения, касающиеся её продукции?

    Во-первых, я соглашусь, что виртуальная память -- это совокупность физической памяти и некоторого дискового пространства, но сделаю два дополнения. Во-первых, не просто "некоторого дискового пространства", а пространства, выделенного для расширения объёма физической памяти. То пространство, что отведено под порнофильмы, вряд ли можно считать частью виртуальной памяти, хотя оно всё равно останется "некоторым дисковым пространством" :)

    Во-вторых, это определение касается виртуальной памяти всей вычислительной системы -- и ядра оси, и системных процессов, и пользовательских процессов одновременно. Если говорить о конкретном процессе, то там надо делать оговорку, что это совокупность частей физической и дисковой памяти, выделенных для хранения памяти этого конкретного процесса.

    А в-третьих, позволю себе небольшой наезд на Вас, но уверяю, что тут ничего личного :) Вы смешиваете в одну кучу концепцию, идею виртуальной памяти, заключающуюся в расширении объёма доступной памяти сверх реально имеющегося за счёт выделенной области подкачки на диске, причём незаметно для программ пользователя, с механизмом практического воплощения этой идеи. Но если Вы признаёте, что сущность виртуальной памяти заключается именно в расширении доступного объёма ОЗУ незаметным для прикладных программ образом, тогда Вы должны согласиться с тем, что механизм такого расширения -- дело десятое. Вы же почему-то утверждаете, что для поддержки виртуальной памяти непременно должна быть включена страничная адресация. На каком основании?

    Ну, во-первых, сузить просто необходимо: ничто не мешает гипотетической 32-разрядной оси для ИА-32 использовать на полную мощь механизм сегментации, и тогда виртуальное адресное пространство может оказаться значительно больше -- естественно, с помощью оси.

    Во-вторых, возникает вопрос: области памяти со старшими адресами, где лежит сама Винда и которые недоступны процессу для чтения-записи, относятся всё же к виртуальному адресному пространству процесса или нет?

    Что ж, такое определение можно принять, но тогда получается, что программист-прикладник имеет дело не с виртуальными адресами, а с какими-то другими. Потому что он вынужден работать с сегментами-смещениями (пускай даже с сегментами неявно при "истинно плоской" модели без всяких хитростей с FS), но никак не с линейными адресами напрямую: это напрямую вытекает из архитектуры ИА-32, в которой линейные адреса существуют только внутри процессора и только в качестве промежуточного результата во время преобразования пары "селектор сегмента:смещение" в физический адрес. В то же время традиционно считается, что прикладная программа (и, естественно, прикладной программист) работает именно с виртуальными адресами. Как быть в этом случае?

    defaultplayer
    Ещё как имеет, потому что в зависимости от того, что Вы хотите узнать, Вы получите совершенно разные ответы:

    1) Если вопрос состоит в том, какое максимальное пространство разных адресов может формировать программа, то ответить на него однозначно не так-то просто. Напрашивается мнение, что это 8191+8192 сегмента по 4 Гбайта каждый, однако из-за ограниченного 32-разрядного линейного адреса сделать такие сегменты неперекрывающимися невозможно, и получится, что предельный объём -- 4 Гбайта. Однако если использовать сегменты меньшего размера, суммарный объём можно увеличить. Предположим, например, что у нас все сегменты имеют размер 1 Гбайт. Тогда в каждый момент времени можно обращаться к четырём неперекрывающимся в памяти сегментам. Учитывая, что каждому сегменту соответствует свой селектор, получается, что у нас может быть 8191+8192 сегмента по 1 Гбайту, что в сумме даст 16 Тбайт без 1 Гбайта. Заметьте -- 16 Тбайт действительно независимых линейных адресов, хотя в каждый конкретный момент времени одновременно доступны будут, естественно, всё равно 4 Гбайта.

    2) Если же речь о доступном программам объёме, то тут основную роль играет не столько архитектура процессора (она лишь накладывает ограничение сверху), но и операционная система. В 32-разрядной Винде, как известно, процессам теоретически доступно несколько меньше 2 или 3 Гбайт (в зависимости от разновидности и режима системы). Однако при реальном выполнении программы доступно ещё меньше, ведь ОС выделяет при запуске процесса только определённый объём памяти и расширяет его только при поступлении запросов (например, VirtualAlloc).

    Так что, как видите, однозначного ответа на Ваш вопрос нет: он поставлен слишком неконкретно :)
     
  14. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    SII
    мда, таких глубоких познаний я еще нигде не встречал, небось 10-ю рассылку brokensworda до дыр затерли, а мануалы от производителя процессора открыть религия непозволяет. Простите но я сегодня не готов комментировать ваши замечательные мысли. Спокойной ночи.
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    SII
    Для того, чтобы озвучить принципы работы железа, необходимо пользоваться понятиями. А для того, чтобы использовать понятия, нужно ввести определения этих понятий, пусть даже эти понятия будут верными только в пределах контекста обсуждения их продукции.
    Так вот понятие виртуальной памяти вводится Intel и имеет непосредственное отношение к описанию работы железа. Понятия виртуального адресного пространства и виртуального адреса Intel не вводит и не упоминает вообще. Как раз из соображений принадлежности данных понятий к компетенции ОС.
    Как я уже написал выше, и не должно. Intel вводит понятие виртуальной памяти. Причём исключительно в контексте включённой страничной адресации. И это видно из приведенных в посте 49 цитат. Понятие виртуального адресного пространства вводится Microsoft на основе введённого Intel понятия виртуальной памяти. Т.к. понятие виртуальной памяти введено Intel только в контексте работы страничной адресации, основанные на нём понятия виртуального АП и виртуального адреса имеют смысл также только при включённом пэйджинге.
    Посмотрите на первый пост. С самого начала обсуждение (и большая часть аргументации) касается исключительно Microsoft Windows. Так что никакие дополнительные уточнения ИМХО не нужны.
    Да нет. :) Я просто не упомянул. Но разумеется, права на второе и третье определение целиком принадлежат Microsoft. :) А права на первое - Intel.
    Под словом "некоторое" не указывается конкретное дисковое пространство. Так что определение не содержит ошибки. Просто не раскрывается смысл слова "некоторое". Мне просто лень уточнять было, т.к. и так понятно, о чём речь. К тому же я привёл цитаты, где Intel тоже пишет: "Some disk storage". Более строгое определение было бы достаточно длинным. А в Вашем дополнении получается порочный круг: "Виртуальная память - это совокупность физической памяти и некоторого дискового пространства, выделенного под виртуальную память". Да, Вы написали: "Выделенного для расширения объёма физической памяти", — но по сути это одно и то же: я перефразировал для наглядности порочного круга.
    Не надо делать оговорку. Вы всё ещё не различаете понятия виртуальной памяти и виртуального АП процесса. Первое понятие вводится Intel на уровне железа и к процессам не имеет отношения.
    Не признаю. Понятие виртуальной памяти появляется с момента включения страничной адресации (так вводит это понятие Intel) и по большому счёту не важно, имеет ли место факт расширения виртуальной памяти за счёт дискового пространства.
    Это не я утверждаю, а Intel. Это их понятие и их определение. Смотрим всё те же пресловутые цитаты.
    В принципе, может быть и необходимо. Я просто побоялся сказать, что это определение будет неверным для любых других ОС.
    Это зависит от того, как разработчик ОС введёт понятие виртуального АП. Для Windows это практически синоним линейного АП, которое в IA-32 по определению, данному Intel, 32-битно.
    Разумеется. И все адреса, начиная с нулевого, тоже.
    В большинстве случаев он работает только со смещениями логического адреса (когда база сегмента нулевая), которые численно равны линейному адресу, который в свою очередь в случае включённой страничной адресации в терминах Microsoft является виртуальным адресом в виртуальном АП процесса.
    Если же база ненулевая... ну тогда да... можно сказать, что на этапе разработки программы программист-прикладник работает с логическим адресом, а не с виртуальным. Но на этапе отладки в отладчике он всё равно видит виртуальные адреса всего предоставленного процессу АП, а значит работает всё таки с виртуальными адресами, хоть и задаёт их в программе логически (в виде селектора сегмента и смещения).
     
  16. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    SII
    Вы знаете даже несмешно читать ваши утверждения, а грустно. Интересно, то что вы в своих двух ответах хотя он один, все время упоминаете линейное АП, хотя я четко сформулировал вопрос и я точно понял что логическое АП от линейного вы не отличаете.
    Вы не отличаете один набор цифр от других, над которыми процессор производит различные операции.
    Вот на мой вопрос отвечает Интел:
    Вы можете просуммировать длины всех доступных юзермодной программе сегментов?
    И знаете не зависит этот объем никак от того перекрываются они или нет, это еще раз доказывает что не улавливаете разницу между различными наборами цифр, и если перекрываются Интел называет это общей областью линейного АП, линейного, улавливаете разницу.
    Какой блин каждый момент времени, в любой момент времени процессор неявно берет селектор сегмента из регистра или явно из команды.
    опять вы за свое, я вам про логическое(вы его называете виртуальным незабыли?) вы мне про линейное, еще и про 16 терабайт, это вообще мега жесть.

    Это вообще капец, вы вообще понимаете что происходит? Вы можете различить три различно интерпретируемых набора цифр?

    Знаете почему Майкрософт говорит программе в виндоус доступно 4гб виртуального(линейного) АП?. Потому что для каждой программы винда держит один PDBR. Будет 2, будет у задачи или программы два линейно-физических отображения – 8ГБ линейного адресного пространства и насрать что это один и те же цифры.

    Ниже мой собственный ответ на мой вопрос, который я задал в первом посте. Он войдет в мою статью по данной теме, хотя конечно будет еще корректироваться. Это все мое мнение и сформировалось оно на основе анализа мануалов Интел.

    Майкрософт использует термин „виртуальный” вместо „линейного” так как, преобразование линейных адресов в физические может осуществляться двумя способами, прямо и косвенно, и использовать термин линейный некорректно, ведь может использоваться только один из способов, и термин линейный не отражает метод преобразования. А поскольку интел называет косвенный метод преобразования линейного ап, он же пейджинг, виртуальной памятью, использование термина „виртуальный” четко отражает используемый метод преобразования и не противоречит концепции.

    В общем, людям свойственно ошибатся и я могу глубоко заблуждатся также в чем-то, но только моя задача понять истину, и я небуду упираться рогом если кто-нибудь конструктивно обоснует всеобщее заблуждение, включяя меня.
     
  17. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    l_inc
    Ну что ж, в таком случае вынужден констатировать, что у нас существенно разное понимание виртуальной памяти. Вы, как я уже писал, смешиваете саму идею с её технической реализацией, что в корне неверно, даже если такое же смешение понятий царит в интеловском мануале. Виртуальная память -- это не аппаратная, "железная" категория, а "логическая", реализуемая программно, хотя и не без аппаратной поддержки.

    Вот, например, какое определение виртуальной памяти даёт Википедия (я понимаю, что этот источник не суперавторитет, но всё же игнорировать его тоже не стоит):

    Как видим, речь идёт о "разрывном" хранении информации в физической памяти (оперативной и на диске), но при этом с созданием для программы иллюзии, что вся информация хранится непрерывно и однородно. Ни слова о страничной организации (как и любой другой) здесь нет.

    В книге "Операционные системы" (Вильям Столлингс, изд. "Вильямс", М-СПб-Киев, 2004) компактного определения виртуальной памяти нет -- автор излагает связанные с ней идеи, проблемы, достоинства и недостатки и т.п. на нескольких страницах. Однако первое предложение подраздела "Страничная организация" (ст. 397) является довольно показательным:

    Таким образом, этот автор прямо говорит, что страничный механизм не является единственной возможностью организовать виртуальную память -- т.е. именно то, что утверждаю я и с чем не согласны Вы.

    Других достаточно современных книг по ОС у меня нет. Но Вы при желании сможете посмотреть, что по поводу виртуальной памяти говорится там.

    Повторю ещё и ещё раз: Вы валите в одну кучу аппаратный механизм и идею. То, что Вы делаете это на основе мануала Интела, объясняет причину появления такого заблуждения, но отнюдь не извиняет ни Вас (потому что могли б поизучать проблему шире), ни тем более тех, кто этот мануал писал (если уж взялись излагать программно-логические аспекты, так делайте это корректно, хотя подобным вещам в руководстве по процессору вообще не место).

    Ну ладно, здесь уговорили, я брал слишком широко. Хотя не могу не заметить, что Винда -- лишь одна из реализаций, и возводить её в абсолют не стоит. Понятное дело, что в обсуждениях постоянно повторять "присказки" вроде "как это реализовано в Винде" или "по терминологии Винды" не стоит, но если писать некую статью, подобные вещи надо чётко и недвусмысленно оговорить в её начале.

    Ну что ж, теперь более-менее ясно. Вы используете термин "логический" там, где я всегда встречал "виртуальный" и иногда (но не всегда -- ранее я погорячился, сказав, что это всегда синонимы) "логический". Например, в мэйнфреймах IBM логический и виртуальный адрес -- абсолютно одно и то же, ну а в ОС RSX-11 на PDP-11 виртуальный адрес -- это тот, который непосредственно формирует программа, термин "логический адрес" не используется, зато чётко различаются виртуальное и логическое адресные пространства: первое состоит из всех виртуальных адресов, которые может сформировать программа (всего 64 Кбайта, поскольку виртуальный адрес 16-разрядный), а вот второе -- это совокупность всех областей памяти, к которым программа имеет право обращаться (их объём может быть существенно выше 64 Кбайт, но только к 64 Кбайтам имеется доступ одновременно; для обращения к другим необходимо вызывать соответствующую функцию операционной системы с указанием, какую часть виртуальных адресов переотобразить на нужную часть логического адресного пространства).

    Что же касается Винды, то... Вопрос такой: есть ли в документации Майкрософт точное определение, что такое в их понятии виртуальный и логический адреса? Я не встречал, но я и не штудировал её от корки до корки (что сделать проблематично по понятным причинам), а пользовался только как справочником и натыкаться на такие определения не доводилось. Если Вам такое известно, просьба указать, где именно это можно найти. Если же нет -- вопрос о терминологии остаётся открытым.

    А вот тут позвольте не согласиться. На этапе отладки программист видит содержимое регистров и памяти, но там везде -- непреобразованные адреса (логические в Вашей терминологии), а линейные и физические он всё равно не видит.

    Вот и получается, что если принять Вашу терминологию, программист не работает с виртуальными адресами -- в том числе при нулевой базе. Хотя в последнем случае Ваши "смещение логического адреса" и "виртуальный адрес" совпадут численно, из этого не следует, что "виртуальный" и "логический" адреса -- одно и то же.

    defaultplayer
    Понятия не имею, что это за рассылка, поэтому прокомментировать её ценность никак не могу. Что же касается мануалов от производителя, то их регулярно не только открываю, но даже читаю. Только вот, в отличие от некоторых, не возвожу их в ранг Священного Писания.

    Ну, если продолжать наезды друг на друга, то могу сказать, что мне тоже грустно читать Ваши писания. Вы очень многое понимаете неверно как раз из-за того, что считаете "мануалы от производителя" безусловной и непогрешимой истиной.

    Ну а я понял, что Вы не в состоянии понять, что нельзя использовать термин "логическое адресное пространство", предварительно его точно не определив. С линейным пространством всё как раз просто, поскольку этот термин -- именно Интеловский, относящийся к архитектуре ИА-32. А "логическое" -- это, извините, уже вне компетенции производителя процессора.

    Ну, могли б сказать проще: я вообще не понимаю, как работает процессор.

    Собственно, можно прокомментировать и дальнейшие Ваши высказывания, но нет времени (убегать надо), ни желания, да и смысла: как мы выяснили, я всё равно ничего не понимаю. Но всё ж боюсь, статья Ваша будет... э... весьма некорректна, хотя, возможно, отразит правильно частный случай работы с памяью, принятый в Винде.
     
  18. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    defaultplayer
    Хочу написать пару слов в защиту SII. :)
    Во-первых, Вы задавали вопрос о виртуальном АП, а не о логическом. Поэтому ИМХО ответ в 4 ГБ вполне удовлетворителен.
    Во-вторых, надо понимать, что ключевыми словами Вашего вопроса были: "Исходя из вашего понимания". Но (!) SII ведь никогда не отождествлял понятия виртуального АП и логического АП. Он отождествлял понятия виртуального и логического адреса. И хотя вполне логично было бы определить логическое АП, как множество возможных логических адресов, Intel о понятии логического АП практически не говорит и использует только понятие логического адреса.
    А теперь по Вашему ответу. С общим смыслом согласен, но вот для статьи ИМХО некорректно.
    ИМХО вполне корректно. Просто это не отражает сути. Поэтому, чтобы подчеркнуть наличие страничного преобразования, Microsoft вводит понятие виртуального АП на основе понятия виртуальной памяти.
    ИМХО опять некорректно. Если пэйджинг - это действительно метод (механизм) преобразования линейного АП (или лучше сказать: линейного адреса), то виртуальная память - это не метод, а абстракция, появляющаяся в результате применения этого метода.
    [ADDED]Нет... тут всё-таки исправляюсь... Учитывая, что Intel недвусмысленно пишет: "This latter method /*речь о пэйджинге*/ of mapping the linear address space is referred to as virtual memory or demand-paged virtual memory".[/ADDED]
     
  19. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    SII
    Т.е. Вы просто не признаёте права Intel на введение понятия виртуальной памяти по отношению к их продукции? Пусть общее понятие виртуальной памяти существует и является скорее идеей, чем аппаратной реализацией, но в контексте обсуждения процессоров Intel оно вводится только в качестве обозначения пэйджинга.
    Понятие логического адреса вводится Intel и так и остаётся способом представления адреса: сегмент:смещение. По поводу того, как Microsoft вводит виртуальный адрес, я дал ссылку в посте 55.
    Правда? Давайте откроем Olly (хотя в принципе подойдёт, наверное, любой отладчик, включая встроенный в стандартную Microsoft'овскую IDE). Смотрим в окно CPU: слева в разделе дизассемблера, дампа или стэка мы видим нумерацию адресов. Так вот нумерация адресов никоим образом не изменится, если селекторы сегментов будут указывать на дескрипторы сегментов с ненулевым базовым адресом. То, что физические адреса мы не видим, это понятно, но виртуальные (они же линейные) вполне.
    Прошу прощения, но это именно Вы говорили, что виртуальный и логический адреса - одно и то же. Я же согласился с defaultplayer и говорил, что виртуальный адрес - это линейный при включённом пэйджинге.
     
  20. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    l_inc
    это очень благородно с вашей стороны :)

    но все таки говорит и значит оно есть, и тогда вышесказанное само собой отождествляется, или для вас это не аргумент?
    не отражает сути, значит неккоректно, или вам само слово просто ненравиться, так как имеет различные определения - неточный, неправильный, нечеткий

    сам ничего непридумывал, цитирую интел