着手建立内核永久页表

在Linux系统启动过程中,初始化内核页表是一个关键步骤。本文详细介绍了如何从`setup_arch`开始,通过`init_memory_mapping`函数建立系统阶段的临时页表结构。涉及的函数包括`find_early_table_space`、`kernel_physical_mapping_init`等,这些函数共同作用于为内核页表分配和映射内存空间,为后续内存管理和分配提供基础。这一过程解释了为何在早期页表建立后,还需要构建最终的内核页表,以确保完整映射所有可用RAM。
摘要由CSDN通过智能技术生成

5.2.3 着手建立内核永久页表

得到了总的页面数max_pfn和高端页面数highmem_pages之后,来到setup_arch947行,调用init_memory_mapping()函数来建立系统初始化阶段的临时分页体系,传入的参数意义代表从0~max_low_pfn对应的32位物理地址(低12位全为0,也就是页面对齐),在函数init_memory_mapping函数中先后调用下面的几个函数来设置内存相关数据(因为bootmem此时没有初始化)

find_early_table_space()

kernel_physical_mapping_init()

early_ioremap_page_table_range_init()

load_cr3()

reserve_early()

 

其中,首先find_early_table_space 所实现的功能是相当重要的:

 

  32static void __init find_early_table_space(unsigned long end, int use_pse,

  33                                          int use_gbpages)

  34{

  35        unsigned long puds, pmds, ptes, tables, start;

  36

  37        puds = (end + PUD_SIZE - 1) >> PUD_SHIFT;

  38        tables = roundup(puds * sizeof(pud_t), PAGE_SIZE);

  39

  40        if (use_gbpages) {

  41                unsigned long extra;

  42

  43                extra = end - ((end>>PUD_SHIFT) << PUD_SHIFT);

  44                pmds = (extra + PMD_SIZE - 1) >> PMD_SHIFT;

  45        } else

  46                pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值