Что значат те или иные значения в сегментных регистрах? Например я знаю, что регистр Cs содержит в себе 0x23 если процессора исполняет 32 битные инструкции, если 0x33, то 64 битные инструкции. С остальными регистрами не понятно, в Ds, ss, es и т.д содержатся не нулевые значения, так вот, что они значат? А ещё, что это за вторая 8 байтоваячасть у сегментных регистрах?
Felther, читай Статья Коцит'a (R71MT/Marylin) Память компьютера WASM.IN → WASM.BOOKS и WASM.BLOGS → Ссылки на статьи Коцит'a. Там есть несколько статей о механизме памяти WASM.IN → Публикации → Цикл Broken Sword'a "Процессор Intel в защищенном режиме #1 - #13" WASM.ARTICLES → "Сказки дядюшки Римуса о x64" → Глава сорок девятая. Память Братца Кролика С нами Google, Yandex и кнопка "Поиск" на WASM.IN...
Mikl___, прочитал, то что вы скинули и все равно многое не понятно. 1. Я так понял, что в win физическая память делится на сегменты, ну не сегменты, а я так понял это просто 1 сегмент с 0 адреса физической памяти до FFFFFFFF. Так вот в процессах x32, если например селектор сегментного регистра CS равен 0x1B, то это значит он указывает на дескриптор в таблице дескрипторов GDT. И фактически этот дескриптор должен содержать базу 0, а лимит 0xFFFFFFFF. Ну и не только с Cs, а касается всех сегментных регистров кроме fs, ну и gs для x64(хотя я не понял почему fs сегментный регистр в остальных 8 байтах, содержит виртуальный адрес, там же должна быть база сегмента и лимит). Я правильно понимаю как это работает?) --- Сообщение объединено, 3 июн 2022 --- Mikl___, 2) на счёт прикреплённого фото. В первой ссылке которую вы скинули говорится, что логический адрес в процессе, это сегмент:смещение. Ну так вот возьмём для примера ситуацию, когда процессор исполняет инструкцию по адресу в виртуальной памяти Cs:400000. Так вот на этом изображении сверху есть Logical address. Ну то есть я тут понимаю, что Segment Selector, это Cs, а offset это 400000. Так... Процессор пошел строить адрес, он взял селектор и по нему нашел дескриптор, который говорит, что данный сегмент находится по адресу 0 в физической памяти а лимит его FFFFFFFF. Ну получил он эти данные, что это за стрелки на изображении которые дальше ведут в ленейное адресное пространство. И как из него получается линейный адрес?
Не в физической, а в виртуальной. Далее этот виртуальный (линейный) адрес транслируется с помощью механизма страниц в адрес в физической памяти.
То есть вы хотите сказать, когда создаётся 4гб виртуальное адресное пространство для процесса, то в таблицу дискрипторов(GDT) заносится 0 база, FFFFFFFF лимит ну и флаги разные(я думаю ничего не заносится, потому что селекторы во всех процессах одинаковые, например какой процесс я бы не открыл, во всех регистрах cs содержится одно и тоже значение), так этот 0 в GDT выходит указывает вначало адресного пространства процесса? То есть ту область которая просто зарезервирована для выявления нулевых указателей? Но зачем? --- Сообщение объединено, 3 июн 2022 --- Этот виртуальный(линейный адрес) получился так: база сегмента полученная из дескриптора(то есть 0, по моему примеру Cs:00400000) + смещение(по примеру 00400000). Получился виртуальный(линейный) адресс 00400000. Ведь так? Если смотреть на прикрепленные мной изображения выше, то фактически этот виртуальный(линейный) адрес находится в "линейном адресном пространстве"? А как транслируется этот виртуальный адрес через механизм страниц? Понятно, что формируется линейный адрес(мда ещё один линейный), тот линейный в котором 10 бит на каталог ещё 10 на таблицу страниц и 12 на оффсет в странице. Например если процессор хочет выполнить инструкцию по виртуальному адресу 00400001(то есть будем считать, что процессор уже до этого момента загрузил страницу из образа файла на диске в озу и изменил в таблице страниц местоположение физической памяти). Так вот после того как он получит виртуальный(линейный) адрес 00400001, то как он дальше найдет в таблице страниц нужный дескриптор?
Сегментный регистр в общем случае это всего лишь дополнительные биты полю адреса. Страшно актуально для 8- и 16-битных систем, без расширения адреса там совсем грустно с размером адресного пространства. В 32-битных вендах мало того, что по прямому назначению сегментные регистры не используются, так еще в юзермоде фактически отчекрыжили от адреса один старший бит.
"0 база, FFFFFFFF лимит" - вы не точны. 32-х максимальный лимит 20бит соотв. FFFFF. Совет: разделить и въехать в процессор как "железку," а что там Win или другая ОС уже потом.
Чтобы избавиться от неудобной сегментной модели памяти и дать всем одинаковое "плоское" адресное пространство с одномерной адресацией (смещением). Это уже не чисто аппаратное решение, а аппаратно-программное. Ядро дает процессору необходимую таблицу трансляции, соответствующую текущему активному контексту.
Так в ядре же тоже, только старший бит наоборот должен быть включен --- Сообщение объединено, 4 июн 2022 --- Почему это я не прав? Я же сказал лимит FFFFFFFF имя ввиду байты. А вы говорите FFFFF страниц. У нас же в дескрипторе будет включен G бит, поэтому FFFFF умножится на размер страницы получим FFFFFFFF байт
^^^"вы НЕ ТОЧНЫ", "железо" не понимает "имя ввиду". FFFFF * (4kByte=1000h) = FFFFF000h и нулевая страница. Вы мыслите как человек, а я посоветовал "мыслить" как процессор. Т.Е. при "будет включен G бит" следует иметь ввиду страницы.