Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы понимания адресации в защищенном режиме !  (Прочитано 25273 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
redradist
Интересующийся

ua
Offline Offline

« : 09-02-2015 19:12 » 

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



Меня мучает вопрос, при странично-сегментной адресации происходит первоначальное считывание данных из таблицы GDTR и LDTR тоже через страничное преобразование или в обход него методом прямого доступа к памяти ? Если методом страничного преобразования то тогда логически это понятно, но долго по времени получения физического адреса, а если в обход то как-то не логично получается ... Вот на этом нюансе и застопорился, а он принципиально важен для меня, в следствии желания более глубоко понять суть работы процессора !
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 10-02-2015 00:41 » new

Radikal как звучит, так и работает. Т.ч. остается только гадать.

Страничная система работает в PM и VM (ОС работает в PM). Работает не сама по себе — ей нужны таблицы страниц и каталогов и включенный бит управления страничным механизмом в CR0.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #2 : 10-02-2015 06:20 » 

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

Меня мучает вопрос, при странично-сегментной адресации происходит первоначальное считывание данных из таблицы GDTR и LDTR тоже через страничное преобразование или в обход него методом прямого доступа к памяти ?
В регистр GDTR загружается физический адрес таблицы сегментов/системных объектов. И обычно до того, как включается страничное преобразование и начинается использование таблиц страниц.
Записан
redradist
Интересующийся

ua
Offline Offline

« Ответ #3 : 10-02-2015 08:51 » 

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

Меня мучает вопрос, при странично-сегментной адресации происходит первоначальное считывание данных из таблицы GDTR и LDTR тоже через страничное преобразование или в обход него методом прямого доступа к памяти ?
В регистр GDTR загружается физический адрес таблицы сегментов/системных объектов. И обычно до того, как включается страничное преобразование и начинается использование таблиц страниц.


Хорошо получается что загрузка GDT не маскируется страничным преобразованием, то есть не считывается через страничное преобразование ?
Это противоречит документации:
The GDT is not a segment itself; instead, it is a data structure in linear address space. (Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Volume 3A,3-21)

Как тогда понимать эту фразу, получается что перед получением линейного адреса происходит маскированое страничное считывание адреса из GDT потом из LDT (тоже маскированное страничным преобразованием), а потом полученный адрес еще раз проходит сртаничное преобразование Не понял? Я верно понял, ибо согласно документации, да ?

Добавлено через 1 минуту и 59 секунд:
Radikal как звучит, так и работает. Т.ч. остается только гадать.

Страничная система работает в PM и VM (ОС работает в PM). Работает не сама по себе — ей нужны таблицы страниц и каталогов и включенный бит управления страничным механизмом в CR0.


Это и так понятно, к чему этот ответ ?
« Последнее редактирование: 10-02-2015 08:53 от redradist » Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #4 : 10-02-2015 09:08 » 

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

Меня мучает вопрос, при странично-сегментной адресации происходит первоначальное считывание данных из таблицы GDTR и LDTR тоже через страничное преобразование или в обход него методом прямого доступа к памяти ?
В регистр GDTR загружается физический адрес таблицы сегментов/системных объектов. И обычно до того, как включается страничное преобразование и начинается использование таблиц страниц.


Хорошо получается что загрузка GDT не маскируется страничным преобразованием, то есть не считывается через страничное преобразование ?
Это противоречит документации:
The GDT is not a segment itself; instead, it is a data structure in linear address space. (Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Volume 3A,3-21)

Как тогда понимать эту фразу, получается что перед получением линейного адреса происходит маскированое страничное считывание адреса из GDT потом из LDT (тоже маскированное страничным преобразованием), а потом полученный адрес еще раз проходит сртаничное преобразование Не понял? Я верно понял, ибо согласно документации, да ?
Имхо, имеется в виду, что сама таблица к сегментам отношения не имеет, несмотря на понятия линейного адреса и предела.

Сорри, я Вам первоначально не правильно ответил - там таки линейный, виртуальный адрес. Который проходит преобразование через таблицу страниц. Так-что по команде LGDT вполне себе может быть сгенерировано исключение Page Fault - это если Вы уже в защищенном режиме с включенной страничной адресацией и в 0-вом кольце попытаетесь в команде LGDT указать несуществующий адрес (адрес, для которого нет страничного преобразования).
« Последнее редактирование: 10-02-2015 09:11 от darkelf » Записан
redradist
Интересующийся

ua
Offline Offline

« Ответ #5 : 10-02-2015 11:09 » 

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

Меня мучает вопрос, при странично-сегментной адресации происходит первоначальное считывание данных из таблицы GDTR и LDTR тоже через страничное преобразование или в обход него методом прямого доступа к памяти ?
В регистр GDTR загружается физический адрес таблицы сегментов/системных объектов. И обычно до того, как включается страничное преобразование и начинается использование таблиц страниц.


Хорошо получается что загрузка GDT не маскируется страничным преобразованием, то есть не считывается через страничное преобразование ?
Это противоречит документации:
The GDT is not a segment itself; instead, it is a data structure in linear address space. (Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Volume 3A,3-21)

Как тогда понимать эту фразу, получается что перед получением линейного адреса происходит маскированое страничное считывание адреса из GDT потом из LDT (тоже маскированное страничным преобразованием), а потом полученный адрес еще раз проходит сртаничное преобразование Не понял? Я верно понял, ибо согласно документации, да ?
Имхо, имеется в виду, что сама таблица к сегментам отношения не имеет, несмотря на понятия линейного адреса и предела.

Сорри, я Вам первоначально не правильно ответил - там таки линейный, виртуальный адрес. Который проходит преобразование через таблицу страниц. Так-что по команде LGDT вполне себе может быть сгенерировано исключение Page Fault - это если Вы уже в защищенном режиме с включенной страничной адресацией и в 0-вом кольце попытаетесь в команде LGDT указать несуществующий адрес (адрес, для которого нет страничного преобразования).

То есть как я понял, сама таблица GDT и LDT (для конкретного приложения) лежат в линейном адресном пространстве и спокойно могут быть замаскированны страничным преобразование ? Иными словами только операционной системе будет ведомо где лежит та самая GDT и LDT, их адреса тоже проходят страничное преобразование ? Если да то, тогда супер ... но только как-то долго по времени получается обращение к ячейкам памяти с таким подходом при первом обращении (
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #6 : 10-02-2015 11:37 » 

Имхо, имеется в виду, что сама таблица к сегментам отношения не имеет, несмотря на понятия линейного адреса и предела.

Сорри, я Вам первоначально не правильно ответил - там таки линейный, виртуальный адрес. Который проходит преобразование через таблицу страниц. Так-что по команде LGDT вполне себе может быть сгенерировано исключение Page Fault - это если Вы уже в защищенном режиме с включенной страничной адресацией и в 0-вом кольце попытаетесь в команде LGDT указать несуществующий адрес (адрес, для которого нет страничного преобразования).

То есть как я понял, сама таблица GDT и LDT (для конкретного приложения) лежат в линейном адресном пространстве и спокойно могут быть замаскированны страничным преобразование ? Иными словами только операционной системе будет ведомо где лежит та самая GDT и LDT, их адреса тоже проходят страничное преобразование ? Если да то, тогда супер ... но только как-то долго по времени получается обращение к ячейкам памяти с таким подходом при первом обращении (
GDT она на всю систему, а не для конкретного приложения. Сорри, я не совсем понимаю, что Вы имеете в виду под "могут быть замаскированны страничным преобразованием".

Только ОС и ведомо, где находится таблица. Прикладным программам это знание недоступно. В настоящее время к ней, таблице, не надо так часто обращаться - к ней обращаются в основном при загрузке сегментных регистров, что в современных ОС бывает не сильно часто. Реально почти во всех ОС используется FLAT-model - режим плоской памяти, при которой сегменты кодов и данных, как ядра, так и прикладного уровня, всегда фиксированы и отображают всё виртуальное пространство 4G (для процессоров 80386 и выше в 32-х битном режиме), соответственно перезагружать их смысла особо нет, разве что для поддержки Thread Local Storage (TLS), которая реализуется через спец.сегменты и к которым обращаются через FS/GS, как я понимаю.. Соответственно эти данные кешируются при загрузке сегментных регистров. Кроме того, есть такой аппаратный блок, как TLB, который позволяет избежать ненужных обращений уже к таблице страниц и соответственно к памяти.
« Последнее редактирование: 10-02-2015 11:41 от darkelf » Записан
redradist
Интересующийся

ua
Offline Offline

« Ответ #7 : 10-02-2015 12:18 » 

Имхо, имеется в виду, что сама таблица к сегментам отношения не имеет, несмотря на понятия линейного адреса и предела.

Сорри, я Вам первоначально не правильно ответил - там таки линейный, виртуальный адрес. Который проходит преобразование через таблицу страниц. Так-что по команде LGDT вполне себе может быть сгенерировано исключение Page Fault - это если Вы уже в защищенном режиме с включенной страничной адресацией и в 0-вом кольце попытаетесь в команде LGDT указать несуществующий адрес (адрес, для которого нет страничного преобразования).

То есть как я понял, сама таблица GDT и LDT (для конкретного приложения) лежат в линейном адресном пространстве и спокойно могут быть замаскированны страничным преобразование ? Иными словами только операционной системе будет ведомо где лежит та самая GDT и LDT, их адреса тоже проходят страничное преобразование ? Если да то, тогда супер ... но только как-то долго по времени получается обращение к ячейкам памяти с таким подходом при первом обращении (
GDT она на всю систему, а не для конкретного приложения. Сорри, я не совсем понимаю, что Вы имеете в виду под "могут быть замаскированны страничным преобразованием".

Только ОС и ведомо, где находится таблица. Прикладным программам это знание недоступно. В настоящее время к ней, таблице, не надо так часто обращаться - к ней обращаются в основном при загрузке сегментных регистров, что в современных ОС бывает не сильно часто. Реально почти во всех ОС используется FLAT-model - режим плоской памяти, при которой сегменты кодов и данных, как ядра, так и прикладного уровня, всегда фиксированы и отображают всё виртуальное пространство 4G (для процессоров 80386 и выше в 32-х битном режиме), соответственно перезагружать их смысла особо нет, разве что для поддержки Thread Local Storage (TLS), которая реализуется через спец.сегменты и к которым обращаются через FS/GS, как я понимаю.. Соответственно эти данные кешируются при загрузке сегментных регистров. Кроме того, есть такой аппаратный блок, как TLB, который позволяет избежать ненужных обращений уже к таблице страниц и соответственно к памяти.


Под маскированием я имею ввиду то, что при обращении к таблице GDT (по адресу в GDTR) или к таблице LDT (по программно-недоступному адресу в кэше регистра LDTR), обращение идет не к физическим адресам, а также эти адреса находятся в линейном адресном пространстве и проходят страничное преобразование. То есть чтобы получить адрес надо обратиться к LDT, а для этого к GDT и вот обращение к GDT тоже проходит через страничное преобразование, получает адрес LDT, далее через страничное преобразование получаем адрес в таблице LDT к некоторому пространству внутри линейного адресного пространства, а далее по этому адресу уже обращаемся к этому адресному пространству и опять проходит страничное преобразование, верно Не понял?
Единственное, как я понимаю при flat памяти обращение к LDT происходит не так часто ...
Я все правильно понимаю по принципу обращения процессора к памяти ?
И где можно почитать про модели памяти в операционках и для каких нужд используется та или иная модель памяти ?
То есть типа flat - для обычных приложений, сегментирован-страничная для потоков и т.д.
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #8 : 10-02-2015 12:50 » 

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

Только ОС и ведомо, где находится таблица. Прикладным программам это знание недоступно. В настоящее время к ней, таблице, не надо так часто обращаться - к ней обращаются в основном при загрузке сегментных регистров, что в современных ОС бывает не сильно часто. Реально почти во всех ОС используется FLAT-model - режим плоской памяти, при которой сегменты кодов и данных, как ядра, так и прикладного уровня, всегда фиксированы и отображают всё виртуальное пространство 4G (для процессоров 80386 и выше в 32-х битном режиме), соответственно перезагружать их смысла особо нет, разве что для поддержки Thread Local Storage (TLS), которая реализуется через спец.сегменты и к которым обращаются через FS/GS, как я понимаю.. Соответственно эти данные кешируются при загрузке сегментных регистров. Кроме того, есть такой аппаратный блок, как TLB, который позволяет избежать ненужных обращений уже к таблице страниц и соответственно к памяти.


Под маскированием я имею ввиду то, что при обращении к таблице GDT (по адресу в GDTR) или к таблице LDT (по программно-недоступному адресу в кэше регистра LDTR), обращение идет не к физическим адресам, а также эти адреса находятся в линейном адресном пространстве и проходят страничное преобразование. То есть чтобы получить адрес надо обратиться к LDT, а для этого к GDT и вот обращение к GDT тоже проходит через страничное преобразование, получает адрес LDT, далее через страничное преобразование получаем адрес в таблице LDT к некоторому пространству внутри линейного адресного пространства, а далее по этому адресу уже обращаемся к этому адресному пространству и опять проходит страничное преобразование, верно Не понял?
Единственное, как я понимаю при flat памяти обращение к LDT происходит не так часто ...
Я все правильно понимаю по принципу обращения процессора к памяти ?
И где можно почитать про модели памяти в операционках и для каких нужд используется та или иная модель памяти ?
То есть типа flat - для обычных приложений, сегментирован-страничная для потоков и т.д.
Как я понимаю, все обращения идут через GDT/LDT. Страничное преобразование происходит один раз.

При загрузке в сегментный регистр значения селектора параметры из таблицы GDT/LDT сохраняются в теневой части (предел, базовый адрес, флаги защиты). На этом этапе контролируется корректность данных в этом дескрипторе. Далее при обращении по какому-то адресу в этом сегменте берётся базовый адрес из этой теневой части, складывается с адресом (смещением) в команде и уже этот адрес идёт на пересчёт через страничное преобразование.

Про Flat-модель, имхо, она есть всегда, просто для потока дополнительно через FS/GS задаются базовые адреса уже в виртуальном пространстве пользователя, где находится его TLS. Для упрощения понимания, имхо, ими можно пренебречь, т.к. это такой hack для быстрого поиска этой области.

Сегментно-страничная организация, в том смысле, в котором её придумывал Intel, имхо, нигде уже не используется.

А почитать - любые книги по строению ОС, я тут на форуме как-то давал список - поищите по форуму. Начиная от Танненбаума, заканчивая Лавом, МакКузиком и Соломоном с Руссиновичем.
« Последнее редактирование: 10-02-2015 12:52 от darkelf » Записан
redradist
Интересующийся

ua
Offline Offline

« Ответ #9 : 10-02-2015 15:24 » 

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

Только ОС и ведомо, где находится таблица. Прикладным программам это знание недоступно. В настоящее время к ней, таблице, не надо так часто обращаться - к ней обращаются в основном при загрузке сегментных регистров, что в современных ОС бывает не сильно часто. Реально почти во всех ОС используется FLAT-model - режим плоской памяти, при которой сегменты кодов и данных, как ядра, так и прикладного уровня, всегда фиксированы и отображают всё виртуальное пространство 4G (для процессоров 80386 и выше в 32-х битном режиме), соответственно перезагружать их смысла особо нет, разве что для поддержки Thread Local Storage (TLS), которая реализуется через спец.сегменты и к которым обращаются через FS/GS, как я понимаю.. Соответственно эти данные кешируются при загрузке сегментных регистров. Кроме того, есть такой аппаратный блок, как TLB, который позволяет избежать ненужных обращений уже к таблице страниц и соответственно к памяти.


Под маскированием я имею ввиду то, что при обращении к таблице GDT (по адресу в GDTR) или к таблице LDT (по программно-недоступному адресу в кэше регистра LDTR), обращение идет не к физическим адресам, а также эти адреса находятся в линейном адресном пространстве и проходят страничное преобразование. То есть чтобы получить адрес надо обратиться к LDT, а для этого к GDT и вот обращение к GDT тоже проходит через страничное преобразование, получает адрес LDT, далее через страничное преобразование получаем адрес в таблице LDT к некоторому пространству внутри линейного адресного пространства, а далее по этому адресу уже обращаемся к этому адресному пространству и опять проходит страничное преобразование, верно Не понял?
Единственное, как я понимаю при flat памяти обращение к LDT происходит не так часто ...
Я все правильно понимаю по принципу обращения процессора к памяти ?
И где можно почитать про модели памяти в операционках и для каких нужд используется та или иная модель памяти ?
То есть типа flat - для обычных приложений, сегментирован-страничная для потоков и т.д.
Как я понимаю, все обращения идут через GDT/LDT. Страничное преобразование происходит один раз.

При загрузке в сегментный регистр значения селектора параметры из таблицы GDT/LDT сохраняются в теневой части (предел, базовый адрес, флаги защиты). На этом этапе контролируется корректность данных в этом дескрипторе. Далее при обращении по какому-то адресу в этом сегменте берётся базовый адрес из этой теневой части, складывается с адресом (смещением) в команде и уже этот адрес идёт на пересчёт через страничное преобразование.

Про Flat-модель, имхо, она есть всегда, просто для потока дополнительно через FS/GS задаются базовые адреса уже в виртуальном пространстве пользователя, где находится его TLS. Для упрощения понимания, имхо, ими можно пренебречь, т.к. это такой hack для быстрого поиска этой области.

Сегментно-страничная организация, в том смысле, в котором её придумывал Intel, имхо, нигде уже не используется.

А почитать - любые книги по строению ОС, я тут на форуме как-то давал список - поищите по форуму. Начиная от Танненбаума, заканчивая Лавом, МакКузиком и Соломоном с Руссиновичем.

Спасибо, понял ... Этот момент просто нигде не рассматривается поэтому надо было у кого-то спросить.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines