*   >> Чтение Образование Статьи >> science >> programming

Написание страницу кадр Allocator

Введение

<р> Этот учебник будет пытаться показать вам, как написать простой страницы кадра распределитель для x86 CPU. Язык используется C, и мы используем стандартный подкачки с 4 КБ страниц. Страница кадров распределитель выделит кадры с первого кадра, начиная сразу после конца ядра.

Метод

<р> Каждый кадр должен управляться с картой байт (для простоты) : значение 0х01 для используемых страниц, а значение 0x00 для неиспользуемых страниц. Для выделения страницу, все, что нужно, это поиск по массиву для свободного страницы, а затем пометить его как используется.

Вы, возможно, заметили, что это было бы очень неэффективно, имея для поиска по возможному числу 1048319 страниц. Чтобы ускорить процесс выделения распределитель выделит 20 страниц кадры в то время, так что большую часть времени все, что будет сделано, прежде чем руки. Alocatting новую страницу просто вопрос получения страничный кадр с массивом выделенную кадров.

The

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

 запись (загрузчик) РАЗДЕЛЫ {. = 0x00100000; .text:. {= text_start; (.

rodata): * (. текст)} .rodata ALIGN (0x1000) {*} .data ALIGN (0x1000): {* (. данных) end_data =;} .bss:.. {SBSS =; * (Общий) * (BSS). EBSS =. endkernel =. }} <р> Переменная endkernel будут объявлены в ядре как:

 экстерном u32int endkernel <р> Переменная сам не имеет никакого значения, это адрес переменной, мы используем. endkernel будет использоваться для расчета адрес первой страницы кадре после ядра.

Код для поиска в массиве также очень просто:

 статический pageframe_t kalloc_frame_int () {u32int I = 0; в то время как (frame_map [я] = бесплатно!) {я ++; если (== я NPAGES) {возвращение (ОШИБКА); }} Frame_map [я] = Б; Возвращение (начальный кадр + (я * 0x1000)); //вернуть адрес страничного блока на основе расположения заявил бесплатно //В массиве} 

последняя использованная функция звонки kalloc_frame_int каждые 20 страниц кадров ассигнований:

 pageframe_t kalloc_frame () {статического u8int выделить = 1; //или нет, мы собираемся выделить новый набор preframes статического u8int PFRAME = 0; pageframe_t отставке; если (== 20 PFRAME) {выделить = 1; } Если (выделить == 1) {для (INT I = 0; I {pre_frames [я] = kalloc_frame_int ();} PFRAME = 0; выделить = 0;} отставке = pre_frames [PFRAME]; PFRAME ++; возвращение (в отставке) ;} <р> Освобождение страничный кадр просто в

Page   <<       [1] [2] >>

Copyright © 2008 - 2016 Чтение Образование Статьи,https://ru.nmjjxx.com All rights reserved.