Какую роль играют сегментные регистры в процессах

Тема в разделе "WASM.WIN32", создана пользователем Felther, 31 май 2022.

  1. Felther

    Felther New Member

    Публикаций:
    0
    Регистрация:
    16 май 2022
    Сообщения:
    10
    Что значат те или иные значения в сегментных регистрах? Например я знаю, что регистр Cs содержит в себе 0x23 если процессора исполняет 32 битные инструкции, если 0x33, то 64 битные инструкции. С остальными регистрами не понятно, в Ds, ss, es и т.д содержатся не нулевые значения, так вот, что они значат? А ещё, что это за вторая 8 байтоваячасть у сегментных регистрах?
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.333
    Felther, читай [​IMG]
    1. Статья Коцит'a (R71MT/Marylin) Память компьютера
    2. WASM.IN WASM.BOOKS и WASM.BLOGS Ссылки на статьи Коцит'a. Там есть несколько статей о механизме памяти
    3. WASM.IN Публикации Цикл Broken Sword'a "Процессор Intel в защищенном режиме #1 - #13"
    4. WASM.ARTICLES "Сказки дядюшки Римуса о x64" Глава сорок девятая. Память Братца Кролика
    5. С нами Google, Yandex и кнопка "Поиск" на WASM.IN...
     
    TrashGen и Felther нравится это.
  3. Felther

    Felther New Member

    Публикаций:
    0
    Регистрация:
    16 май 2022
    Сообщения:
    10
    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. Ну получил он эти данные, что это за стрелки на изображении которые дальше ведут в ленейное адресное пространство. И как из него получается линейный адрес?
     

    Вложения:

    • Seg-and-Pag.png
      Seg-and-Pag.png
      Размер файла:
      32,5 КБ
      Просмотров:
      20
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.159
    Не в физической, а в виртуальной. Далее этот виртуальный (линейный) адрес транслируется с помощью механизма страниц в адрес в физической памяти.
     
  5. Felther

    Felther New Member

    Публикаций:
    0
    Регистрация:
    16 май 2022
    Сообщения:
    10
    То есть вы хотите сказать, когда создаётся 4гб виртуальное адресное пространство для процесса, то в таблицу дискрипторов(GDT) заносится 0 база, FFFFFFFF лимит ну и флаги разные(я думаю ничего не заносится, потому что селекторы во всех процессах одинаковые, например какой процесс я бы не открыл, во всех регистрах cs содержится одно и тоже значение), так этот 0 в GDT выходит указывает вначало адресного пространства процесса? То есть ту область которая просто зарезервирована для выявления нулевых указателей? Но зачем?
    --- Сообщение объединено, 3 июн 2022 ---
    Этот виртуальный(линейный адрес) получился так: база сегмента полученная из дескриптора(то есть 0, по моему примеру Cs:00400000) + смещение(по примеру 00400000). Получился виртуальный(линейный) адресс 00400000. Ведь так?
    Если смотреть на прикрепленные мной изображения выше, то фактически этот виртуальный(линейный) адрес находится в "линейном адресном пространстве"?
    А как транслируется этот виртуальный адрес через механизм страниц? Понятно, что формируется линейный адрес(мда ещё один линейный), тот линейный в котором 10 бит на каталог ещё 10 на таблицу страниц и 12 на оффсет в странице. Например если процессор хочет выполнить инструкцию по виртуальному адресу 00400001(то есть будем считать, что процессор уже до этого момента загрузил страницу из образа файла на диске в озу и изменил в таблице страниц местоположение физической памяти). Так вот после того как он получит виртуальный(линейный) адрес 00400001, то как он дальше найдет в таблице страниц нужный дескриптор?
     
  6. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.734
    Сегментный регистр в общем случае это всего лишь дополнительные биты полю адреса. Страшно актуально для 8- и 16-битных систем, без расширения адреса там совсем грустно с размером адресного пространства. В 32-битных вендах мало того, что по прямому назначению сегментные регистры не используются, так еще в юзермоде фактически отчекрыжили от адреса один старший бит.
     
    TrashGen и Mikl___ нравится это.
  7. R81...

    R81... Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    63
    "0 база, FFFFFFFF лимит" - вы не точны. 32-х максимальный лимит 20бит соотв. FFFFF. Совет: разделить и въехать в процессор как "железку," а что там Win или другая ОС уже потом.
     
    TrashGen и Mikl___ нравится это.
  8. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.159
    Чтобы избавиться от неудобной сегментной модели памяти и дать всем одинаковое "плоское" адресное пространство с одномерной адресацией (смещением).

    Это уже не чисто аппаратное решение, а аппаратно-программное. Ядро дает процессору необходимую таблицу трансляции, соответствующую текущему активному контексту.
     
    TrashGen и Mikl___ нравится это.
  9. Felther

    Felther New Member

    Публикаций:
    0
    Регистрация:
    16 май 2022
    Сообщения:
    10
    Так в ядре же тоже, только старший бит наоборот должен быть включен
    --- Сообщение объединено, 4 июн 2022 ---
    Почему это я не прав? Я же сказал лимит FFFFFFFF имя ввиду байты. А вы говорите FFFFF страниц. У нас же в дескрипторе будет включен G бит, поэтому FFFFF умножится на размер страницы получим FFFFFFFF байт
     
    Последнее редактирование: 4 июн 2022
  10. R81...

    R81... Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    63
    ^^^"вы НЕ ТОЧНЫ", "железо" не понимает "имя ввиду". FFFFF * (4kByte=1000h) = FFFFF000h и нулевая страница. Вы мыслите как человек, а я посоветовал "мыслить" как процессор. Т.Е. при "будет включен G бит" следует иметь ввиду страницы.