1.3.5 head.s开始执行(4)
来源:互联网 发布:php文件管理插件 简洁 编辑:程序博客网 时间:2024/04/20 13:19
1.3.5 head.s开始执行(4)
确定A20地址线已经打开之后,head程序如果检测到数学协处理器存在,则将其设置为保护模式工作状态,图1-33给出了示意。
图1-33 检测数学协处理器小贴士
x87协处理器:为了弥补x86系列在进行浮点运算时的不足,Intel于1980年推出了x87系列数学协处理器,那时还是一个外置的、可选的芯片(笔者当时的80386计算机上就没有安装80387协处理器)。1989年,Intel发布了486处理器,自此之后,CPU一般都内置了协处理器。这样,对于486以前的计算机而言,操作系统检验x87协处理器是否存在就非常必要了。
检测数学协处理器对应的代码如下:
- //代码路径:boot/head.s
- movl %cr0,%eax
- ......
- call check_x87
- check_x87:
- ......
- ret
head程序将为调用main函数做最后的准备,这是head程序执行的最后阶段,也是main函数执行前的最后阶段。
执行代码如下:
- //代码路径:boot/head.s
- jmp after_page_tables
- after_page_tables:
- pushl $0
- pushl $0
- pushl $0
Linus在代码中的原注释是“These are the parameters to main :-)”,但实际上我们并没有看到,也没有测试到main函数使用这三个参数,具体如图1-34下方的标示。
图1-34 将envp、argv、argc压栈head程序将L6标号和main函数入口地址压栈,栈顶为main函数地址,目的是使head程序执行完后通过ret指令就可以直接执行main函数,具体请见图1-35下方的标示。
如果main函数退出,就会返回到这里的标号L6处继续执行下去,并产生死循环。
执行代码如下:
- //代码路径:boot/head.s
- pushl $L6
- pushl $_main
这些压栈动作完成后,head程序将跳转至setup_paging:去执行,开始创建分页机制。
首先会将页目录表和4个页表放在物理内存的起始位置。从内存起始位置开始的5页空间内容全部清零(每页4KB),为初始化页目录和页表做准备。注意,这个动作起到了用一个页目录表和4个页表覆盖head程序自身所占内存空间的作用。图1-36下方给出了直观的示意图。
上述动作的执行代码如下:
- //代码路径:boot/head.s
- jmp setup_paging
- setup_paging:
- movl $1024*5,%ecx
- xorl %eax,%eax
- xorl %edi,%edi
- cld;rep;stosl
点评
将页目录表和4个页表放在物理内存的起始位置,这个动作的意义重大,是操作系统能够掌控全局、掌控进程在内存中安全运行的基石之一,后续章节会逐步论述。
head程序将页目录表和4个页表所占物理内存空间清0后,设置页目录表的前4项,使之分别指向4个页表,如图1-37左下方所示。
- 1.3.5 head.s开始执行(4)
- 1.3.5 head.s开始执行(5)
- 1.3.5 head.s开始执行(1)
- 1.3.5 head.s开始执行(2)
- 1.3.5 head.s开始执行(3)
- 1.3.5 head.s开始执行(6)
- 1.3.4 为在保护模式下执行head.s做准备
- head.s
- head.s
- head.s分析(5):关闭串口
- linux2.4 启动代码head.S分析
- Head.s分析(4):关闭CACHE
- linux2.4 启动代码head.S分析
- head-armv.S分析(转)
- Linux启动过程分析(head.s)
- Compressed 'head.S'
- Linux/boot/head.S
- linux-head.s
- 达内学习日志Day19:Java核心API(集合<二>)
- hdu4296Buildings 贪心
- 资讯:体感技术Kinect
- Maven学习总结(九)——使用Nexus搭建Maven私服
- 第六周项目(5):后缀表达式
- 1.3.5 head.s开始执行(4)
- Unity Shader 什么是法线贴图
- hdu4292Food 最大流
- 1.3.5 head.s开始执行(5)
- 报表增删改开发过程中知识整合
- 数值优化(Numerical Optimization)学习系列-目录
- 关于要不要为oracle listener设置密码的问题
- C#Connection must be valid and open?
- 1.3.5 head.s开始执行(6)