redradist
Интересующийся
Offline
|
|
« : 09-02-2015 19:12 » |
|
Здраствуйте, давно когда начинал заниматься ассемблером не разобрался с одним вопросом ... начал заниматься программированием в другой сфере ... но проблема осталась ... Она представлена на изображении приведенном внизу: Меня мучает вопрос, при странично-сегментной адресации происходит первоначальное считывание данных из таблицы GDTR и LDTR тоже через страничное преобразование или в обход него методом прямого доступа к памяти ? Если методом страничного преобразования то тогда логически это понятно, но долго по времени получения физического адреса, а если в обход то как-то не логично получается ... Вот на этом нюансе и застопорился, а он принципиально важен для меня, в следствии желания более глубоко понять суть работы процессора !
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #1 : 10-02-2015 00:41 » |
|
Radikal как звучит, так и работает. Т.ч. остается только гадать.
Страничная система работает в PM и VM (ОС работает в PM). Работает не сама по себе — ей нужны таблицы страниц и каталогов и включенный бит управления страничным механизмом в CR0.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #2 : 10-02-2015 06:20 » |
|
Здраствуйте, давно когда начинал заниматься ассемблером не разобрался с одним вопросом ... начал заниматься программированием в другой сфере ... но проблема осталась ... Она представлена на изображении приведенном внизу:
Меня мучает вопрос, при странично-сегментной адресации происходит первоначальное считывание данных из таблицы GDTR и LDTR тоже через страничное преобразование или в обход него методом прямого доступа к памяти ? В регистр GDTR загружается физический адрес таблицы сегментов/системных объектов. И обычно до того, как включается страничное преобразование и начинается использование таблиц страниц.
|
|
|
Записан
|
|
|
|
redradist
Интересующийся
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
Молодой специалист
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
Интересующийся
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
Молодой специалист
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
Интересующийся
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
Молодой специалист
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
Интересующийся
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, имхо, нигде уже не используется. А почитать - любые книги по строению ОС, я тут на форуме как-то давал список - поищите по форуму. Начиная от Танненбаума, заканчивая Лавом, МакКузиком и Соломоном с Руссиновичем. Спасибо, понял ... Этот момент просто нигде не рассматривается поэтому надо было у кого-то спросить.
|
|
|
Записан
|
|
|
|
|