Очень ламерский вопрос про организацию памяти в Win32
Известно, что win32 использует плоскую модель памяти, т.е. отсутствует понятие сегмента (как в DOS, и соотв. не нужны регистры CS, DS, SS и пр., в которые записавались начала соотв. сегментов). Значит, все ячейки памяти (будь то данные, команды или стэк) адресуются на прямую, путем указания их относительного виртуального адреса в запускаемом образе. Зачем тогда в коде программ нужны все эти _TEXT SEGMENT DWORD PUBLIC ... и пр. объявления сегментов, если сегмент всего один, начинается с 0 и размером 2^32? Какую роль играют эти псевдо-сегменты? Только попрошу ногами не бить, или хотябы ткнуть в то место, где об этом можно прочитать.
сегменты существуют все равно. это сегменты кода, данных, стека... процессору безразлично, какую логическую нагрузку несут получаемые из ОЗУ данные. поэтому при компоновке исполняемого файла необходимо указать ОС, где у нас код, где данные и т. п. прочитайте описание формата PE (например у Юрова в книге "Ассеблер. специалбный справочник")
сегменты существуют все равно. это сегменты кода, данных, стека... процессору безразлично, какую логическую нагрузку несут получаемые из ОЗУ данные. поэтому при компоновке исполняемого файла необходимо указать ОС, где у нас код, где данные и т. п. прочитайте описание формата PE (например у Юрова в книге "Ассеблер. специалбный справочник")
Ага... Таким образом, сегменты в Win32 имеют значение только в пределах формата PE, просто-напросто потому что формат подразумевает некоторую упорядоченность данных. И когда ОС отображает образ на общее виртуальное адресное пространство, она разбивает эти секции на страницы и дальше вся работа идёт только со страницами. Информация о принадлежности тех или иных данных к какому-либо сегменту имеет для ОС смысл только в том плане, что она устанавливает для определенных страниц соотв. атрибуты (чтение/запись/исполнение и пр.) в соотв. с тем, как это указано в заголовках PE для каждой секции.
может быть сегментной, только адреса сегментов
хранят дескрипторы, размеры и начало сегментов
задаются полями base и limit. А вот роль
сегментных регистров при этом я сам не очень понимаю, может они используются для адресации
таблиц дескрипторов, да и если не они то кто же...
В зашишённом режиме организация памяти вполне
может быть сегментной, только адреса сегментов
хранят дескрипторы, размеры и начало сегментов
задаются полями base и limit. А вот роль
сегментных регистров при этом я сам не очень понимаю, может они используются для адресации
таблиц дескрипторов, да и если не они то кто же...
упрощенно и в двух словах: при сегментной адресации в защищенном режиме в cs хранится непосредственно описатель базы сегмента. таблицы дескрипторов не используються. а вот при страничной организации - там хранится указатель на элемент таблицы дескрипторов.
зашищённом режиме - в чём же тогда его зашишённость. Поему как раз и в зашишённом
режиме при сегментной и при страничной организации
памяти используются 8 байтные дескрипторы,
структуру его я на память сказать не могу,
но в ней есть бит, который как раз и определяет,
размер памяти в страницах или байтах.
Как же так дескрипторы не используются в
зашищённом режиме - в чём же тогда его зашишённость. Поему как раз и в зашишённом
режиме при сегментной и при страничной организации
памяти используются 8 байтные дескрипторы,
структуру его я на память сказать не могу,
но в ней есть бит, который как раз и определяет,
размер памяти в страницах или байтах.
Ежу понятно что ипользуются. Причем практически также как и в DOS. Только не как пара сегмент:смещение а как селектор:смещение. Таким образом никто тебе не мешает для кода использовать один селектор (в cs) а для стека другой (в ss). Просто в виндах адресное пространство одного PE-шника болтается в одном селекторе. И сегментные регистры вступают в силу только на уровне межселекторных (они же far) вызовах - ну и активно юзаются ядром и дровами. Кстати - ежели мне не изменяет память - то SEH болтается как раз в отдельном селекторе на который настроен fs.
кстати, я написал ерунду, а никто не поправил:
на самом деле я спутал с таблицами страниц, каюсь.
при сегментной адресации ЗР в сs хранится селектор дескриптора, который указывает на элемент таблицы LDT или GDT. из данных таблиц извлекается дескриптор сегмента и складывается со смещением, образуя линейный адрес, он же (для сегментной адресации) и физический. а вот при страничной организации - из линейного адреса еще извлекаются PDE (10 бит)- указатель на элемент каталога таблиц страниц, и PTE (10 бит) - указатель на элемент таблицы страниц. PDE выбирает определенный элемент ТС, потом PTE из этой таблицы выбирает конкретную страницу. потом адрес начала страницы складывается со 12 битным смещением (из линейного адреса) и (ура!) получается физический адрес.
какие твои годы :) только первый способ формирования адреса - нафиг. это динозавр, нигде не нужный :)