- •1.Архитектура операционных систем
- •1.1Общие вопросы архитектуры операционных систем
- •1.2Архитектура Windows
- •1.2.1История возникновения Windows
- •1.2.2Архитектура ос Windows
- •1.2.3История возникновения ос Linux
- •1.2.4Архитектура Linux
- •1.2.5Интерфейсы системы unix
- •1.2.6Файловая система unix
- •1.2.7Аутентификация в unix
- •1.2.8Сценарии командной оболочки unix
- •1.3Операционная система qnx
- •1.3.1 Архитектура qnx
- •1.4Выводы
- •1.5Вопросы для самоконтроля
- •2.Типы и алгоритмы работы с оперативной памятью
- •2.1Общие принципы функционирования подсистемы памяти в ос
- •2.1.1Обобщённые принципы управления памятью
- •2.1.2Однозадачная система без подкачки на диск
- •2.1.3Многозадачность с фиксированными разделами
- •2.1.4Подкачка
- •2.1.5Управление памятью с помощью битовых массивов
- •2.1.6Управление памятью с помощью связанных списков
- •2.1.7Виртуальная память
- •2.1.8Многоуровневые таблицы страниц
- •2.1.9Алгоритмы замещения страниц
- •2.2Виртуальная память ос Windows
- •2.2.1Архитектура памяти в ос Windows
- •2.2.2Работа с виртуальной памятью в ос Windows
- •2.2.3Использование виртуальной памяти в приложениях
- •2.3Пример организации страничной памяти на примере linux
- •2.3.1Страничная организация памяти в Linux
- •2.3.2Права доступа к области памяти
- •2.3.3Работа с областями памяти в Linux
- •3.Процессы и потоки
- •3.1Процессы
- •3.1.1Модель процесса
- •3.1.2Создание процесса
- •3.1.3Завершение процесса
- •3.1.4Состояния процессов
- •3.1.5Реализация процессов
- •3.2Потоки
- •3.2.1Реализация потоков
- •3.2.2Реализация потоков на уровне ядра
- •3.2.3Смешанная реализация
- •3.2.4 Метод управления «Активация планировщика»
- •3.2.5Всплывающие потоки
- •3.3Межпроцессное взаимодействие
- •3.3.1Состояние состязания
- •3.3.2Критические секции (Критические области)
- •3.3.3Взаимное исключение с активным ожиданием
- •3.3.4Примитивы межпроцессного взаимодействия
- •3.4Семафоры
- •3.5Мьютексы
- •3.6Организация многопоточной обработки в среде Windows
- •3.6.1Объекты ядра Windows
- •3.6.2Потоки Windows
- •3.6.3Синхронизация потоков в Windows
- •3.6.4Синхронизация потоков с помощью объектов ядра
- •3.6.5Сравнение объектов, используемых для синхронизации потоков
- •3.7Организация процессов и потоков в Linux
- •3.7.1Среда окружения в Linux
- •3.7.2Создание нового процесса. Системный вызов exec.
- •3.7.3Потоки unix. Функции потоков стандарта posix.
- •3.8Синхронизация потоков в unix
- •3.8.1Мьютексы
- •3.8.2Семафоры
- •0,0,0, //Ожидать обнуления семафора
- •0,1,0 // Затем увеличить значение семафора на 1};
- •0,1, 0 // Увеличитьзначение семафора на 1};
2.3.2Права доступа к области памяти
Рассмотрим далее права доступа к области памяти (табл. 2.4):
Таблица 2.4. Права доступа к области памяти в Linux.
Имя флага |
Описание |
VM_READ |
Страницы доступны для чтения |
VM WRITE |
Страницы доступны для записи |
VM_EXEC |
Страницы доступны для выполнения |
VM_SHARED |
Страницы доступны для совместного использования несколькими процессами |
VM_MAYREAD |
Флаг vm_read может быть установлен |
VM_MAYWRITE |
Флаг vmwrite может быть установлен |
VM_MAYEXEC |
Флаг vm exec может быть установлен |
VM_MAYSHARE |
Флаг vmjshare может быть установлен |
VM_GROWSDOWN |
Область может расширяться в направлении меньших адресов |
VM_GROWSUP |
Область может расширяться в направлении больших адресов |
VM_SHM |
Область применяется в качестве совместно используемой памяти в рамках IPC |
VM_DENYWRITE |
Область отображает файл, который не может быть открыт для записи |
VM_EXECUTABLE |
Область отображает исполняемый файл |
VM LOCKED |
Страницы области заблокированы и не могут быть выгружены |
VM_IO |
Область отображает адресное пространство ввода/вывода для некоторого устройства |
VM_SEQ_READ |
Приложение обращается к страницам последовательно |
VM_RAND_READ |
Приложение обращается к страницам в случайном порядке |
VM_DONTCOPY |
Не копировать область при ответвлении нового процесса |
VM_DONT EX PAN D |
Запретить расширение области с помощью системного вызова mremap() |
VM_RESERVED |
Область является специальной (например, это адресное пространство ввода/вывода для некоторого устройства), поэтому страницы нельзя выгружать |
VM_ACCOUNT |
Проверять, достаточно ли свободной памяти для отображения при создании области совместно используемой памяти IPC (см. главу 19) |
VM_HUGETLB |
Страницы в области обрабатываются механизмом выделения расширенных страниц |
VM_NONLINEAR |
Область реализует нелинейное отображение |
Права доступа к странице, хранящиеся в дескрипторе области памяти, можно комбинировать произвольным образом. Например, сделать так, чтобы страницы области были доступны для чтения, но не выполнения. Чтобы эффективно реализовать подобную схему защиты, следует продублировать права на чтение, запись и выполнение, ассоциированные с областью памяти, во всех соответствующих записях Таблицы Страниц. Тогда проверки будут выполняться непосредственно блоком управления страницами процессора.
Иными словами, права доступа к странице диктуют, какие попытки обращения к странице приведут к возникновению соответствующего исключения. Как мы вскоре убедимся, работа по выяснению, что именно вызвало ошибку обращения к странице, делегируется операционной системой Linux обработчику этого исключения, в котором реализовано несколько различных стратегий.
Начальные значения флагов Таблицы Страниц (которые должны быть одинаковыми у всех страниц в области памяти, о чем мы уже говорили) хранятся в поле vmpageprot дескриптора vmareastruct. При добавлении страницы ядро устанавливает флаги в соответствующих записях Таблицы Страниц согласно содержимому поля vmpageprot.
Однако трансляция прав доступа к области памяти в биты защиты страницы не является простой операцией по ряду причин. В некоторых случаях попытка обращения к странице должна вызывать соответствующее исключение, даже если данный тип доступа прописан в поле vm_f lags дескриптора области памяти. Например, как мы увидим далее в этой главе, ядро может принять решение о хранении двух идентичных закрытых (то есть со сброшенными флагами vmshare) страниц, доступных для записи и принадлежащих двум разным процессам, в одном страничном кадре. В этом случае исключение должно быть сгенерировано, когда один из процессов попытается модифицировать страницу. Кроме того, у процессоров 80x86 Таблицы Страниц имеют всего два бита защиты, а именно флаги Read/Write И User/Supervisor. Флаг user/supervisor каждой страницы, входящей в область памяти, должен быть всегда установлен, потому что страница должна быть доступна процессам режима пользователя. Современные микропроцессоры Pentium 4 при включенном механизме выделения страниц РАЕ пользуются флагом nx (No eXecute, Выполнение запрещено) в каждой 64-битовой записи Таблицы Страниц.
Если ядро было откомпилировано без поддержки РАЕ, в Linux приняты следующие правила (они преодолевают аппаратные ограничения микропроцессоров 80x86):
право на чтение всегда подразумевает право на выполнение, и наоборот;
право на запись всегда подразумевает право на чтение.
Если же ядро было скомпилировано с поддержкой РАЕ, и у центрального процессора есть флаг nx, в Linux принимаются другие правила:
право на выполнение всегда подразумевает право на чтение;
право на запись всегда подразумевает право на чтение.
Таким образом, 16 возможных комбинаций прав на чтение, запись, выполнение и совместное использование сводятся к минимуму, в соответствии со следующими правилами:
если для страницы определены права на запись и совместное использование, устанавливается бит Read/Write;
если для страницы определено право на чтение или выполнение, но не оп-
ределено право на запись или совместное использование, бит Read/write
сбрасывается;
если бит nx поддерживается процессором, а для страницы не определено
право на выполнение, бит nx устанавливается;
если для страницы не определено никаких прав доступа, бит Present сбрасывается, чтобы любая попытка обращения к ней вызывала соответствующее исключение. Однако чтобы отличать эту ситуацию от той, когда страница действительно отсутствует, в Linux устанавливается бит Page size.