Re: priveleges
On Wed, 22 Oct 2003, Alexander S. Yurkov wrote:
Впрочем, можно передать адрес заголовка a обработчик системного вызова это
проверит по адресу возврата, вытащенного из стека. Но как конкретно
реализовано в Linux?
-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.linux.discuss&email=
http://subscribe.ru/ mailto:ask@subscribe.ru
Здравствуйте, Alexander.
Вы писали 23 Октябрь 2003 г., 0:57:27:
Зачем всё усложнять: первое преимущество Unix'a - его простота (второе
- файловая система).
На самом деле вспомним что кроме режимов привилегий процессоров
(кстати верно подметили: из 4-х уровней для i386+ в Linux используются
всего лишь 2 крайних), для эфективного управления многозадачностью
используется также MMU (memory management unit)
(немного некоректно сформулировал идею, так как управление
уровнями привелегий является частью функций MMU). Я не очень хорошо
знаком с разными архитектурами систем (в частности более близкое
знакомство имел с i80x86 и Etrax100LX). Для i386 существуют понятия
GDT (Global Descriptor Table) и LDT (соотвественно Local). Они
обозначают таблицы с данными для управления областями памяти.
Существует одна GDT на всю систему, и по одной LDT для каждого
процесса. Процесс работает с виртуальными адресами (не имея понятия о
физическом распределении памяти), для правильного их отображения в
физическое адресное пространство используется LDT.
Так вот, вернёмся к Unix. Для каждого процесса выделяется зона памяти
(U-zone) содержащая набор информации о процессе. В частности там
находится время исполнения программы, приоритет, значение nice,
список открытых файлов, корень, рабочий каталог, значение umask и все
ID (uid, gid, euid, egid), ...
При системном вызове начинает исполнятся код ядра, но при этом он
выполняется в адресном пространстве пользовательского процесса (!).
Он сразу обращается к U-zone, берёт оттуда pid (process id) и если
нужная информация не находится в U-zone (например адрес буфера
открытого файла), он её ищет в соотвествующей глобальной области
данных используя идентификатор процесса (pid)
Замечание: сам процесс не имеет непосредственного доступа к
вышеописаной информации и должен использовать функции
ядра.