Как сегмент данных x86 используется в реальных операционных системах и процессах?

Я программировал программы x86 asm (загрузчики) в реальном режиме, и я знаю, как использовать сегменты, регистры и тому подобное.

Из отладчиков, таких как OllyDbg и им подобных, я вижу, что регистры DS, SS и т. д., очевидно, используются... но как их используют обычные "Windows-подобные" процессы? Я знаю, что частично используется сегментация (просто для того, чтобы отделить кольцо 0 от кольца 3) и что их записи находятся в GDT, я знаю, что задействован пейджинг, и это полностью испортило бы адреса с PDE и PTE, но я не могу «связать». " все вместе и понять, что такое дополнительные сегменты стека данных.. каждый процесс имеет разные DS / SS / ES?


person Johnny Pauling    schedule 06.10.2012    source источник
comment
Если ты know how to use segments, registers and stuff like that, то что ты can't quite "link" together и как не understand what data stack extra segments are all about? Каков твой вопрос? Это "does each process have a different DS/SS/ES?"?   -  person Alexey Frunze    schedule 06.10.2012
comment
У меня много путаницы, потому что в реальном режиме вы просто используете режим адресации сегмент + смещение для адресации памяти, когда-то в защищенной памяти, которая изменяется при подкачке. Имеет ли каждый процесс в пространстве пользователя разные DS/SS/ES? Изменяется ли он в режиме ядра или остается таким же?   -  person Johnny Pauling    schedule 06.10.2012


Ответы (2)


Из СПРАВОЧНОГО РУКОВОДСТВА ПО ПРОГРАММИСТУ INTEL 80386 1986:

Figure 5-1.  Address Translation Overview

             15           0      31                           0
    LOGICAL ╔═══════════════╗   ╔══════════════════════════════╗
    ADDRESS ║    SELECTOR   ║   ║            OFFSET            ║
            ╚═══════════╤═══╝   ╚═══╤══════════════════════════╝
                        v           v
                     ╔══════════════════════════════╗
                     ║     SEGMENT TRANSLATION      ║
                     ╚══════════════╤═══════════════╝
                                 ╔══╧═╗       PAGING ENABLED
                                 ║PG ?╟────────────────────┐
                                 ╚══╤═╝                    │
                   31        PAGING v DISABLED       0     │
          LINEAR  ╔═══════════╦═══════════╦═══════════╗    │
          ADDRESS ║    DIR    ║   PAGE    ║  OFFSET   ║    │
                  ╚═══════════╩═════╤═════╩═══════════╝    │
                                    v                      │
                     ╔══════════════════════════════╗      │
                     ║       PAGE TRANSLATION       ║      │
                     ╚══════════════╤═══════════════╝      │
                                    │<─────────────────────┘
                      31            v              0
            PHYSICAL ╔══════════════════════════════╗
            ADDRESS  ║                              ║
                     ╚══════════════════════════════╝


Figure 5-2.  Segment Translation

           15              0    31                                   0
  LOGICAL ╔════════════════╗   ╔═════════════════════════════════════╗
  ADDRESS ║    SELECTOR    ║   ║                OFFSET               ║
          ╚═══╤═════════╤══╝   ╚═══════════════════╤═════════════════╝
       ┌──────┘         v                          │
       │ DESCRIPTOR TABLE                          │
       │  ╔════════════╗                           │
       │  ║            ║                           │
       │  ║            ║                           │
       │  ║            ║                           │
       │  ║            ║                           │
       │  ╠════════════╣                           │
       │  ║  SEGMENT   ║ BASE          ╔═══╗       │
       └─>║ DESCRIPTOR ╟──────────────>║ + ║<──────┘
          ╠════════════╣ ADDRESS       ╚═╤═╝
          ║            ║                 │
          ╚════════════╝                 │
                                         v
              LINEAR  ╔════════════╦═══════════╦══════════════╗
              ADDRESS ║    DIR     ║   PAGE    ║    OFFSET    ║
                      ╚════════════╩═══════════╩══════════════╝

В Windows DS=ES=SS в большинстве процессов в большинстве случаев, а значения CS и DS являются общими для всех процессов. Процессы могут изменять свои сегментные регистры, но это редко требуется, поэтому большую часть времени вы будете видеть один и тот же набор значений CS и DS/ES/SS. Ядро использует свои собственные CS и DS.

person Alexey Frunze    schedule 06.10.2012
comment
Спасибо за вашу помощь и за прекрасное ASCII-искусство! - person Johnny Pauling; 06.10.2012

Обычно как в защищенном режиме x86, так и в длинном режиме x86-64 сегментация практически не используется (плоская модель памяти). Существует четыре основных дескриптора сегмента, каждый из которых обеспечивает доступ ко всему адресному пространству: код кольца 0, данные кольца 0, код кольца 3, данные кольца 3. Защита памяти осуществляется с помощью подкачки. Таким образом, в целом всем процессам присваиваются одинаковые значения CS, DS, SS, ES.

Обратите внимание, что некоторые операционные системы используют сегменты FS и GS при адресации локальных данных, например TIB в Windows .

Стоит также отметить, что в то время как в защищенном режиме x86 такое поведение является необязательным, и ядро ​​может свободно использовать несколько сегментов для защиты памяти, в длинном режиме x86-64 сегментация обычно отключена, и операционная система вынуждена использовать плоскую модель памяти (хотя это по-прежнему может использовать FS и GS для адресации локальных данных и структур операционной системы).

Вы также можете проверить этот бесценный источник информации об архитектуре x86 и x86-64: Intel Manual 3A (раздел 3.2 должен прояснить все ваши сомнения по поводу сегментации)

person Paweł Dziepak    schedule 06.10.2012
comment
Спасибо, что разъяснили мне это! - person Johnny Pauling; 06.10.2012