:: МЕХАНИЗМ УПРАВЛЕНИЯ ДОСТУПОМ К ПАМЯТИ в x86 ::

			Почему океан - повелитель всех вод? Потому что
 		     он ниже их всех. И поэтому он влавствует над ними.
							     Лао Цзы



/* КОЛЬЦА */

Семейство процессоров Intel x86 использует для управления доступом понятие 
колец. Существует четыре типа колец, начиная с самого привелегерованного 
нулевого и заканчивая кольцом с наименьшими привелегиями - третьим. Внутренне в 
микрочипе эти кольца хранятся как числа. Все драйверы, весь код ядра ОС WINDOWS 
выполняется в нулевом кольце. Программы пользовательского режима выполняются в 
третьем кольце, иногда их называют программами третьего кольца. В Win и *NIX 
операционных системах используются возможности только нулевого и третьего 
кольца. За отслеживание того, какой программный код и память назначены каждому 
кольцу и как реализуются ограничения доступа между кольцами отвечает процессор.
Обычно каждой программе назначается номер кольца, и эта программа не может 
получать доступ к кольцам с более низким номером. Если программа третьего 
кольца пытается получить доступ к памяти нулевого кольца, процессор генерирует 
прерывание, а операционная система в большинстве случаев запрещает доступ.
Обычно такая ошибка приводит к завершению программы. Но, однако, в опирационной 
системе существует код, позволяющий программе в некоторых специальных случаях
выполнять доступ к кольцам низжего уровня. Например, для загрузки драйвера 
принтера в ядро, требуется, чтобы программа третьего кольца имела доступ к 
загруженным драйверам устройств, которые расположены в нулевом кольце.

+-------------------------+
| +-------------------+   |
| | +---------------+ |   |
| | | +-----------+ | |   |
| | | |	 ring0    | | |   |	ring0 - программы ядра;
| | | +-----------+ | |   |
| | |	 ring1      | |   |
| | +---------------+ |   |
| |	 ring2        |   |
| +-------------------+   |
|	 ring3		  |	ring3 - пользовательские программы;
+-------------------------+

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

/* ТАБЛИЦЫ */

Помимо управления кольцами процессор решает что делать после возникновения 
прерывания, после аварийного заверншения, после посыла какого-либо сигнала от 
аппаратного обсепечения, после попытки user-mode (ring3) программы 
взаимодействовать с kernel-mode (ring0) программой или после переключения 
многопоточной программой программного потока. По идее, все эти события должно 
обробатовать ядро операционной системы, но сначала с ними всегда сталкивается 
процессор. Для каждого события процессор должен оприделить, какая именно 
процедура будет его обрабатывать. Так как каждая процедура находится в памяти, 
процессору необходимо "знать", где найти адрес нужной ему процедуры. Все адреса 
процессор хранит в специальных 'таблиц адресов'. Когда происходит какое либо 
событие (например прерывание), процессор ищет это событие в таблице и находит 
адрес программы, предназначенной для обработки этого события. Всё что нужно 
процессору для этого - базовый адрес этих таблиц в памяти.
Существует множество важных таблиц процессора, среди них:

- Global Descriptor Table // используется для отоброжения адресов
- Local Descriptor Table // используется для отображения адресов
- Page Directory // используется для отображения адресов
- Interrupt Descriptor Table // служит для поиска обработчика прерываний

Все эти таблицы учавствуют при управлении доступом к памити.

/* ЭТАПЫ ПРОВЕРКИ */

Для получения доступа к памяти процессор выполняет следующие проверки:

1. Проверка дескриптора.
Выполняется доступ к глобальной таблице дескрипторов (Global Descriptor Table)
и проверяется дескриптор сегмента. Дескриптор сегмента содержит значение уровня 
привелегий дескриптора (Descriptor Privilege Level). Это значение содержит 
номер кольца, требуемый для вызывающего процесса. Если требование Descriptor 
Privilege Level меньше, чем уровень кольца (Current Privilege Level) 
вызывающего процесса, доступ отклоняется и проверка памяти заканчивается.

2. Проверка каталога страниц (Page Directory).
На этом этапе проверяется бит user/supervisor для всего диапазона страниц 
памяти. Если этот бит установлен в 0, то только программы нулевого кольца могут 
выполнять доступ к этому диапазону страниц. Если вызываемый процесс не нулевого 
кольца, то проверка памяти на этом заканчивается. Если бит user/supervisor 
установлен в 1, то любая программа может выполнять доступ к этому диапазону 
страниц.

3. Проверка страницы
Эта проверка выполняется для одной страницы памяти. Если проверка каталога 
страниц пройдена успешно, выполняется проверка каждой рассматриваемой страницы.
Как и в каталоге страниц каждая отдельная страница имеет бит user/supervisor, 
который и проверяется. Аналогично как и в предыдущем этапе, если этот бит 
установлен в 0, то только kernel-mode программы могут выполнять доступ к этой 
странице. А если бит равен 1, то дюбая программа может выполнять доступ к 
данной странице. Процессу разрешается получить доступ к странице памяти, если 
он пройдёт все этапы проверки.


							© by LiNK