Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Очень ламерский вопрос про организацию памяти в Win32

1.8K
03 мая 2005 года
neutrino4
94 / / 05.09.2003
Известно, что win32 использует плоскую модель памяти, т.е. отсутствует понятие сегмента (как в DOS, и соотв. не нужны регистры CS, DS, SS и пр., в которые записавались начала соотв. сегментов). Значит, все ячейки памяти (будь то данные, команды или стэк) адресуются на прямую, путем указания их относительного виртуального адреса в запускаемом образе. Зачем тогда в коде программ нужны все эти _TEXT SEGMENT DWORD PUBLIC ... и пр. объявления сегментов, если сегмент всего один, начинается с 0 и размером 2^32? Какую роль играют эти псевдо-сегменты? Только попрошу ногами не бить, или хотябы ткнуть в то место, где об этом можно прочитать.
2
04 мая 2005 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by neutrino4
Известно, что win32 использует плоскую модель памяти, т.е. отсутствует понятие сегмента (как в DOS, и соотв. не нужны регистры CS, DS, SS и пр., в которые записавались начала соотв. сегментов). Значит, все ячейки памяти (будь то данные, команды или стэк) адресуются на прямую, путем указания их относительного виртуального адреса в запускаемом образе. Зачем тогда в коде программ нужны все эти _TEXT SEGMENT DWORD PUBLIC ... и пр. объявления сегментов, если сегмент всего один, начинается с 0 и размером 2^32? Какую роль играют эти псевдо-сегменты? Только попрошу ногами не бить, или хотябы ткнуть в то место, где об этом можно прочитать.


сегменты существуют все равно. это сегменты кода, данных, стека... процессору безразлично, какую логическую нагрузку несут получаемые из ОЗУ данные. поэтому при компоновке исполняемого файла необходимо указать ОС, где у нас код, где данные и т. п. прочитайте описание формата PE (например у Юрова в книге "Ассеблер. специалбный справочник")

1.8K
05 мая 2005 года
neutrino4
94 / / 05.09.2003
Цитата:
Originally posted by squirL
сегменты существуют все равно. это сегменты кода, данных, стека... процессору безразлично, какую логическую нагрузку несут получаемые из ОЗУ данные. поэтому при компоновке исполняемого файла необходимо указать ОС, где у нас код, где данные и т. п. прочитайте описание формата PE (например у Юрова в книге "Ассеблер. специалбный справочник")



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

279
06 мая 2005 года
bave
456 / / 07.03.2004
В зашишённом режиме организация памяти вполне
может быть сегментной, только адреса сегментов
хранят дескрипторы, размеры и начало сегментов
задаются полями base и limit. А вот роль
сегментных регистров при этом я сам не очень понимаю, может они используются для адресации
таблиц дескрипторов, да и если не они то кто же...
255
06 мая 2005 года
Dart Bobr
1.4K / / 09.04.2004
Читай уроки Iczelion'а, там по-моему про єто написано.
2
06 мая 2005 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by bave
В зашишённом режиме организация памяти вполне
может быть сегментной, только адреса сегментов
хранят дескрипторы, размеры и начало сегментов
задаются полями base и limit. А вот роль
сегментных регистров при этом я сам не очень понимаю, может они используются для адресации
таблиц дескрипторов, да и если не они то кто же...



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

279
06 мая 2005 года
bave
456 / / 07.03.2004
Как же так дескрипторы не используются в
зашищённом режиме - в чём же тогда его зашишённость. Поему как раз и в зашишённом
режиме при сегментной и при страничной организации
памяти используются 8 байтные дескрипторы,
структуру его я на память сказать не могу,
но в ней есть бит, который как раз и определяет,
размер памяти в страницах или байтах.
487
06 мая 2005 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by bave
Как же так дескрипторы не используются в
зашищённом режиме - в чём же тогда его зашишённость. Поему как раз и в зашишённом
режиме при сегментной и при страничной организации
памяти используются 8 байтные дескрипторы,
структуру его я на память сказать не могу,
но в ней есть бит, который как раз и определяет,
размер памяти в страницах или байтах.



Ежу понятно что ипользуются. Причем практически также как и в DOS. Только не как пара сегмент:смещение а как селектор:смещение. Таким образом никто тебе не мешает для кода использовать один селектор (в cs) а для стека другой (в ss). Просто в виндах адресное пространство одного PE-шника болтается в одном селекторе. И сегментные регистры вступают в силу только на уровне межселекторных (они же far) вызовах - ну и активно юзаются ядром и дровами. Кстати - ежели мне не изменяет память - то SEH болтается как раз в отдельном селекторе на который настроен fs.

279
06 мая 2005 года
bave
456 / / 07.03.2004
Эх, проклятье, как много мне ещё предстоит учить... .
2
07 мая 2005 года
squirL
5.6K / / 13.08.2003
распишу подробнее... извините, что позно.
кстати, я написал ерунду, а никто не поправил:
Цитата:
таблицы дескрипторов не используються


на самом деле я спутал с таблицами страниц, каюсь.
при сегментной адресации ЗР в сs хранится селектор дескриптора, который указывает на элемент таблицы LDT или GDT. из данных таблиц извлекается дескриптор сегмента и складывается со смещением, образуя линейный адрес, он же (для сегментной адресации) и физический. а вот при страничной организации - из линейного адреса еще извлекаются PDE (10 бит)- указатель на элемент каталога таблиц страниц, и PTE (10 бит) - указатель на элемент таблицы страниц. PDE выбирает определенный элемент ТС, потом PTE из этой таблицы выбирает конкретную страницу. потом адрес начала страницы складывается со 12 битным смещением (из линейного адреса) и (ура!) получается физический адрес.

Цитата:
Эх, проклятье, как много мне ещё предстоит учить...


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

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог