未解压缩时的内核页表
来源:互联网 发布:java中无参构造方法 编辑:程序博客网 时间:2024/06/02 02:20
这或许是x86平台启动过程中第一张页表了。
之前我们也学习了内核启动镜像bzImage由两部分组成setup.bin和vmlinux.bin。而这张第一章页表就在vmlinux.bin的head.S中。
如果对上述两个文件编译过程不熟悉的话可以参考下面的链接:
- 如何编译&生成bzImage – 启动镜像
- 真假vmlinux–vmlinux.bin揭开的秘密
先来看个代码
这第一张页表初始化的代码就在arch/x86/boot/compressed/head_64.S中。
/* * Build early 4G boot pagetable */ /* Initialize Page tables to 0 */ leal pgtable(%ebx), %edi xorl %eax, %eax movl $(BOOT_INIT_PGT_SIZE/4), %ecx rep stosl /* Build Level 4 */ leal pgtable + 0(%ebx), %edi leal 0x1007 (%edi), %eax movl %eax, 0(%edi) /* Build Level 3 */ leal pgtable + 0x1000(%ebx), %edi leal 0x1007(%edi), %eax movl $4, %ecx1: movl %eax, 0x00(%edi) addl $0x00001000, %eax addl $8, %edi decl %ecx jnz 1b /* Build Level 2 */ leal pgtable + 0x2000(%ebx), %edi movl $0x00000183, %eax movl $2048, %ecx1: movl %eax, 0(%edi) addl $0x00200000, %eax addl $8, %edi decl %ecx jnz 1b /* Enable the boot page tables */ leal pgtable(%ebx), %eax movl %eax, %cr3
干这么看确实有点枯燥,不过简单来说就是分别填写了三层结构,构造出了一张覆盖4G大小的页表。
再来看一张图
看着图再去对照代码,我相信你就可以看懂了。
这样是不是清晰了很多。
代码我就不多说了,多看几遍自然就懂了。正所谓
代码虐我千百遍,我待代码如初恋
重要提醒
大家看这张表,有没有意识到什么特别的地方?
对了,虚拟地址和物理地址是一样的~
0 0
- 未解压缩时的内核页表
- 解压缩内核
- 4.1.2 解压缩内核
- 获取未导出的内核函数地址
- 如何调用内核未导出的函数
- ubuntu编译安卓内核时arm-eabi-gcc :命令未找到的解决方法
- 获取Linux内核未导出符号的几种方式
- 内核对象的两种状态 激活 未激活
- 获取Linux内核未导出符号的几种方式
- 获取Linux内核未导出符号的几种方式
- linux启动流程分析-内核解压缩过程
- 内核gzip压缩与解压缩介绍
- linux内核启动地址 解压缩 启动参数
- (收集/整理)linux 内核启动 解压缩
- linux启动流程分析-内核解压缩过程
- linux内核启动地址,解压缩,内核参数问题探讨
- linux内核启动地址,解压缩,内核参数问题探讨【转】
- 读Kernel感悟-Linux内核启动-内核解压缩
- Java内存管理的小技巧
- 时钟节拍
- HDU1233 还是畅通工程(最小生成树模板题,Prime,kruskal算法)
- 欢迎使用CSDN-markdown编辑器
- C++学习书单
- 未解压缩时的内核页表
- Resin_安装_改端口_解析
- 【USACO5.1.1】圈奶牛(BSOI2142)
- udp改变缓冲区大小
- 解决因 RsFX devicer 而无法卸载 SQL Server 的问题
- 类方法和实例方法的区别
- PAT_A 1120. Friend Numbers (20)
- iOS 一个方法首次安装滚播图 展示应用简介
- bat批处理编程基本语法2