LINUX.ORG.RU

История изменений

Исправление KivApple, (текущая версия) :

Только вот сегментная адресация нафиг никому не сдалась (к тому же существует только на x86), поэтому все нормальные ОС выставляют базу сегмента 0, а лимит - 4 ГБ (т. е. вся доступная память), что для кода, что для данных, а правами доступа управляют лишь с помощью страничной трансляции. Не, ну конечно для каких-то служебных структур (например, Task State Segment) могут создаваться сегменты с иными параметрами, однако приложению всегда доступен один сегмент кода и один сегмент данных, которые покрывают всё виртуальное адресное пространство. Собственно, именно они и загружены в сегментные регистры при старте приложения и никто их не меняет в здравом уме. А вот на x86_64 у всех обычных сегментов (то есть не каких-то системных структур процессора типа того же TSS) база принудительно 0 и лимит максимален, так что там даже нельзя ограничить доступные приложения адреса, иначе как страничной адресацией.

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

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

P.S.: Да, 32-битная винда (на 64 битах это просто не возможно) создаёт специальный небольшой сегмент со служебными данными приложения и помещает его селектор в сегментный регистр FS, однако это не отменяет того факта, что в CS, SS, DS и ES будут селекторы сегментов, покрывающих всё адресное пространство, а работать с данными, доступными через FS можно лишь ассемблерными вставками в особых случаях.

Исправление KivApple, :

Только вот сегментная адресация нафиг никому не сдалась (к тому же существует только на x86), поэтому все нормальные ОС выставляют базу сегмента 0, а лимит - 4 ГБ (т. е. вся доступная память), что для кода, что для данных, а правами доступа управляют лишь с помощью страничной трансляции. Не, ну конечно для каких-то служебных структур (например, Task State Segment) могут создаваться сегменты с иными параметрами, однако приложению всегда доступен один сегмент кода и один сегмент данных, которые покрывают всё виртуальное адресное пространство. Собственно, именно они и загружены в сегментные регистры при старте приложения и никто их не меняет в здравом уме. А вот на x86_64 у всех обычных сегментов (то есть не каких-то системных структур процессора типа того же TSS) база принудительно 0 и лимит максимален, так что там даже нельзя ограничить доступные приложения адреса, иначе как страничной адресацией.

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

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

Исходная версия KivApple, :

Только вот сегментная адресация нафиг никому не сдалась (к тому же существует только на x86), поэтому все нормальные ОС выставляют базу сегмента 0, а лимит - 4 ГБ (т. е. вся доступная память), что для кода, что для данных, а правами доступа управляют лишь с помощью страничной трансляции. Не, ну конечно для каких-то служебных структур (например, Task State Segment) могут создаваться сегменты с иными параметрами, однако приложению всегда доступен один сегмент кода и один сегмент данных, которые покрывают всё виртуальное адресное пространство. Собственно, именно они и загружены в сегментные регистры при старте приложения и никто их не меняет в здравом уме. А вот на x86_64 у всех обычных сегментов (то есть не каких-то системных структур процессора типа того же TSS) база принудительно 0 и лимит максимален, так что там даже нельзя ограничить доступные приложения адреса, иначе как страничной адресацией.

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

Если не понял - все современные ОС настраивают сегментный механизм таким образом, чтобы он ни на что не влиял, так что можешь считать, что его и нет, если не пилишь свою ОС.