Почему сегменты данных и кода полностью перекрываются в Linux?

Контекст: я читаю «Понимание ядра Linux, 3d ed», в котором используется ядро ​​2.6.11.

Вопрос: Насколько я понимаю, физический адрес получается путем перевода линейного адреса, который получается путем перевода логического адреса. Логический адрес состоит из селектора сегментов, который идентифицирует сегмент в таблице описания

Таблица глобального описания Linux включает в себя, среди прочих сегментов, код пользователя и сегмент данных. Но базовый адрес обоих сегментов равен 0x0 , а их размер тоже один и тот же. Поэтому они полностью перекрываются. Как я понимаю, логический адрес cs + offset идентичен логическому адресу ds + offset , где cs и ds – регистры CPU, которые удерживают соответственно селектор сегмента кода и селектор сегмента данных. Я думаю, что это так, потому что оба сегмента имеют одинаковый базовый адрес, который увеличивается с помощью смещения, чтобы получить линейный адрес.

Если это так, и оба они сопоставляются с одним и тем же линейным адресом, не отображаются ли они на один и тот же физический адрес? Если да, то в чем заключается использование отдельных регистров cs и ds ?

  • Открытие устройства TUN из QEmu x86 для ARMv7 не выполняется
  • Запуск двоичных файлов X86 на armv7
  • Ubuntu 10.04 на 64-битной
  • Включите систему с помощью USB-клавиатуры?
  • Найти альтернативу для Debian 5 для работы с большими файлами
  • как напрямую управлять динамиком ПК в Linux
  • Неожиданный процессор / ядро ​​подсчитывает процессор AMD
  • Использование ABI_X86 в Gentoo
  • One Solution collect form web for “Почему сегменты данных и кода полностью перекрываются в Linux?”

    Регистры сегментации являются наследием с первых дней процессоров x86, когда offset не было достаточно большим, чтобы адресовать всю память, к которой может обращаться процессор. Первоначальный 8086 имел 20-битное адресное пространство, но мог использовать только 16-битное смещение. Вы должны были использовать регистры сегментов, чтобы указать, какое из 64 КБ адресного пространства 1024 КБ вы хотели. Регистры сегментов были эффективными 20-битными регистрами, в которых наименьшие 4 бита были вынуждены равны 0. Загрузка регистрового регистра установила верхние 16 бит регистра. Это позволило segment + offset для всего 20-битного адресного пространства.

    Регистры сегментов все еще существуют, но Linux устанавливает их в 0, поэтому он может притворяться, что они этого не делают. Современные процессоры x86 (то есть 80386 и новее) могут использовать смещение, достаточно большое, чтобы покрыть все их адресное пространство, что делает сегментирование памяти осложнением, которое больше не требуется. Прочитайте сегментирование памяти x86 и модель с плоской памятью для получения более подробной информации.

    Interesting Posts

    Скрыть или маску каталога для процесса на OS-X

    Экспортирование переменной, чтобы она появилась в скрипте, полученном через sudo

    Могу ли я фильтровать, как часто cron отправляет мне электронное письмо?

    есть ли какие-то символические ссылки, которые поддерживают перемещение или переименование целевого файла?

    Список файлов, добавленных и удаленных между сообщениями с тегами

    установить Open MPI на CentOS 6.8 "требуется ошибка компилятора C99"

    Как сделать звуковой сигнал для ПК

    Обновление ffmpeg

    Разрешение отклонено в файле aio-max-nr

    Отключить кэширование davfs2

    сценарий bash, который печатает использование процессора, дисковое пространство, использование ram

    Карта Super + в начало / конец

    Как установить и настроить внешний ленточный накопитель HP LTO-5 на сервер RHEL

    Как я могу сделать графические символы для вывода на экран терминала Debian 8?

    mdadm raid0 с дисками разного размера?

    Linux и Unix - лучшая ОС в мире.