Сегментация в Linux: Сегментация и разбиение на страницы являются избыточными? - PullRequest
5 голосов
/ 12 июня 2010

Я читаю "Понимание ядра Linux".Это фрагмент, который объясняет, как Linux использует сегментацию, которую я не понимал.

Сегментация включена в микропроцессоры 80 x 86, чтобы программисты разделяли свои приложения на логически связанные объекты, такие как подпрограммыили глобальные и локальные области данных.Однако Linux использует сегментацию очень ограниченным образом. На самом деле сегментация и разбиение по страницам несколько избыточны , потому что оба могут использоваться для разделения физических адресных пространств процессов: сегментация может назначать различное линейное адресное пространство каждому процессу, в то время как подкачка может отображать один и тот же линейный адреспространство в разные физические адресные пространства.Linux предпочитает сегментацию подкачки по следующим причинам:

Управление памятью проще, когда все процессы используют одинаковые значения регистров сегмента, то есть когда они совместно используют один и тот же набор линейных адресов.

Один изЦели разработки Linux - переносимость на широкий спектр архитектур;В частности, архитектуры RISC имеют ограниченную поддержку сегментации.

Все процессы Linux, работающие в режиме пользователя, используют одну и ту же пару сегментов для адресации инструкций и данных.Эти сегменты называются сегментом пользовательского кода и сегментом пользовательских данных соответственно.Аналогично, все процессы Linux, работающие в режиме ядра, используют одну и ту же пару сегментов для адресации инструкций и данных: они называются сегментом кода ядра и сегментом данных ядра соответственно.Таблица 2-3 показывает значения полей дескриптора сегмента для этих четырех важных сегментов.

Я не могу понять 1-й и последний абзац.

Ответы [ 5 ]

7 голосов
/ 12 июня 2010

Семейство процессоров 80x86 генерирует реальный адрес, добавляя содержимое регистра ЦП, называемого сегментным регистром, к регистру счетчика программ.Таким образом, изменяя содержимое регистра сегмента, вы можете изменить физические адреса, к которым обращается программа.Пейджинг делает нечто похожее, сопоставляя один и тот же виртуальный адрес с разными реальными адресами.В Linux используется последнее - сегментные регистры для процессов Linux всегда будут иметь одинаковое неизменное содержимое.

6 голосов
/ 15 августа 2014

Сегментация и разбиение по страницам вовсе не являются избыточными.ОС Linux полностью включает в себя разбиение на страницы по требованию, но не использует сегментацию памяти.Это дает всем задачам плоское, линейное, виртуальное адресное пространство 32/64 бит.

Пейджинг добавляет еще один уровень абстракции к трансляции адресов памяти.С помощью подкачки линейные адреса памяти отображаются на страницах памяти, а не переводятся непосредственно в физическую память.Поскольку страницы могут быть выгружены из физической ОЗУ и из нее, подкачка позволяет выделять больше памяти, чем физически доступно.Только страницы, которые активно используются, должны быть отображены в физической памяти.

Альтернативой перестановке страниц является перестановка сегментов, но, как правило, она гораздо менее эффективна, поскольку сегменты обычно больше страниц.

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

32-разрядные процессоры не имеют бита режима для отключения сегментации, но тот же эффект можетдостигается путем сопоставления стека, кода и пространств данных с одним и тем же диапазоном линейных адресов.32-разрядные смещения, используемые инструкциями 32-разрядных процессоров, могут охватывать четырех гигабайтное линейное адресное пространство.

Кроме того, документация Intel гласит:

Плоская модельбез подкачки минимально требуется GDT с одним кодом и одним дескриптором сегмента данных.Нулевой дескриптор в первой записи GDT также требуется.Плоская модель с поисковым вызовом может предоставлять код и дескрипторы данных для режима супервизора и другой набор кодов и дескрипторов данных для режима пользователя

Это причина наличия одной пары CS / DS для привилегий ядравыполнение (кольцо 0) и одна пара CS / DS для выполнения привилегий пользователя (кольцо 3).

Описание: Сегментация обеспечивает средства для изоляции и защиты разделов памяти.Пейджинг предоставляет возможность выделить больше памяти, чем физически доступно.

3 голосов
/ 23 июня 2010

Windows использует сегмент fs для хранения локальных потоков.Следовательно, wine должен использовать его, а ядро ​​linux должно поддерживать его.

2 голосов
/ 23 июня 2010

Intel сначала добавила сегментацию на 80286, а затем подкачку на 80386. Unix-подобные ОС обычно используют подкачку для виртуальной памяти.

В любом случае, поскольку подкачка на x86 до недавнего времени не поддерживала разрешения на выполнение, OpenWall Linux использовал сегментацию для предоставления неисполнимых областей стека, т. Е. Устанавливал лимит сегмента кода на меньшее значение, чем ограничения другого сегмента, и делал эмуляция для поддержки батутов в стеке.

1 голос
/ 12 июня 2010

Современные операционные системы (например, Linux, другие Unixen, Windows NT и т. Д.) Не используют средства сегментации, предоставляемые процессором x86. Вместо этого они используют плоскую 32-битную модель памяти. Каждый процесс пользовательского режима имеет собственное 32-битное виртуальное адресное пространство.

(Естественно, ширина увеличивается до 64 бит в системах x86_64)

...