linux内核页表初始化,初始化内核页表

本文详细介绍了Linux内核页表的初始化过程,包括两个阶段:在未启动分页机制下初始化8MB的内核页表,以及启用分页后的最终内核页表初始化。内容涵盖startup_32函数中的页表初始化代码解析,以及paging_init函数中的操作,如设置cr3、cr4和TLB刷新等步骤。
摘要由CSDN通过智能技术生成

内核维持着一组自己使用的页表,驻留在主内核全局目录中,主内核页全局目录的最高目录项部分作为参考模型,为系统中每个普通进程对应的页全局目录项提供参考模型(进程的内核态从oxc0000000-----oxffffffff的线性地址!)

内核页表的初始化化分为2个阶段:

第一阶段:在还未启动分页机制下初始化化一个寻址范围在0---8M的内核页表,这个最小限度的地址空间仅能内核装载到RAM和对其初始化核心数据结构。该部分是由startup_32()汇编语言函数实现的(arch/i386/kernel/head.s)以下是startup_32中初始化内核页表的代码片段及其解析:

page_pde_offset = (__PAGE_OFFSET >> 20);

movl $(pg0 - __PAGE_OFFSET), %edi

movl $(swapper_pg_dir - __PAGE_OFFSET), %edx

movl $0x007, %eax   /* 0x007 = PRESENT+RW+USER */

10:  /*初始化页目录表*/

leal 0x007(%edi),%ecx   /* Create PDE entry */

movl %ecx,(%edx)   /* Store identity PDE entry */

movl %ecx,page_pde_offset(%edx)  /* Store kernel PDE entry */

addl $4,%edx

movl $1024, %ecx   /*设置循环次数*/

11:              /*初始化页表*/

stosl

addl $0x1000,%eax

loop 11b

/* E

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值