по физическому адресу 986К. В разделе 6.5.5 (где идет речь о загрузке облас-
ти) рассматривается случай, когда запись таблицы страниц помечается "пус-
той".
В современных машинах используются разнообразные аппаратные регистры и
кеши, которые повышают скорость выполнения вышеописанной процедуры трансля-
ции адресов и без которых пересылки в памяти и адресные вычисления чересчур
бы замедлились. Возобновляя выполнение процесса, ядро посредством загрузки
соответствующих регистров сообщает техническим средствам управления памятью
о том, в

Частная таблица областей Таблицы страниц
процесса (Физические адреса)
+--------------+
Команды | 8К +--------------+
+--------------+ +-------->+--------------+
Данные | 32К +-------+ | пусто |
+--------------+ | +--------------+
Стек | 64К +---+ | | 137К |
+--------------+ | v +--------------+
Виртуальные адреса | +--------------+ | 852К |
| | 87К | +--------------+
+------------+ +--------------+ | 764К |
v | 552К | +--------------+
+--------------+ +--------------+ | 433К |
| 541К | | 727К | +--------------+
+--------------+ +--------------+ | 333К |
| 783К | | 941К | +--------------+
+--------------+ +--------------+ | - |
| 986К | | 1096К | | - |
+--------------+ +--------------+ | - |
| 897К | | 2001К | | - |
+--------------+ +--------------+ +--------------+
| - | | - |
+--------------+ +--------------+
Рисунок 6.5. Преобразование виртуальных адресов в физические

144



каких физических адресах выполняется процесс и где располагаются таблицы
страниц. Поскольку такие операции являются машинно-зависимыми и в разных
версиях реализуются по-разному, здесь мы их рассматривать не будем. Часть
вопросов, связанных с архитектурой вычислительных систем, затрагивается в
упражнениях.
Организацию управления памятью попробуем пояснить на следующем простом
примере. Пусть память разбита на страницы размером 1 Кбайт каждая, обращение
к которым осуществляется через описанные ранее таблицы страниц. Регистры уп-
равления памятью в системе группируются по три; первый регистр в тройке со-
держит адрес таблицы страниц в физической памяти, второй регистр содержит
первый виртуальный адрес, отображаемый с помощью тройки регистров, третий
регистр содержит управляющую информацию, такую как номера страниц в таблице
страниц и права доступа к страницам (только чтение, чтение и запись). Такая
модель соответствует вышеописанной модели области. Когда ядро готовит про-
цесс к выполнению, оно загружает тройки регистров соответствующей информаци-
ей из записей частной таблицы областей процесса.
Если процесс обращается к ячейкам памяти, расположенным за пределами
принадлежащего ему виртуального пространства, создается исключительная ситу-
ация. Например, если область команд имеет размер 16 Кбайт (Рисунок 6.5), а
процесс обращается к виртуальному адресу 26К, создается исключительная ситу-
ация, обрабатываемая операционной системой. То же самое происходит, если
процесс пытается обратиться к памяти, не имея соответствующих прав доступа,
например, пытается записать адрес в защищенную от записи область команд. И в
том, и в другом примере процесс обычно завершается (более подробно об этом в
следующей главе).


    6.2.3 Размещение ядра



Несмотря на то, что ядро работает в контексте процесса, отображение вир-
туальных адресов, связанных с ядром, осуществляется независимо от всех про-
цессов. Программы и структуры данных ядра резидентны в системе и совместно
используются всеми процессами. При запуске системы происходит загрузка прог-
рамм ядра в память с установкой соответствующих таблиц и регистров для отоб-
ражения виртуальных адресов ядра в физические. Таблицы страниц для ядра име-
ют структуру, аналогичную структуре таблицы страниц, связанной с процессом,
а механизмы отображения виртуальных адресов ядра похожи на механизмы, ис-
пользуемые для отображения пользовательских адресов. На многих машинах вир-
туальное адресное пространство процесса разбивается на несколько классов, в
том числе системный и пользовательский, и каждый класс имеет свои собствен-
ные таблицы страниц. При работе в режиме ядра система разрешает доступ к ад-
ресам ядра, при работе же в режиме задачи такого рода доступ запрещен. Поэ-
тому, когда в результате прерывания или выполнения системной функции проис-
ходит переход из режима задачи в режим ядра, операционная система по догово-
ренности с техническими средствами разрешает ссылки на адреса ядра, а при
возврате в режим ядра эти ссылки уже запрещены. В других машинах можно ме-
нять преобразование виртуальных адресов, загружая специальные регистры во
время работы в режиме ядра.
На Рисунке 6.6 приведен пример, в котором виртуальные адреса от 0 до
4М-1 принадлежат ядру, а начиная с 4М - процессу. Имеются две группы регист-
ров управления памятью, одна для адресов ядра и одна для адресов процесса,
причем каждой группе соответствует таблица страниц, хранящая номера физичес-
ких страниц со ссылкой на адреса виртуальных страниц. Адресные ссылки с ис-
пользованием группы регистров ядра допускаются системой только в режиме яд-
ра; следовательно, для перехода между режимом ядра и режимом задачи требует-
ся только, чтобы система разрешила или запретила адресные ссылки с использо-


145

ванием группы регистров ядра.
В некоторых системах ядро загружается в память таким образом, что боль-
шая часть виртуальных адресов ядра совпадает с физическими адресами и функ-
ция преобразования виртуальных адресов в физические превращается в функцию
тождественности. Работа с пространством процесса, тем не менее, требует,
чтобы преобразование виртуальных адресов в физические производилось ядром.

Адрес таблицы Вирту- Номера стра-
страниц альный ниц в табли-
адрес це
+-----------+------------+-----------+
Регистр ядра 1 | --------+ 0 | |
+-----------+-|----------+-----------+
Регистр ядра 2 | ---+ | | 1М | |
+--------|--+-|----------+-----------+
Регистр ядра 3 | --+| | | 2М | |
+-------||--+-|----------+-----------+
Регистр процесса 1 | +--- || | | 4М | |
+-|-----||--+-|----------+-----------+
Регистр процесса 2 | |+-- || | | | |
+-||----||--+-|----------+-----------+
Регистр процесса 3 | ||+- || | | | |
+-|||---||--+-|----------+-----------+
+------------------------+|| || |
| +--------------+| |+----|-------+
| | +----+ +-----|-------|----------+
| | | +--+ | |
v v v v v v
+------+ +------+ +------+ +------+ +------+ +------+
| 856K | | 747K | | 556K | | 0K | | 128K | | 256K |
+------+ +------+ +------+ +------+ +------+ +------+
| 917K | | 950K | | 997K | | 4K | | 97K | | 292K |
+------+ +------+ +------+ +------+ +------+ +------+
| 564K | | 333K | | 458K | | 3K | | 135K | | 304K |
+------+ +------+ +------+ +------+ +------+ +------+
| 444K | | - | | 632K | | 17K | | 139K | | 279K |
+------+ | - | +------+ +------+ +------+ +------+
| - | | - | | - | | - | | - | | - |
| - | | - | | - | | - | | - | | - |
+------+ +------+ +------+ +------+ +------+ +------+

Таблицы страниц процесса Таблицы страниц ядра
(области)

Рисунок 6.6. Переключение режима работы с непривилегированного (режима
задачи) на привилегированный (режим ядра)



    6.2.4 Пространство процесса



Каждый процесс имеет свое собственное пространство, однако ядро обраща-
ется к пространству выполняющегося процесса так, как если бы в системе оно
было единственным. Ядро подбирает для текущего процесса карту трансляции
виртуальных адресов, необходимую для работы с пространством процесса. При
компиляции загрузчик назначает переменной 'u' (имени пространства процесса)
фиксированный виртуальный адрес. Этот адрес известен остальным компонентам
ядра, в частности модулю, выполняющему переключение контекста (раздел
6.4.3). Ядру также известно, какие таблицы управления памятью используются

146

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

Адрес таблицы Вирту- Номера стра-
страниц альный ниц в табли-
адрес це
+-----------+------------+-----------+
Регистр ядра 1 | | | |
+-----------+------------+-----------+
Регистр ядра 2 | | | |
+-----------+------------+-----------+
(Прост- Регистр ядра 3 | ---+ | 2M | 4 |
ранство +--------|--+------------+-----------+
процесса) |
+---------------------+
|
Таблицы страниц для пространства процессов |
v
+------+ +------+ +------+ +------+
| 114K | | 843K | |1879K | | 184K |
+------+ +------+ +------+ +------+
| 708K | | 794K | | 290K | | 176K |
+------+ +------+ +------+ +------+
| 143K | | 361K | | 450K | | 209K |
+------+ +------+ +------+ +------+
| 565K | | 847K | | 770K | | 477K |
+------+ +------+ +------+ +------+
Процесс A Процесс B Процесс C Процесс D

Рисунок 6.7. Карта памяти пространства процесса в ядре


Предположим, например, что пространство процесса имеет размер 4 Кбайта и
помещается по виртуальному адресу 2М. На Рисунке 6.7 показана карта памяти,
где первые два регистра из группы относятся к программам и данным ядра (ад-
реса и указатели не показаны), а третий регистр адресует к пространству про-
цесса D. Если ядру нужно обратиться к пространству процесса A, оно копирует
связанную с этим пространством информацию из соответствующей таблицы страниц
в третий регистр. В любой момент третий регистр ядра описывает пространство
текущего процесса, но ядро может сослаться на пространство другого процесса,
переписав записи в таблице страниц с новым адресом. Информация в регистрах 1
и 2 для ядра неизменна, поскольку все процессы совместно используют програм-
мы и данные ядра.


    6.3 КОНТЕКСТ ПРОЦЕССА



Контекст процесса включает в себя содержимое адресного пространства за-
дачи, выделенного процессу, а также содержимое относящихся к процессу аппа-

147

ратных регистров и структур данных ядра. С формальной точки зрения, контекст
процесса объединяет в себе пользовательский контекст, регистровый контекст и
системный контекст (*). Пользовательский контекст состоит из команд и данных
процесса, стека задачи и содержимого совместно используемого пространства
памяти в виртуальных адресах процесса. Те части виртуального адресного прос-
транства процесса, которые периодически отсутствуют в оперативной памяти
вследствие выгрузки или замещения страниц, также включаются в пользователь-
ский контекст.
Регистровый контекст состоит из следующих компонент:
* Счетчика команд, указывающего адрес следующей команды, которую будет вы-
полнять центральный процессор; этот адрес является виртуальным адресом
внутри пространства ядра или пространства задачи.
* Регистра состояния процессора (PS), который указывает аппаратный статус
машины по отношению к процессу. Регистр PS, например, обычно содержит
подполя, которые указывают, является ли результат последних вычислений
нулевым, положительным или отрицательным, переполнен ли регистр с уста-
новкой бита переноса и т.д. Операции, влияющие на установку регистра PS,
выполняются для отдельного процесса, потому-то в регистре PS и содержит-
ся аппаратный статус машины по отношению к процессу. В других имеющих
важное значение подполях регистра PS указывается текущий уровень преры-
вания процессора, а также текущий и предыдущий режимы выполнения процес-
са (режим ядра/задачи). По значению подполя текущего режима выполнения
процесса устанавливается, может ли процесс выполнять привилегированные
команды и обращаться к адресному пространству ядра.
* Указателя вершины стека, в котором содержится адрес следующего элемента
стека ядра или стека задачи, в соответствии с режимом выполнения процес-
са. В зависимости от архитектуры машины указатель вершины стека показы-
вает на следующий свободный элемент стека или на последний используемый
элемент. От архитектуры машины также зависит направление увеличения сте-
ка (к старшим или младшим адресам), но для нас сейчас эти вопросы несу-
щественны.
* Регистров общего назначения, в которых содержится информация, сгенериро-
ванная процессом во время его выполнения. Чтобы облегчить последующие
объяснения, выделим среди них два регистра - регистр 0 и регистр 1 - для
дополнительного использования при передаче информации между процессами и
ядром. Системный контекст процесса имеет "статическую часть" (первые три
элемента в нижеследующем списке) и "динамическую часть" (последние два
элемента). На протяжении всего времени выполнения процесс постоянно рас-
полагает одной статической частью системного контекста, но может иметь
переменное число динамических частей. Динамическую часть системного кон-
текста можно представить в виде
стека, элементами которого являются контекстные уровни, которые помеща-
ются в стек ядром или выталкиваются из стека при наступлении различных
событий. Системный контекст включает в себя следующие компоненты:
* Запись в таблице процессов, описывающая состояние процесса (раздел 6.1)
и содержащая различную управляющую информацию, к которой ядро всегда мо-
жет обратиться.
* Часть адресного пространства задачи, выделенная процессу, где хранится
управляющая информация о процессе, доступная только в контексте процес-
са. Общие управляющие параметры, такие как приоритет процесса, хранятся
в таблице процессов, поскольку обращение к ним должно производиться за
пределами контекста процесса.

---------------------------------------
(*) Используемые в данном разделе термины "пользовательский контекст"
(user-level context), "регистровый контекст" (register context), "сис-
темный контекст" (system-level context) и "контекстные уровни" (context
layers) введены автором.


148

* Записи частной таблицы областей процесса, общие таблицы областей и таб-
лицы страниц, необходимые для преобразования виртуальных адресов в физи-
ческие, в связи с чем в них описываются области команд, данных, стека и
другие области, принадлежащие процессу. Если несколько процессов совмес-
тно используют общие области, эти области входят составной частью в кон-
текст каждого процесса, поскольку каждый процесс работает с этими облас-
тями независимо от других процессов. В задачи управления памятью входит
идентификация участков виртуального адресного пространства процесса, не
являющихся резидентными в памяти.
* Стек ядра, в котором хранятся записи процедур ядра, если процесс выпол-
няется в режиме ядра. Несмотря на то, что все процессы пользуются одними
и теми же программами ядра, каждый из них имеет свою собственную копию
стека ядра для хранения индивидуальных обращений к функциям ядра. Пусть,
например, один процесс вызывает функцию creat и приостанавливается в
ожидании назначения нового индекса, а другой процесс вызывает функцию
read и приостанавливается в ожидании завершения передачи данных с диска
в память. Оба процесса обращаются к функциям ядра и у каждого из них
имеется в наличии отдельный стек, в котором хранится последовательность
выполненных обращений. Ядро должно иметь возможность восстанавливать со-
держимое стека ядра и положение указателя вершины стека для того, чтобы
возобновлять выполнение процесса в режиме ядра. В различных системах
стек ядра часто располагается в пространстве процесса, однако этот стек
является логически-независимым и, таким образом, может помещаться в са-
мостоятельной области памяти. Когда процесс выполняется в режиме задачи,
соответствующий ему стек ядра пуст.
* Динамическая часть системного контекста процесса, состоящая из несколь-
ких уровней и имеющая вид стека, который освобождается от элементов в
порядке, обратном порядку их поступления. На каждом уровне системного
контекста содержится информация, необходимая для восстановления предыду-
щего уровня и включающая в себя регистровый контекст предыдущего уровня.

Ядро помещает контекстный уровень в стек при возникновении прерывания,
при обращении к системной функции или при переключении контекста процесса.
Контекстный уровень выталкивается из стека после завершения обработки преры-
вания, при возврате процесса в режим задачи после выполнения системной функ-
ции, или при переключении контекста. Таким образом, переключение контекста
влечет за собой как помещение контекстного уровня в стек, так и извлечение
уровня из стека: ядро помещает в стек контекстный уровень старого процесса,
а извлекает из стека контекстный уровень нового процесса. Информация, необ-
ходимая для восстановления текущего контекстного уровня, хранится в записи
таблицы процессов.
На Рисунке 6.8 изображены компоненты контекста процесса. Слева на рисун-
ке изображена статическая часть контекста. В нее входят: пользовательский
контекст, состоящий из программ процесса
(машинных инструкций), данных, стека и разделяемой памяти (если она имеет-
ся), а также статическая часть системного контекста, состоящая из записи
таблицы процессов, пространства процесса и записей частной таблицы областей
(информации, необходимой для трансляции виртуальных адресов пользовательско-
го контекста). Справа на рисунке изображена динамическая часть контекста.
Она имеет вид стека и включает в себя несколько элементов, хранящих регист-
ровый контекст предыдущего уровня и стек ядра для текущего уровня. Нулевой
контекстный уровень представляет собой пустой уровень, относящийся к пользо-
вательскому контексту; увеличение стека здесь идет в адресном пространстве
задачи, стек ядра недействителен. Стрелка, соединяющая между собой статичес-
кую часть системного контекста и верхний уровень динамической части контекс-
та, означает то, что в таблице процессов хранится информация, позволяющая
ядру восстанавливать текущий контекстный уровень процесса.



149

Статическая часть контекста Динамическая часть контекста
+-------------------------+ логичес- | - |
|Пользовательский контекст| кий ука- | - |
| +---------------------+ | затель на| - |
| | Программы процесса | | текущий | - |
| | Данные | |+-------->+----------------+
| | Стек | || контек- | Стек ядра для |
| | Разделяемые данные | || стный | уровня 3 |
| +---------------------+ || уровень | |
| || | Сохраненный ре-|
| Статическая часть ||Уровень 3| гистровый кон- |
| системного контекста || | текст уровня 2 |
| +---------------------+ || +----------------+
| | Запись таблицы про- | || | Стек ядра для |
| | цессов +-++ | уровня 2 |
| |Пространство процесса| | | |
| | Частная таблица об- | | | Сохраненный ре-|
| | ластей процесса | | Уровень 2| гистровый кон- |
| +---------------------+ | | текст уровня 1 |
+-------------------------+ +----------------+
| Стек ядра для |
| уровня 1 |
| |
| Сохраненный ре-|
Уровень 1| гистровый кон- |
| текст уровня 0 |
+----------------+
Контекстный| |
уровень| (Пользователь- |
ядра 0| ский уровень) |
+----------------+

Рисунок 6.8. Компоненты контекста процесса

Процесс выполняется в рамках своего контекста или, если говорить более
точно, в рамках своего текущего контекстного уровня. Количество контекстных
уровней ограничивается числом поддерживаемых в машине уровней прерывания.
Например, если в машине поддерживаются разные уровни прерываний для прог-
рамм, терминалов, дисков, всех остальных периферийных устройств и таймера,
то есть 5 уровней прерывания, то, следовательно, у процесса может быть не
более 7 контекстных уровней: по одному на каждый уровень прерывания, 1 для
системных функций и 1 для пользовательского контекста. 7 уровней будет дос-
таточно, даже если прерывания будут поступать в "наихудшем" из возможных по-
рядков, поскольку прерывание данного уровня блокируется (то есть его обра-
ботка откладывается центральным процессором) до тех пор, пока ядро не обра-
ботает все прерывания этого и более высоких уровней.
Несмотря на то, что ядро всегда исполняет контекст какого-нибудь процес-
са, логическая функция, которую ядро реализует в каждый момент, не всегда
имеет отношение к данному процессу. Например, если возвращая данные, диско-
вое запоминающее устройство посылает прерывание, то прерывается выполнение
текущего процесса и ядро обрабатывает прерывание на новом контекстном уровне
этого процесса, даже если данные относятся к другому процессу. Программы об-
работки прерываний обычно не обращаются к статическим составляющим контекста
процесса и не видоизменяют их, так как эти части не связаны с прерываниями.


    6.4 СОХРАНЕНИЕ КОНТЕКСТА ПРОЦЕССА



Как уже говорилось ранее, ядро сохраняет контекст процесса, помещая в

150

стек новый контекстный уровень. В частности, это имеет место, когда система
получает прерывание, когда процесс вызывает системную функцию или когда ядро
выполняет переключение контекста. Каждый из этих случаев подробно рассматри-
вается в этом разделе.


    6.4.1 Прерывания и особые ситуации



Система отвечает за обработку всех прерываний, поступили ли они от аппа-
ратуры (например, от таймера или от периферийных устройств), от программ (в
связи с выполнением инструкций, вызывающих возникновение "программных преры-
ваний") или явились результатом особых ситуаций (таких как обращение к от-
сутствующей странице). Если центральный процессор ведет обработку на более
низком уровне по сравнению с уровнем поступившего прерывания, то перед вы-
полнением следующей инструкции его работа прерывается, а уровень прерывания
процессора повышается, чтобы другие прерывания с тем же (или более низким)
уровнем не могли иметь места до тех пор, пока ядро не обработает текущее
прерывание, благодаря чему обеспечивается сохранение целостности структур
данных ядра. В процессе обработки прерывания ядро выполняет следующую после-
довательность действий:
1. Сохраняет текущий регистровый контекст выполняющегося процесса и создает
в стеке (помещает в стек) новый контекстный уровень.
2. Устанавливает "источник" прерывания, идентифицируя тип прерывания (нап-
ример, прерывание по таймеру или от диска) и номер устройства, вызвавше-
го прерывание (например, если прерывание вызвано дисковым запоминающим
устройством). При возникновении прерывания система получает от машины
число, которое использует в качестве смещения в таблице векторов преры-
вания. Содержимое векторов прерывания в разных машинах различно, но, как
правило, в них хранится адрес программы обработки прерывания, соответст-
вующей источнику прерывания, и указывается путь поиска параметра для
программы. В качестве примера рассмотрим таблицу векторов прерывания,
приведенную на Рисунке 6.9. Если источником прерывания явился терминал,
ядро получает от аппаратуры номер прерывания, равный 2, и вызывает прог-

+-----------------------------------------+
| Номер прерывания Программа обработки |
| прерывания |
| |
| 0 clockintr |
| 1 diskintr |
| 2 ttyintr |
| 3 devintr |
| 4 softintr |
| 5 otherintr |
+-----------------------------------------+

Рисунок 6.9. Пример векторов прерывания


рамму обработки прерываний от терминала, именуемую ttyintr.
3. Вызов программы обработки прерывания. Стек ядра для нового контекстного
уровня, если рассуждать логически, должен отличаться от стека ядра пре-
дыдущего контекстного уровня. В некоторых разработках стек ядра текущего
процесса используется для хранения элементов, соответствующих программам
обработки прерываний, в других разработках эти элементы хранятся в гло-
бальном стеке прерываний, благодаря чему обеспечивается возврат из прог-
раммы без переключения контекста.
4. Программа завершает свою работу и возвращает управление ядру. Ядро ис-
полняет набор машинных команд по восстановлению регистрового контекста и

151

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