【Linux内核学习】开机引导
基于内核0.11分析
CPU只能从内存执行程序,不能从硬盘运行。刚开机时,内存中是空的,电脑上电的瞬间,根据CPU硬件的设计:加电就进入16位实模式状态运行,同时CPU的CS、IP寄存器被设置为0xF000、0xFFF0,指令的内存地址设置为0xFFFF0(CS:代码段寄存器,IP:指令指针寄存器,这对寄存器用于确定CPU正在执行的指令的内存地址:CS * 16 + IP),0xFFFF0指向BIOS的入口地址,此时CPU从0xFFFF0执行代码。
在实模式下,CPU的寻址方式是通过物理地址进行的,即直接使用段寄存器和偏移地址来计算出物理地址。由于实模式没有分页机制和内存保护机制,所以程序可以直接访问整个物理内存空间,包括操作系统内核和应用程序之间的内存。
通过双向约定,BIOS的第一条代码也设置在0xFFFF0,CPU物理寻址开始运行BIOS,
其中的操作有机器自检、加载BIOS中断向量表、BIOS数据区、BIOS中断服务程序到内存中,最后发送BIOS中断0x19 ,中断向量表中0x19会把CPU指向0x0E6F2,即0x19中断对应的中断服务程序入口地址,功能就是将启动盘的引导分区加载到内存中(根据双向约定,引导分区应位于整个硬盘的0磁道0柱面1扇区)。
Linux0.11内核的引导程序就是bootsect,到这其实代码进入了内核的代码段了,紧接着由bootsect规划内存,然后通过调用BIOS之前加载在内存中的中断0x13(功能是把指定扇区加载到指定内存位置)把setup加载到内存(紧挨着bootsect地址之后),以及系统模块载入到内存,确定根设备号之后,开始运行setup。
setup第一件事利用BIOS的中断程序从设备提取内核所需的机器系统数据,包括光标位置、显示页面、硬盘参数表1、硬盘参数表2、根设备号等数据。这些数据被加载到0x90000-0x901fc,为之后的main行数执行发挥作用。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!