Временные отображения
Реализовать временные отображения проще, чем постоянные. Кроме того, они могут быть использованы в обработчиках прерываний и функциях отложенного выполнения, потому что запрос на временное отображение никогда не блокирует текущий процесс.
Каждый страничный кадр в верхней памяти может быть отображен через окно в адресном пространстве ядра, а именно запись Таблицы Страниц, зарезервированную для этой цели. Количество окон, оставленных для временных отображений, весьма невелико.
У каждого процессора имеется собственный набор из 13 окон, представленный структурой enum km type. Каждый символ, определенный в этой структуре (например, km_bounce_read, km_usero или км_ртео), идентифицирует линейный адрес окна.
Ядро должно обеспечить невозможность использования одного окна двумя управляющими трактами одновременно. Поэтому каждый символ в структуре km type ассоциирован с одним компонентом ядра и назван по имени этого компонента. Последний символ, км type nr, не представляет никакой линей
ный адрес, а возвращает количество разных окон, используемых каждым процессором.
Любой символ в структуре km type, кроме последнего, является индексом фиксированно отображенного линейного адреса.
Структура enumfixed_addresses ВКЛЮЧаеТ В Себя СИМВОЛЫ FIX_KMA.P_BEGIN И FIX_KMAP_END,
причем последний присвоен индексу fix_kmap_begin + (km_type_nr nr cpus) - 1. Таким образом, для каждого процессора в системе имеется km type nr фиксировано отображенных линейных адресов. Кроме того, ядро инициализирует переменную kmap pte адресом записи Таблицы Страниц, соответствующей линейному адресу fix_to_virt (fix_kmap_begin) .
Чтобы установить временное отображение, ядро вызывает функцию kmap atomic , которая эквивалентна следующему коду:
void kmap_atomic (struct page page, enum km_type type)
{
enum fixed_addresses idx; unsigned long vaddr;
current_thread_info()->preempt_count++; if (!PageHighMem(page))
return page_address(page); idx = type + KM_TYPE_NR smp_processor_id() ; vaddr = fix_to_virt(FIX_KMAP_BEGIN + idx); set_pte(kmap_pte-idx, mk_pte(page, 0x063));
flush_tlb_single(vaddr);
return (void ) vaddr;}
Аргумент type и идентификатор процессора, полученный с помощью функции smp_processor_id, определяют, какой фиксированно отображенный адрес должен быть использован для отображения запрошенной страницы. Функция возвращает линейный адрес страничного кадра, если он не принадлежит верхней памяти; в противном случае она заносит в запись Таблицы Страниц, соответствующую фиксированно отображенному линейному адресу, физический адрес страницы И флаги Present, Accessed, Read/Write И Dirty. В завершение своей работы функция очищает соответствующий элемент TLB-буфера и возвращает линейный адрес.
Для отмены временного отображения ядро вызывает функцию kunmap_ atomic о. В архитектуре 80x86 эта функция уменьшает счетчик preempt count у текущего процесса. Таким образом, если поток ядра был вытесняемым непосредственно перед запросом временного отображения, он будет вытесняемым и после отмены этого отображения. Кроме того, функция
kunmap atomicO проверяет, установлен ли флаг tif need resched у процесса current, И, если установлен, вызывает функцию schedule.
Предыдущая страница | 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 | Следующая страница