что означает этот код в xv6 entrypgdir?

В настоящее время я вникаю в операционную систему xv6. У меня есть вопрос к приведенному ниже фрагменту кода. Я знаю, что entrypgdir — это массив типа pde_t размером NPDENTRIES. Но что означает «[0] = (0) | PTE_P | PTE_W | PTE_PS»? заранее спасибо

__attribute__((__aligned__(PGSIZE)))
pde_t entrypgdir[NPDENTRIES] = {
  // Map VA's [0, 4MB) to PA's [0, 4MB)
  [0] = (0) | PTE_P | PTE_W | PTE_PS,
  // Map VA's [KERNBASE, KERNBASE+4MB) to PA's [0, 4MB)
  [KERNBASE>>PDXSHIFT] = (0) | PTE_P | PTE_W | PTE_PS,
};


xv6
person Bongjoon Hyun    schedule 27.10.2019    source источник


Ответы (1)


Код инициализирует содержимое каталога страниц. (См. инициализацию назначенного массива в 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