6.5.3 Присоединение области к процессу

We use cookies. Read the Privacy and Cookie Policy

6.5.3 Присоединение области к процессу

Ядро присоединяет область к адресному пространству процесса во время выполнения системных функций fork, exec и shmat (алгоритм attachreg, Рисунок 6.19). Область может быть вновь назначаемой или уже существующей, которую процесс будет использовать совместно с другими процессами. Ядро выбирает свободную запись в частной таблице областей процесса, устанавливает в ней поле типа таким образом, чтобы оно указывало на область команд, данных, разделяемую память или область стека, и записывает виртуальный адрес, по которому область будет размещаться в адресном пространстве процесса. Процесс не должен выходить за предел установленного системой ограничения на максимальный виртуальный адрес, а виртуальные адреса новой области не должны пересекаться с адресами существующих уже областей. Например, если система ограничила максимально-допустимое значение виртуального адреса процесса 8 мегабайтами, то привязать область размером 1 мегабайт к виртуальному адресу 7.5M не удастся. Если же присоединение области допустимо, ядро увеличивает значение поля, описывающего размер области процесса в записи таблицы процессов, на величину присоединяемой области, а также увеличивает значение счетчика ссылок на область.

Кроме того, в алгоритме attachreg устанавливаются начальные значения группы регистров управления памятью, выделенных процессу. Если область ранее не присоединялась к какому-либо процессу, ядро с помощью функции growreg (см. следующий раздел) заводит для области новые таблицы страниц; в противном случае используются уже существующие таблицы страниц. Алгоритм завершает работу, возвращая указатель на точку входа в частную таблицу областей процесса, соответствующую вновь присоединенной области. Допустим, например, что ядру нужно подключить к процессу по виртуальному адресу 0 существующую (разделяемую) область, имеющую размер 7 Кбайт (Рисунок 6.20). Оно выделяет новую группу регистров управления памятью и заносит в них адрес таблицы страниц области, виртуальный адрес области в пространстве процесса (0) и размер таблицы страниц (9 записей).

алгоритм attachreg /* присоединение области к процессу */

входная информация:

 (1) указатель на присоединяемую область (заблокированную)

 (2) процесс, к которому присоединяется область

 (3) виртуальный адрес внутри процесса, по которому будет присоединена область

 (4) тип области

выходная информация: точка входа в частную таблицу областей процесса

{

 выделить новую запись в частной таблице областей процесса;

проинициализировать значения полей записи:

  установить указатель на присоединяемую область;

  установить тип области;

  установить виртуальный адрес области;

 проверить правильность указания виртуального адреса и размера области;

 увеличить значение счетчика ссылок на область;

 увеличить размер процесса с учетом присоединения области;

 записать начальные значения в новую группу аппаратных регистров;

 return (точку входа в частную таблицу областей процесса);

}

Рисунок 6.19. Алгоритм присоединения области