Сегментация памяти в современных ОС: зачем вам 4 сегмента?

Из википедии:

«Сегментацию нельзя отключить на процессорах x86, поэтому многие операционные системы используют плоскую модель памяти, чтобы сделать сегментацию незаметной для программ. Например, ядро ​​Linux устанавливает только 4 сегмента»

Я имею в виду, что поскольку о защите уже заботится подсистема виртуальной памяти (у PTE есть бит защиты), зачем вам 4 сегмента (вместо 2: то есть данные/код с DPL 3, поскольку вы можете выполнять код, находящийся в более низком привилегированном сегменте? )?

Спасибо.


person Community    schedule 30.07.2009    source источник


Ответы (2)


Вы недостаточно процитировали ту страницу википедии, где описаны четыре сегмента и почему все они нужный...

Однако обычно используются подразумеваемые сегменты. Все выборки инструкций происходят из сегмента кода в регистре CS. Большинство ссылок на память поступают из сегмента данных в регистре DS. Ссылки на стек процессора либо неявно (например, инструкции push и pop), либо явно (доступ к памяти с использованием регистров ESP или (E)BP) используют сегмент стека в регистре SS. Наконец, строковые инструкции (например, stos, movs) также используют дополнительный сегмент ES.

Поэтому, если вы хотите настроить плоскую модель, в которой программистам не нужно думать о сегментации, вам нужно настроить все четыре сегментных регистра (CS, DS, SS, ES) на одну и ту же базу. Тогда адреса, вычисленные относительно всех четырех, эквивалентны.

На этой странице показан пример, когда для всех четырех установлено значение base=0, limit=4Gb.

person John M    schedule 30.07.2009
comment
Это не ответ на мой вопрос. Способ, которым сегментация реализована в защищенном режиме, представляет собой таблицу косвенности (т. е. GDT/LDT), поэтому вы все равно можете настроить 2 сегмента и иметь 2 регистра, указывающих на одну и ту же запись в таблице... - person ; 30.07.2009
comment
Вам пришлось бы проделать дополнительную работу, чтобы избежать неявных ссылок на сегменты, если бы у вас не было действительных настроек для всех 4. Если бы у вас были настроены только CS и DS, вам нужно было бы использовать префикс переопределения сегмента для инструкций, где SS и ES используются неявно. Так что гораздо проще просто настроить все 4 одинаково. Тогда вы можете забыть о существовании сегментации. Я достаточно заржавел на своем x86, поэтому я, вероятно, упустил какой-то случай, когда даже использование префиксов переопределения вызовет больше проблем. Зачем вообще открывать эту банку с червями? Что за трудность настроить все 4? - person John M; 20.05.2010

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

person MSN    schedule 30.07.2009
comment
Это правильный ответ. Другой ответ неправильно фокусируется на регистрах сегмента, а не на самих сегментах. (И он пропускает 2 из 6 сегментных регистров, FS и GS). Сегменты существуют в GDT и LDT. - person MSalters; 25.04.2012