Linux Kernel (Ядро линукса) (часть 2)


Обработка обращений к несмежным областям памяти

В главе 8 мы видели, что ядро весьма неохотно обновляет записи Таблицы Страниц, соответствующие несмежным областям памяти. Функции vmalloc о и vf гее фактически ограничиваются обновлением главных Таблиц Страниц ядра (то есть глобального каталога страниц init mm.pgd и Таблиц Страниц, являющихся его потомками).

Однако после окончания инициализации ядра никакие процессы и потоки ядра не пользуются главными Таблицами Страниц ядра напрямую. Рассмотрим, что происходит при первом обращении процесса к несмежной области памяти в режиме ядра. Когда линейный адрес транслируется в физический адрес, блок управления памятью встречает нулевую запись Таблицы Страниц и возбуждает исключение ошибка обращения к странице”. Обработчик распознает этот специальный случай, потому что исключение возникло в режиме ядра, а ошибочный линейный адрес больше task size. Тогда обработчик do page fauit проверяет соответствующую запись главной Таблицы Страниц ядра:
vmalloc_f auit:
asm(ffmovl %%cr3 ,%0":"=г" (pgd_paddr) ) ;
pgd = pgd_index(address) + (pgd_t ) va(pgd_paddr);
pgd_k = init_mm.pgd + pgd_index(address); if (!pgd_present(pgd_k)) goto no_context; pud = pud_offset(pgd, address); pud_k = pud_offset(pgd_k, address); if (!pud_present(pud_k)) goto no_context; pmd = pmd_offset(pud, address); pmd_k = pmd_offset(pud_k, address); if (!pmd_present (pmd_k) ) goto no_context; s e t_pmd (pmd, pmd_k) ;
pte_k = pte_offset_kernel(pmd_k, address); if (!pte_present(pte_k)) goto no_context; return;
В локальную переменную pgd paddr записывается физический адрес глобального каталога страниц текущего процесса, хранящийся в регистре . Затем в локальную переменную pgd записывается линейный адрес, соответствующий адресу в переменной pgd paddr, а в локальную переменную pgd k — линейный адрес главного глобального каталога страниц ядра.

Если запись главного глобального каталога страниц ядра, соответствующая линейному адресу, вызвавшему ошибку, содержит одни нули, функция переходит на код за меткой no context (см. разд. "Обработка ошибочного адреса, не входящего в адресное пространство” ранее в этой главе). В противном случае функция читает запись главного верхнего каталога страниц ядра и запись главного среднего каталога страниц ядра, которые соответствуют
ошибочному линейному адресу. И опять, если хотя бы одна из этих записей содержит одни нули, функция совершает переход на метку no context. В противном случае запись главного каталога копируется в соответствующую запись среднего каталога страниц процесса. После этого вся операция повторяется с записью главной Таблицы Страниц.

Создание и удаление адресного пространства процесса

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

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...