
- •Раздел 4. Операционная система unix
- •Оглавление
- •Введение
- •1. Основание и история
- •2. Основные понятия ос unix
- •2.1. Основные понятия
- •2.2. Ядро ос unix
- •2.2.1. Общая организация традиционного ядра ос unix
- •2.2.2. Основные функции
- •2.2.3. Принципы взаимодействия с ядром
- •2.2.4. Принципы обработки прерываний
- •2.3. Файловая система
- •2.3.1. Структура файловой системы
- •2.3.2. Монтируемые файловые системы
- •2.3.3. Интерфейс с файловой системой
- •2.3.4. Разновидности файлов
- •2.3.5. Распределенные файловые системы
- •2.4. Управление устройствами
- •2.4.1. Устройство как специальный файл
- •2.4.2. Драйверы устройств
- •2.4.3. Внешний и внутренний интерфейсы устройств
- •2.5. Принципы защиты
- •2.5.1. Идентификаторы пользователя и группы пользователей
- •2.5.2. Защита файлов
- •2.6. Базовые механизмы сетевых взаимодействий
- •2.6.1. Потоки (Streams)
- •2.6.2. Стек протоколов tcp/ip
- •2.6.3. Программные гнезда (Sockets)
- •2.6.4. Вызовы удаленных процедур (rpc)
- •3. Основные функции и компоненты ядра ос unix
- •3.1. Управление памятью
- •3.1.1. Виртуальная память
- •3.1.2. Аппаратно-независимый уровень управления памятью
- •3.1.3. Страничное замещение основной памяти и swapping
- •3.2. Управление процессами и нитями
- •3.2.1. Пользовательская и ядерная составляющие процессов
- •3.2.2. Принципы организации многопользовательского режима
- •3.2.3. Механизм управления процессами на уровне пользователя
- •3.2.4. Понятие нити (threads)
- •3.2.5. Организация нитей и управлению ими в ос unix
- •3.3. Управление вводом/выводом
- •3.3.1. Принципы системной буферизации ввода/вывода
- •3.3.2. Системные вызовы для управления вводом/выводом
- •3.3.3. Блочные драйверы
- •3.3.4. Символьные драйверы
- •3.3.5. Потоковые драйверы
- •3.4. Взаимодействие процессов
- •3.4.1. Разделяемая память
- •3.4.2. Семафоры
- •3.4.3. Очереди сообщений
- •3.4.4. Программные каналы
- •3.4.5. Программные гнезда (sockets)
- •4. Мобильное программирование в среде ос unix. Стандартные библиотеки
- •4.1. Библиотека системных вызовов
- •4.2. Библиотека ввода/вывода
- •4.3. Дополнительные библиотеки
- •4.4. Файлы заголовков
- •5. Средства интерактивного интерфейса пользователей
- •5.1. Командные языки и командные интерпретаторы
- •5.1.1. Общая характеристика командных языков
- •5.1.2. Базовые возможности семейства командных интерпретаторов
- •5.2. Команды и утилиты
- •5.2.1. Организация команды в ос unix
- •5.2.2. Перенаправление ввода/вывода и организация конвейера
- •5.2.3. Встроенные, библиотечные и пользовательские команды
- •5.2.4. Программирование на командном языке
- •6. Средства графического интерфейса пользователей
- •6.1. Оконная система X как базовое средство графических интерфейсов в среде ос unix
- •6.1.1. Общая организация X-Window
- •6.1.2. Клиентская и серверная части
- •6.1.3. Базовые библиотеки
- •6.2. Средства разработки графических интерфейсов
- •7. Современное состояние ос unix
- •7.2. Системы, основанные на System V Release 4
- •7.3. Свободно распространяемые и коммерческие варианты ос unix семейства bsd
- •7.4. Другие свободно распространяемые варианты ос unix
- •7.5. Стандарты ос unix
- •Заключение
- •Литература
2.5.1. Идентификаторы пользователя и группы пользователей
С каждым выполняемым процессом в ОС UNIX связываются реальный идентификатор пользователя (real user ID), действующий идентификатор пользователя (effective user ID) и сохраненный идентификатор пользователя (saved user ID). Все эти идентификаторы устанавливаются с помощью системного вызова setuid, который можно выполнять только в режиме суперпользователя. Аналогично, с каждым процессом связываются три идентификатора группы пользователей - real group ID, effective group ID и saved group ID. Эти идентификаторы устанавливаются привилегированным системным вызовом setgid.
При входе пользователя в систему программа login проверяет, что пользователь зарегистрирован в системе и знает правильный пароль (если он установлен), образует новый процесс и запускает в нем требуемый для данного пользователя shell. Но перед этим login устанавливает для вновь созданного процесса идентификаторы пользователя и группы, используя для этого информацию, хранящуюся в файлах /etc/passwd и /etc/group. После того, как с процессом связаны идентификаторы пользователя и группы, для этого процесса начинают действовать ограничения для доступа к файлам. Процесс может получить доступ к файлу или выполнить его (если файл содержит выполняемую программу) только в том случае, если хранящиеся при файле ограничения доступа позволяют это сделать. Связанные с процессом идентификаторы передаются создаваемым им процессам, распространяя на них те же ограничения. Однако в некоторых случаях процесс может изменить свои права с помощью системных вызовов setuid и setgid, а иногда система может изменить права доступа процесса автоматически.
Рассмотрим, например, следующую ситуацию. В файл /etc/passwd запрещена запись всем, кроме суперпользователя. Этот файл, помимо прочего, содержит пароли пользователей и каждому пользователю разрешается изменять свой пароль. Имеется специальная программа /bin/passwd, изменяющая пароли. Однако пользователь не может сделать это даже с помощью этой программы, поскольку запись в файл /etc/passwd запрещена. В системе UNIX эта проблема разрешается следующим образом. При выполняемом файле может быть указано, что при его запуске должны устанавливаться идентификаторы пользователя и/или группы. Если пользователь запрашивает выполнение такой программы (с помощью системного вызова exec), то для соответствующего процесса устанавливаются идентификатор пользователя, соответствующий идентификатору владельца выполняемого файла и/или идентификатор группы этого владельца. В частности, при запуске программы /bin/passwd процесс получит идентификатор суперпользователя, и программа сможет произвести запись в файл /etc/passwd.
И для идентификатора пользователя, и для идентификатора группы реальный ID является истинным идентификатором, а действующий ID - идентификатором текущего выполнения. Если текущий идентификатор пользователя соответствует суперпользователю, то этот идентификатор и идентификатор группы могут быть переустановлены в любое значение системными вызовами setuid и setgid. Если же текущий идентификатор пользователя отличается от идентификатора суперпользователя, то выполнение системных вызовов setuid и setgid приводит к замене текущего идентификатора истинным идентификатором (пользователя или группы соответственно).