Помогите разобраться с адресацией IA-32

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
redradist
Сообщения: 4
Зарегистрирован: 01 июл 2013, 20:17

01 июл 2013, 20:58

Вопрос в следующем: если процессор в защищенном режим без страничного преобразования, то все понятно ... Происходит первоначальное считывания дескриптора с таблицы дескрипторов адрес которой хранится в регистрах GDTR или LDTR, и процессор по этим адресам (GDTR или LDTR) напрямую обращается в память.
А вот при включенном страничном преобразовании не совсем все понятно ... Адреса таблиц дескрипторов GDTR и LDTR проходят страничное преобразование при считывании дескрипторов с памяти, так как страничная адресация работает на более низком уровне чем адресация по дескриптору ??? или по ним напрямую обращаются к памяти в обход страничного преобразования для считывания дискриптора ????????
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

02 июл 2013, 09:50

Все регистры (GDTR, LDTR, IDTR, PDBR) задают базовые физические адреса каталогов и дескрипторов. А уже базовые адреса из дескрипторов участвуют в формировании линейного адреса. А затем линейный адрес транслируется в физический напрямую, либо минуя страничное преобразование. В последнем случае, присутствует так называемая "объединенная сегментно-страничная трансляция адреса", которая, если не ошибаюсь, используется в современных ОС. То есть, отвечая на ваш вопрос: адреса GDT и LDT, заданные в регистрах, не транслируются.
It's a long way to the top if you wanna rock'n'roll
redradist
Сообщения: 4
Зарегистрирован: 01 июл 2013, 20:17

02 июл 2013, 11:45

То есть в защищенном режиме, при включенной страничной адресации, обращение к физической памяти происходит дважды ... ???
Сначала считывается адрес из таблицы дескрипторов по физическому адресу GDTR или LDTR, затем этот адрес участвует в образовании линейного адреса, а потом по нему происходит страничное преобразование и по адресу из страничного преобразования прыгаем на физический адрес интересующего куска данных ???
Правильно понял ?
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

02 июл 2013, 12:01

Сначала считывается адрес из таблицы дескрипторов по физическому адресу GDTR или LDTR,
Это происходит только в момент загрузки сегментного регистра. При изменении регистра берется его дискриптор из селектора, а "невидимая" часть загружается базовым адресом, лимитом и аттрибутом из дескриптора. То есть в дальнейшем при обращении к участку памяти, адресуемым этим регистром, обращений к GDT не поступает. Заместого этого идет обращение к сегментному регистру.
а потом по нему происходит страничное преобразование и по адресу из страничного преобразования прыгаем на физический адрес интересующего куска данных
А вот уже потом, да. Вы ошиблись в том, что каждый раз дескриптор из GDT не берется, а вся инфа хранится в сегментном регистре при перезагрузке селлектора (16-битной его части, которая в реальном режиме указывает базовый адрес)
It's a long way to the top if you wanna rock'n'roll
redradist
Сообщения: 4
Зарегистрирован: 01 июл 2013, 20:17

03 июл 2013, 01:38

Тогда получается что процесс обращения к памяти с помощью страничной адресации очень замедляет работу процессора ?
Процессор сначала обращается к таблице дескрипторов и считывает селектор: а так как он считывает не один адрес, а пакет, мы ждем + время задержки оперативной памяти, - далее по селектору из таблицы обращается к страницам, которые опять таки считываются с памяти, правда кэшируются (32 страницы), выбирают адрес из таблицы и потом уже по этому адресу обращаются к памяти.
Этот процесс первоначального запуска процесса занимает довольно приличное количество времени !!!
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

03 июл 2013, 09:45

1) Никак вы не поймете, что дескриптор сегмента берется только при изменении селектора, а при страничной (или странично-сегментной) организации памяти менять селлектор практически не имеет смысла. Ну разве что для удобства организации запущенных процессов и потоков.
2) Если помните, существуют три вида кеша в процессоре. Кеши L1 и L2 как раз и занимаются кешированием различных системных таблиц и каталогов. В том числе и каталога страниц. В CR3 есть специальный бит PCD, установка которого запрещает этот кеш. А при отключеной подкачке страниц кеши L1 и L2 освобождаются для других нужд. Нужно отметить, что скорость работы этих кешей значительно быстрее оперативной памяти и близка с скорости выполнения комманд над регистрами процессора. Поэтому никаких потерь в быстродействии не возникает, за исключением случаев, когда кеши переполняются, а это возникает лишь в активном использовании большого объема оперативной памяти.
It's a long way to the top if you wanna rock'n'roll
Ответить