О функции arm64 early_pgtable_alloc - PullRequest
       37

О функции arm64 early_pgtable_alloc

0 голосов
/ 25 октября 2019

Фон:

версия ядра: 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} могут активно использоваться. Разве это не конфликт?

Спасибо!

...