操作系统启动的伯乐---BIOS

下面是自己在学习中的理解,如果有错的,请高手帮忙指出来。谢谢!微笑

BIOS其实就是固化在计算机主板上ROM中的一段程序,主要用于开机后对计算机硬件的自检测,操作系统的引导等。可以说BIOS所做的一切就是为了能让后面操作系统这匹千里马纵横于计算机这片”大草原“奠定基础。

1. BIOS的编址

如果我们要写信,一会要知道对方的收信地址,然后邮局通过这个地址把信件顺利地送到收件人手里。其实计算机和写信一样,它要运行程序,必须知道程序的位于哪里。一般CPU采用如下两种编址方式:

A. 统一编址:将内存和I/O控制器一起编址,即,从内存中预留一部分空间用于映射I/O地址,这样从CPU的角度,内存和I/O没有本质的区别,当需要访问I/O控制器时,就可以直接操作对应的内存地址即可。但这种方式的缺点是,会占用一部分内存地址空间。

B. 独立编址:和统一编址相反,它是将内存和I/O控制器分开编址。优点是不需要从内存中划出指定的空间来映射I/O。缺点是需要专门的I/O指令(例如IN/OUT指令)来访问其控制器。

Intel x86架构其实两种方式都采用了,对I/O是采用独立编址的,但对ROM一般是采用统一编址的方式。因此对ROM BIOS是采用统一编址方式。一般情况,会将ROM BIOS编在内存最高地址处。

2. 8086的启动流程

Intel早期的CPU,只有20位地址线和实模式,所以它的寻址空间只有0xFFFFF(1Mb)。根据在1. BIOS的编址中讨论的,ROM BIOS被编址在0xFFFF0处,这个地址是由硬件设计决定的。但我们发现0xFFFF0到0xFFFFF只有16byte,BIOS不可能就这一点空间,所以聪明的你一定能想到,一定是 BIOS做了什么处理。没错,在这16byte只是存储了一个jmp指令。

有了上面的基础,我们来整理下,当你从开机后,BIOS都做了些什么事:

A. 当计算机上电后,CPU会将CS设成0xF000,IP设成0xFFF0。在实模式下,根据公式:物理地址=CS*0x10+IP。即BIOS位于0xFFFF0处,这个地址当就是BIOS程序的第一条指令的地址。

B. 当从0xFFFF0处执行时,碰到的第一条指令就是jmp,CPU会跳到BIOS中最先需要执行的程序中去运行。这个程序就是POST(power-on self test)

C. POST其实还分基本POST,VGA BIOS检查,Full POST。主要是对CPU、系统主板、基本640kb内存等的检查。

D. 为了引导操作系统,BIOS在内存构建中断向量表和中断服务程序。中断向量表一般位于内存的起始处,即从0x00000处开始的1k空间(因为有256个中断,每个中断向量就是中断服务程序的地址-4byte)。这也是后面会看到linux内核的system模块为什么不能一开始就放到0x00000处,因为会破坏BIOS的中断向量表。在中断向量表后面是BIOS数据区,一共是256 byte。最后将中断服务程序读到内存中,大概是从0x0E05B开始的8kb空间。

E. 到这里可以利用BIOS中断来引导操作系统了。计算机会产生一个0x19的中断给CPU,CPU收到此中断后,会从0柱面,0磁道,1扇区去读bootsect.s到内存的0x07C00处。

3. 386及以后的CPU启动

我们知道,到386,地址总结已经被扩展到了32位。所以CPU可以寻址到0xFFFF,FFFF,即4G的内存空间。这时内存大概可以分为:

0~640k:用于linux操作系统内核的代码和数据

640k~1M:用于ROM shadow,这里我的理解是为了兼容像8086这样早期CPU,把ROM的代码映射到此区域。

剩下的用于主内存,但如果有虚拟盘和高速缓冲,也会占用主内存中的空间

我们再来看看386的启动,和8086只有一点差别:

由于386可以寻址4G空间,为了保证内存的连续一致性,注意,这时BIOS并不位于0xFFFF0处了,而是位于内存的最后16个byte处,即0xFFFF,FFF0。但CS和IP还是和8086的值一样,原来这里,CPU会把地址结的高12位利用硬件技术全部置1。所以高12位对我们是不可见的。在POST后,CPU会把BIOS的数据和代码复制到和8086兼容的0xFFFF0处,以后CPU就直接从这里访问BIOS。其他的都和8086的启动一样了。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值