Фон:
версия ядра: v4.14.149
Показать код первый:
void __init paging_init(void)
{
phys_addr_t pgd_phys = early_pgtable_alloc(); /* My first question */
/* pgd_set_fixmap(pgd_phys) maps FIX_PGD with pgd_phys */
pgd_t *pgd = pgd_set_fixmap(pgd_phys); /* My second question */
...
}
static phys_addr_t __init early_pgtable_alloc(int shift)
{
phys_addr_t phys;
void *ptr;
phys = memblock_phys_alloc(PAGE_SIZE, PAGE_SIZE);
if (!phys)
panic("Failed to allocate page table page\n");
/*
* The FIX_{PGD,PUD,PMD} slots may be in active use, but the FIX_PTE
* slot will be free, so we can (ab)use the FIX_PTE slot to initialise
* any level of table.
*/
/* the comment above makes me confused */
ptr = pte_set_fixmap(phys);
memset(ptr, 0, PAGE_SIZE);
/*
* Implicit barriers also ensure the zeroed page is visible to the page
* table walker
*/
pte_clear_fixmap();
return phys;
}
IФункция Know early_pgtable_alloc()
сначала выделяет память блока размером PAGE_SIZE, используя memblock_alloc
, а затем сопоставляет FIX_PTE с выделенной памятью, чтобы очистить память блока, и, наконец, очищает отображение FIX_PTE и физ.
Q1: Но почему функция early_pgtable_alloc()
использует FIX_PTE для сопоставления? И комментарий кода гласит:
Слоты FIX_ {PGD, PUD, PMD} могут активно использоваться, но слот FIX_PTE будет свободен, поэтому мы можем (ab) использовать FIX_PTEслот для инициализации любого уровня таблицы.
Q2: In paging_init()
, вызывается pgd_set_fixmap
. Но выше, early_pgtable_alloc()
говорит:
Слоты FIX_ {PGD, PUD, PMD} могут активно использоваться. Разве это не конфликт?
Спасибо!