pagetable_init()根据物理内存初始化页目录项及页表项
static
void
__init pagetable_init (
void
)
{
unsigned long vaddr;
pgd_t *pgd_base = swapper_pg_dir;

#ifdef CONFIG_X86_PAE
int i;
//初始化整个页目录项(1024项)
for (i = 0; i < PTRS_PER_PGD; i++)
set_pgd(pgd_base + i, __pgd(__pa(empty_zero_page) | _PAGE_PRESENT));
#endif

if (cpu_has_pse) {
set_in_cr4(X86_CR4_PSE);
}
if (cpu_has_pge) {
set_in_cr4(X86_CR4_PGE);
__PAGE_KERNEL |= _PAGE_GLOBAL;
__PAGE_KERNEL_EXEC |= _PAGE_GLOBAL;
}
kernel_physical_mapping_init(pgd_base);
remap_numa_kva();
vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
page_table_range_init(vaddr, 0, pgd_base);

permanent_kmaps_init(pgd_base);

#ifdef CONFIG_X86_PAE
pgd_base[0] = pgd_base[USER_PTRS_PER_PGD];
#endif
}
static
void
__init pagetable_init (
void
)
{
unsigned long vaddr;
pgd_t *pgd_base = swapper_pg_dir;
#ifdef CONFIG_X86_PAE
int i;//初始化整个页目录项(1024项)
for (i = 0; i < PTRS_PER_PGD; i++)
set_pgd(pgd_base + i, __pgd(__pa(empty_zero_page) | _PAGE_PRESENT));
#endif
if (cpu_has_pse) {
set_in_cr4(X86_CR4_PSE);
}
if (cpu_has_pge) {
set_in_cr4(X86_CR4_PGE);
__PAGE_KERNEL |= _PAGE_GLOBAL;
__PAGE_KERNEL_EXEC |= _PAGE_GLOBAL;
}
kernel_physical_mapping_init(pgd_base);
remap_numa_kva();
vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
page_table_range_init(vaddr, 0, pgd_base);
permanent_kmaps_init(pgd_base);
#ifdef CONFIG_X86_PAE
pgd_base[0] = pgd_base[USER_PTRS_PER_PGD];
#endif
}
本文介绍了Linux内核中页表初始化的过程,包括页目录项和页表项的初始化,并针对不同配置如PAE和PSE进行特定设置。此外还涉及了CR4寄存器的配置、物理内存映射初始化等关键步骤。

2456

被折叠的 条评论
为什么被折叠?



