从开机加电到执行main函数之前的过程

环境:linux-0.11系统,x86-CPU构架

从开机加电到执行main函数之前的过程

分三步完成:

1.启动BIOS,准备实模式下的中断向量表和中断服务程序

2.从启动盘加载操作系统程序到内存,加载操作系统程序的工作是利用第一步中准备的中断服务程序实现的

3.为执行32位的main函数做过渡工作。

注:什么是实模式/保护模式?

 

1.1  0xFFFF0

CPU硬件逻辑设计为加电瞬间强行将CS的值置为0xFFFF,IP的值置为0x0000,CS:IP为0xFFFF0,0xFFFF0指向BIOS地址范围。

BIOS的入口地址就是0xFFFF0.

BIOS程序在内存最开始的位置(0x00000)用1KB的内存空间(0x00000~0x003FF)构建中断向量表,并在紧挨着它的位置用256字节的内存空间构建BIOS数据区(0x00400~0x004FF),在大约56KB以后的位置(0x0E05B)加载了8KB左右的与中断向量表相应的若干中断服务程序。

中断向量表中有256个中断向量,每个中断向量占4个字节,其中两个字节是CS的值,两个字节是IP的值,每个中断向量都指向一个具体的中断服务程序。

 

1.2  加载操作系统内核程序并为保护模式做准备

分三批逐次加载内核代码:

第一批由BIOS中断int 0x19h把第一扇区bootsect的内容加载到内存

第二批和第三批在bootsect的指挥下,分别把其后的四个扇区和随后的240个扇区的内容加载到内存

 

1.2.1  加载第一部分代码----引导程序(bootsect)

计算机硬件体系结构设计与BIOS联手操作,会让CPU接收到一个int 19h中断,CPU接收到这个中断后,会立即在中断向量表中找到此中断。中断向量把CPU指向0x0E6F2,即中断服务程序的入口地址。作用就是把软盘的第一个扇区中的程序(bootsect 512B)加载到内存的0x07C00处。

 

1.2.2  加载第二部分代码-----setup

1.  Bootsect对内存的规划

要加载的setup程序的扇区数(SETUPLEN)

被加载到的位置(SETUPSEG)

启动扇区被BIOS加载的位置(BOOTSEG)

将要移动到的新位置(INITSEG)

内核被加载的位置(SYSSEG)

内核的末尾位置(SYSEND)

根文件系统设备号(ROOT_DEV)

2.复制bootsect

Bootsect将自身从内存0x07C00(BOOTSEG)处复制到内存(0x90000INITSEG࿰

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值