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

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

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

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

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

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 и модель с плоской памятью для получения более подробной информации.

  • Добавлена ​​поддержка i386 для вина, теперь она удалена. Я не могу удалить архитектуру
  • много времени, проведенного в intel_idle
  • Linux: расположение в памяти initramfs
  • Что определяет, является ли прерывание IO-APIC-краем или IO-APIC-уровнем?
  • bash: ./idaq: Нет такого файла или каталога
  • Установка GRUB с нуля
  • Почему в моей системе отображается только 3,2 гигабайта ОЗУ, когда у меня определенно есть 4,0 ГБ
  • Есть ли команда или метод (кроме RTFM), чтобы определить, есть ли в BIOS UEFI BIOS?
  • Какую архитектуру процессора Fedora выбрать? i386 или i686?
  • Ubuntu 10.04 на 64-битной
  • Как запустить Ubilinux / u-boot под qemu (x86)
  • Сколько колец использует OpenBSD?
  • Linux и Unix - лучшая ОС в мире.