Код инициализирует содержимое каталога страниц. (См. инициализацию назначенного массива в C).
Рассмотрим это изображение содержимого записи каталога страниц из OSDev Wiki:
Затем рассмотрим эту строку кода:
[0] = (0) | PTE_P | PTE_W | PTE_PS
Код устанавливает значение записи каталога первой страницы (индекс 0
) равным 0 | PTE_P | PTE_W | PTE_PS
. Это побитовое ИЛИ для установки различных полей:
0
- очистить все биты
PTE_P
- установить текущий бит
PTE_W
- установить бит чтения\записи
PTE_PS
- установить бит размера страницы 4МиБ
Следующая строка делает то же самое. За исключением того, что он устанавливает содержимое 513-й записи (индекс 512
(0x80000000 >> 22
)):
[KERNBASE >> PDXSHIFT] = (0) | PTE_P | PTE_W | PTE_PS
.
В стороне:
Битовая позиция флагов, представляющих интерес для xv6, одинакова для записей каталога страниц (PDE) и записей таблицы страниц (PTE). Вместо создания отдельных констант для флагов PDE авторы решил поделиться константами... На мой взгляд, этот ярлык делает код немного менее ясным по замыслу.
// Page table/directory entry flags.
#define PTE_P 0x001 // Present
#define PTE_W 0x002 // Writeable
#define PTE_U 0x004 // User
#define PTE_PS 0x080 // Page Size
person
Jet Blue
schedule
30.05.2020