+ -
当前位置:首页 → 问答吧 → 关于“从开机到内核开始引导”的一些个人理解

关于“从开机到内核开始引导”的一些个人理解

时间:2003-10-04

来源:互联网

下面是我看书后的理解,请大家批评指出。 本人对汇编还是很生疏的。
I386 PC开机后,CPU处于实地址模式(实地址模式下CPU只能存取20位地址),并置代码段寄存器CS的内容为0xffff0,取指令指针寄存器IP的内容为0,也就是说从线性地址0xffff0处开始取第一条指令。目前的ROM BIOS都有在启动时自动将自己以镜像形式复制到RAM中的功能,而其复制到的地址也正好是0xffff0,所以,很自然的CPU在PC机启动后读取的第一条指令就来自于ROM BIOS。
那这第一条指令究竟是条什么指令呢?
ROM BIOS在0xffff0处的第一条指令为:“FFFF0:JMP START”,这是一条汇编指令,意思是说CPU要执行的下一条指令在“START”所指的地址处。如前所述,在实模式下的CPU只能存取1M的地址空间,而0xffff0已是顶端,所以只能跳到别处去(只能向低地址方向跳)。而“START”所指的这个地址是随BIOS厂商或BIOS版本的不同而不同的。
一般情况下,从0xf0000到0xffff0的这64k的内存区域就是ROM BIOS的镜像区域,即“START”的值为“0xf0000”。紧接着,BIOS自检开始(BIOS的自检过程是严格按序的)在自检过程中的一些需显示的信息(即PC机开机信息)通过显卡显示在屏幕上,地址A0000到BFFFF为显示缓冲区。
一旦BIOS完成自检和初始化工作后,BIOS便通过软中断INT19H引导系统。如果你的操作系统在软盘上,则INT19H读引导扇区到内存0x07C00处;如果操作系统在硬盘上,则也读引导扇区到内存0x07C00处;如果两者都没有引导扇区,则INT19H调用INT18H到ROM BASIC或显示无操作系统,BIOS进入死循环。

注:ROM是一种硬件,BIOS是指ROM中存储的程序(软件),ROM BIOS是指ROM中存储的BIOS程序。而CMOS是指调用BIOS的软件。


:(

作者: nike333   发布时间: 2003-10-04

这里面不可能全对,肯定有错误。我把它贴出来的原因不是要班主说它精,而是要高手们批评指出问题的呀!

我希望大家都来,最后改到完美后使所有初学者都能收益。

作者: nike333   发布时间: 2003-10-04

朋友我学的不精,看不出问题,如果地址没有错误。看起来也差不多是那么回事,好像没有问题。
你说引导扇区是由int19 放到内存的。我有一点不明白,是怎样判断引导扇区在什么硬件上的。现在bios 可引导的硬件很多,
usb 二种,zip, floppy, cd-rom,ide(硬盘)。
哦,想起来了,bios 由cmos 设置的,可进行设置三种,(现在的一般机器)。

作者: wide288   发布时间: 2003-10-08

这只是一个次序的问题,也就是说,BIOS是挨个检查每一个硬件的。
谁先谁后由你自己的CMOS设置决定。
至于支持多硬件的问题,这只不过是BIOS的功能加强了。你也知道BIOS的基本功能就是在开机后的第一时间去收集各个硬件的中断、IO号等等。
希望我的回答能你满意。

作者: nike333   发布时间: 2003-10-09

通过一起旨在将Windows操作系统与PC的基本组成部分——BIOS更紧密集成的交易,微软公司已经扩展了与BIOS厂商Phoenix科技公司之间的合作关系。

  二家公司称,本周公布的这一交易旨在使PC更简单和更可靠。由于微软和Phoenix计划  在操作系统和硬件层次集成数字化版权管理系统(DRM),它们的合作将引起消费者权益组织的警觉。DRM管理旨在使版权拥有者能够对用户使用内容和软件的方式有更多的控制,但被批评为侵犯了消费者的权益。

  BIOS将操作系统与硬件紧密地联系起来,传统上,它执行硬件和系统配置等基本任务,由于标准化程度较高和足够简单,使得PC能够安装包括Linux在内的其它操作系统。

  Phoenix公司的核心系统软件(CSS)是与操作系统更紧密集成的新一代BIOS,例如,它能够使系统管理员更方便地远程监控系统的硬件配置。CSS不仅适用于传统的台式机,也适用于刀片式服务器、嵌入式工业控制设备等非PC类装置。

  微软公司称,整合意味着更简单和更可靠的计算机。该公司Windows硬件业务部门的总经理菲利浦在一份声明中说,这是计算机产业的一个关健变化,它将极大地提高服务器、移 动装置、台式机的可用性、可部署性和可管理性。Phoenix公司正在开发一类全新的系统软件。

  微软公司表示,只要刀片式服务器与系统相连,即使没有开启,新一代的BIOS将使未来版本的Windows能够对它们进行管理。它还能够对连接到系统中未经认证的装置进行更好的控制。

  Phoenix公司是最大的BIOS提供商之一,它的客户包括五大PC厂商中的四家,它的产品也得到了先锋、松下、索尼、东芝等家电厂商的青睐。 (eNet硅谷动力  )

------------------------------
从上面看出,我们知道上面这些,现在看就够了,之后就是操作系统的事了。以后随着bios 的发展,可能会更有趣。

作者: wide288   发布时间: 2003-10-10

既然此贴加精,那我就说两句,不一定对,请批评。
1.开机时代码段寄存器CS内容应为0xFFFF, IP寄存器为0x0000
2.系统BIOS并不是将自己复制到RAM中,而是本来就在那个地址空间中(机器设计时地址总线决定)
3.如果从硬盘引导,读的是硬盘的主引导扇区MBR,不是引导扇区
4.如果几种引导都不成功,并不进入死循环
5.CMOS的问题根本错了。CMOS是互补型金属氧化物半导体,存贮的是系统的一些信息,如时间,硬盘参数等。应该说是BIOS使用的可写的数据区。因为ROM不可写,RAM掉电后又失去信息,象系统时间、硬盘参数这些数据就写在CMOS里。
以上信息和linux内核其实没多大关系。

作者: trinity   发布时间: 2003-10-19

谢谢你帮我指出了问题,其实我在发这封帖子的时候也不敢肯定自己是对的。再次谢谢你的帮助。

作者: nike333   发布时间: 2003-10-27

FFFF0:JMP START 就是为了引导失败后可以循环??

作者: gradetwo   发布时间: 2004-10-27

有点不对的说。其实一开机的时候CS里是F000H,而他的base地址是FFFF0000H,ip是FFF0H,所以是FFFFFFF0H。

作者: follow999   发布时间: 2004-12-06

引用:
最初由 trinity 发表
既然此贴加精,那我就说两句,不一定对,请批评。
1.开机时代码段寄存器CS内容应为0xFFFF, IP寄存器为0x0000
2.系统BIOS并不是将自己复制到RAM中,而是本来就在那个地址空间中(机器设计时地址总线决定)
3.如果从硬盘引导,读的是硬盘的主引导扇区MBR,不是引导扇区
4.如果几种引导都不成功,并不进入死循环
5.CMOS的问题根本错了。CMOS是互补型金属氧化物半导体,存贮的是系统的一些信息,如时间,硬盘参数等。应该说是BIOS使用的可写的数据区。因为ROM不可写,RAM掉电后又失去信息,象系统时间、硬盘参数这些数据就写在CMOS里。
以上信息和linux内核其实没多大关系。
第二点可能有点问题。

bios编译后的image文件一般是压缩的,所以先会执行它的自解压代码,把自己解压到ram区

作者: phyma   发布时间: 2004-12-07

引用:
最初由 phyma 发表
第二点可能有点问题。

bios编译后的image文件一般是压缩的,所以先会执行它的自解压代码,把自己解压到ram区
程序没在内存里时如何执行? 不能执行又如何解压? 所以最开始必然是硬件映射的. 否则根本无从开始.

作者: HaToTo   发布时间: 2004-12-10

精彩~~,希望各位高手能就此贴发表自己的看法,对错不要紧,没有错哪有对之说嘛!
关键是能进一步的弄清楚问题。

作者: sillysir   发布时间: 2004-12-10

引用:
最初由 HaToTo 发表
程序没在内存里时如何执行? 不能执行又如何解压? 所以最开始必然是硬件映射的. 否则根本无从开始.
可以直接在ROM执行。ROM本身就是地址空间的一部分。

你所说的从硬件映射开始我不理解,因为实模式硬件地址映射是取决于你怎样把cpu的针脚和硬件的针脚连接起来,不是软件的问题。第一条指令确实是在ROM区,如有疑问请参见intel的手册。

作者: phyma   发布时间: 2004-12-10

相当精彩哈,但是多少点遗憾,高手们多有保留,让菜鸟们看了后还是有点茫然

作者: westroom   发布时间: 2004-12-25

现在都是Grub的方式启动。

作者: aweil   发布时间: 2005-01-01

引用:
作者: aweil
现在都是Grub的方式启动。
grub是引导扇区里的程序装入的一个更大的引导程序。

作者: freesky64   发布时间: 2005-01-07

现在不太明白,等开学了我来给你找错

作者: jonw   发布时间: 2005-01-14

到图书馆,找一本386的微机原理有说的很清楚的了。不清楚再上贴。那些东西早忘了。大概原理是这样。

作者: zswlb9999   发布时间: 2005-01-28

ROM空间可以执行程序吗?ROM是不可以修改的,如何分配数据,堆栈这些,我觉得不太可能.倒是以前见过有人说有种flashrom可以执行程序

作者: chairman   发布时间: 2005-05-18

对于i386机器的启动以及初始化过程可能一些书上会说的很详细,我看在这里争论也没有什么意义。我想知道,如果通过实验、实践,如何查看到计算机启动初始化时寄存器里的一些内容的?就好像说,牛顿告诉了我们物理定律的内容,但却没有告诉我们如何思考得到的一样。

作者: hncw13   发布时间: 2005-05-18

引用:
作者: hncw13
对于i386机器的启动以及初始化过程可能一些书上会说的很详细,我看在这里争论也没有什么意义。我想知道,如果通过实验、实践,如何查看到计算机启动初始化时寄存器里的一些内容的?就好像说,牛顿告诉了我们物理定律的内容,但却没有告诉我们如何思考得到的一样。
告诉你一个办法。在dos下用dubug.exe从FFFF0去跟踪执行一遍启动过程。不要用保护模式(如:Windows或linux)下的debug,因为地址是虚的。

作者: masterdemon   发布时间: 2005-05-18

引用:
作者: trinity
既然此贴加精,那我就说两句,不一定对,请批评。
1.开机时代码段寄存器CS内容应为0xFFFF, IP寄存器为0x0000
2.系统BIOS并不是将自己复制到RAM中,而是本来就在那个地址空间中(机器设计时地址总线决定)
3.如果从硬盘引导,读的是硬盘的主引导扇区MBR,不是引导扇区
4.如果几种引导都不成功,并不进入死循环
5.CMOS的问题根本错了。CMOS是互补型金属氧化物半导体,存贮的是系统的一些信息,如时间,硬盘参数等。应该说是BIOS使用的可写的数据区。因为ROM不可写,RAM掉电后又失去信息,象系统时间、硬盘参数这些数据就写在CMOS里。
以上信息和linux内核其实没多大关系。
以上基本对,第三点进入回圈是对的。

作者: folklore   发布时间: 2005-05-21

引用:
作者: trinity
既然此贴加精,那我就说两句,不一定对,请批评。
2.系统BIOS并不是将自己复制到RAM中,而是本来就在那个地址空间中(机器设计时地址总线决定)
这一点我一直觉得很奇怪,如果地址总线上 0xa000 - 0x10000 被映射到 ROM 中,那么本来RAM 中有的这 384K 内存是不是就始终没有没映射地址了?还有 14M - 16M 的内存也是?

作者: crquan   发布时间: 2005-05-22

地址是在存储系统安排好后确定的,rom,ram,甚至flash都可以作为内存,然后进行统一编址,所以不是谁占了谁的位置,而是统一排队。
另外主引导扇区MBR实际上就是主引导扇区的一部分,主引导扇区512字节,其中MBR446字节,分区信息64字节,标识位2字节,大家所说的Grub就是主引导扇区的MBR中的引导程序,它将系统导入具体的系统,每个活跃的主分区也有一个引导扇区,它是引导这个主分区中的操作系统的。

作者: pillar   发布时间: 2005-05-30

内存其时并不完全指RAM,还包括主板的ROM,板卡的ROM,硬盘的ROM.....等等,当然还有板卡的RAM,如:显存,它们是一起编址的。实际上主要指640K——1M之间的地址,而0xFFFF0地址恰恰对应BIOS的第一条指令(跳转指令)。这些都是历史遗留下来的。

作者: minisunboy   发布时间: 2005-06-04

引用:
作者: minisunboy
如:显存,它们是一起编址的。实际上主要指640K——1M之间的地址,而0xFFFF0地址恰恰对应BIOS的第一条指令(跳转指令)。这些都是历史遗留下来的。
何谓一起编址呢?
如买的内存条上有128M内存,也就是RAM有128M,应该编址从0-0x07ffffff,如果是将RAM和ROM连续编再一起,那加一下最后地址是0x07ffffff+384K+...,而最后地址0x07ffffff说明内存条上的640K-1M间的384K的空间被浪费了,是这样吧?

作者: crquan   发布时间: 2005-06-05

引用:
作者: crquan
何谓一起编址呢?
如买的内存条上有128M内存,也就是RAM有128M,应该编址从0-0x07ffffff,如果是将RAM和ROM连续编再一起,那加一下最后地址是0x07ffffff+384K+...,而最后地址0x07ffffff说明内存条上的640K-1M间的384K的空间被浪费了,是这样吧?
x86实模式只识别0-1M的内存,因为8086只有20根地址线。

作者: minisunboy   发布时间: 2005-06-06

问题太多了,都不知道先回答哪一个(而且很多问题本身就有问题:()

一刀切吧,比较物理地简略描述一下现代PC开机时候的情况:

cpu(386+)在侦测到reset引脚保持低电平一段时间后,便开始BIST硬件初始化,把
内部寄存器恢复成默认值,然后开始执行指令0xffffff0,注意不是0xffff0。

cpu在取指阶段把0xffffff0写到系统总线,北桥芯片一般会把这个高地址直接forward到南桥芯片,南桥芯片再根据情况把这个读指令的地址forward到FWH 或者LPC,再到bios芯片。bios在把第一条指令通过-〉FWH/LPC-〉南桥-〉北桥-〉CPU。
cpu完成取指,开始执行第一个指令。

所以南桥芯片在这里是关键的,他一般会把高地址0xfff80000~0xffffffff,0xffe80000~0xffefffff(A20 兼容)映射到bios芯片。(可能还有其他很多高地址段都被同时映射到了bios flash中间)

以上是粗糙的描述,更细节的问题就硬件相关了,如果有疑问也可以继续探讨,我会以p4+865+ich5为例说明。

作者: phyma   发布时间: 2005-06-06

这个问题还是没说清。

我想知的是既然在系统启动后只要引用到640K-1M间的地址就会到BIOS上去找,
那么我的128M的RAM中顺序数下来的640K-1M间的RAM是不是始终没法用上了?

作者: crquan   发布时间: 2005-06-22

BIOS: a b c
RAM: 123456

统一编址后: 123abc456
对应的地址为: 123456789
456对应BIOS的abc
123789对应RAM中的123456
明白了吧!

作者: pillar   发布时间: 2005-06-23

我是说如果将我的192M物理内存(RAM)编址为0x00000000-0x0c000000,是这样吧?
但是CPU引用物理地址640K-1M间的地址时,内存总线就自动到ROM中去读了,对吧?
那么本身RAM中编址的640K-1M间的那么些空间就始终不能被读写了?因为它们被ROM给盖住了?

作者: crquan   发布时间: 2005-06-24

回楼上的,你说的特定条件下是对的。
比尔盖茨说过“640K对任何人都足够了。”
为什么是640,就是这个原因。
原来在DOS下,要访问大于640K的内存,是要OS支持的,记得有个什么HIMEM什么的东西。
但是,在保护模式下,就不一样了。
菜鸟的个人理解,各位轻拍,^_^

作者: lollipop   发布时间: 2005-08-19

靠,什么理解能力啊,人家说得已经很清楚了。
谁有规定ram编址必须连续么?
所以0xA0000 - 0x0FFFFF 是rom的地址
0x00000000-0x00009FFFF和0x000100000-0x0C00FFFFF是你的ram。

作者: yzx_1983   发布时间: 2005-11-08

这个问题曾想了很久,到底是干脆放弃这 384K 内存不用呢,还是 RAM 编址不连续呢?

没有一个权威的材料。

作者: crquan   发布时间: 2005-11-09

引用:
作者: crquan
我是说如果将我的192M物理内存(RAM)编址为0x00000000-0x0c000000,是这样吧?
但是CPU引用物理地址640K-1M间的地址时,内存总线就自动到ROM中去读了,对吧?
那么本身RAM中编址的640K-1M间的那么些空间就始终不能被读写了?因为它们被ROM给盖住了?
我想你把物理地址和RAM的虚拟地址概念扯混了,其实对于某个体系结构,都会对不同的设备在物理地址中配置在不同的物理地址区域;
如你所说的192M物理内存(RAM)的物理编址可以为0x00000000-0x0c000000,也可以为0x00000ff-0x0c0000ff

作者: Roc&Linux   发布时间: 2006-03-17

个人理解:640k--1M ram部分会留给video 得buff ,剩下的就给其它设备的option rom (包括可启动的设备),注意这里是把option rom 里的内容全部放到ram中,这段地址其实是被用掉了。至于为啥不直接访问设备的option rom 呢?原因是访问rom的速度要比访问ram的速度慢上很多。

作者: ayer   发布时间: 2006-03-31

关于ROM的问题,上述讨论的焦点是以下几点:
1:ROM能不能执行程序,我可以很明确的以实践告诉大家,代码的确可以放在ROM里执行(我曾在TI的54xDSP上作过),对于需要Write的数据可以放入RAM,仅此而已。
2:关于启动时代码映不映射我对386不太懂,但是我在用DSP时发现,映不映射是与CPU配置有关。
3:对于8086讲,不管映不映射,执行的第一条代码的地址是由CS和IP的值决定(其实对于8086,不仅仅是启动的时候才是这样,在运行时也是这样,这是因为8086的寄存器是16位的,而地址线是20位的),所以CPU执行的第一条指令在0xFFFF0,然后再跳转。
4:如果(假如)是我来设计BIOS我会将BIOS分成两部分,Bootloader和硬件初始化程序,并按下面的过程
org 0xFFFF0
jump BootLoader

org 0xF0000 //假设BIOS的ROM地址的开始
BootLoader:/*以下代码完成硬件初始化程序向RAM的搬移*/
/*为什么要搬移,原因有两点,1:加快运行速度,2,开发者为了节省ROM,
往往都把程序压缩放入ROM,那么压缩的是什么呢?是程序的未初始化段 (UNINITIALIZED Section),也就是只需要分配空间不要付初值的段,这样只需要在RAM 中分配这些段,不必把它们放入ROM,呵呵我在做6XDSP加载的时候就是这样做的*/
...............
..............
/*假设初始化程序的入口为_C_int*/
jump _C_int
end;

顺便,关于统一编址的问题关键是CPU怎样来看地址线,以及地址线上设备是怎样挂的。

以上只是我个人的理解,请大虾排砖

作者: ARM-Linux   发布时间: 2006-03-31

在早期的机器里面ROM并不比RAM慢,所以没有把ROM复制到RAM执行这一说。

当时的机器640K-1M这一段的RAM是否存在看机器的生产厂家怎么配置。最早的8086/8088不少是没有的,后来的286大多是有这384K内存的。不过即使有384K内存,因为寻址空间被BIOS和各种硬件占用了,所以也不能直接使用。这也是为什么后来出现Expanded Memory这种标准的原因。在硬件的支持下,软件可以通过一个64K的窗口和切换页面的方式来访问多出来的RAM,当然这时候就不限于384K了,更多的RAM都可以通过这种方式来访问。这种方式使得8086/8088这种20根地址线的CPU也能访问超过1M的内存,当然前提是需要相应的硬件支持。286虽然多了4根地址线,也有了保护模式,但是在我印象中主流仍然是用这种方式在实模式下访问多余内存。386之后好像大多是用保护模拟来模拟实现EMS了,毕竟用单独的硬件切换页面速度太慢了。

另外,当时不管有没有多出来的384K,显存都是单独在显卡上实现的,不占用系统的主存。它占用的只是寻址空间而已。

到很后来,RAM越来越快,同时越来越不值钱,这时候才有BIOS复制到RAM中执行。

引用:
作者: ayer
个人理解:640k--1M ram部分会留给video 得buff ,剩下的就给其它设备的option rom (包括可启动的设备),注意这里是把option rom 里的内容全部放到ram中,这段地址其实是被用掉了。至于为啥不直接访问设备的option rom 呢?原因是访问rom的速度要比访问ram的速度慢上很多。

作者: woolzey   发布时间: 2006-04-04

引用:
作者: woolzey
在早期的机器里面ROM并不比RAM慢,所以没有把ROM复制到RAM执行这一说。

当时的机器640K-1M这一段的RAM是否存在看机器的生产厂家怎么配置。最早的8086/8088不少是没有的,后来的286大多是有这384K内存的。不过即使有384K内存,因为寻址空间被BIOS和各种硬件占用了,所以也不能直接使用。这也是为什么后来出现Expanded Memory这种标准的原因。在硬件的支持下,软件可以通过一个64K的窗口和切换页面的方式来访问多出来的RAM,当然这时候就不限于384K了,更多的RAM都可以通过这种方式来访问。这种方式使得8086/8088这种20根地址线的CPU也能访问超过1M的内存,当然前提是需要相应的硬件支持。286虽然多了4根地址线,也有了保护模式,但是在我印象中主流仍然是用这种方式在实模式下访问多余内存。386之后好像大多是用保护模拟来模拟实现EMS了,毕竟用单独的硬件切换页面速度太慢了。

另外,当时不管有没有多出来的384K,显存都是单独在显卡上实现的,不占用系统的主存。它占用的只是寻址空间而已。

到很后来,RAM越来越快,同时越来越不值钱,这时候才有BIOS复制到RAM中执行。
请原谅我的笔误:vide buff 不是指显卡而是显示器的。还有就是这样的内存分配是针对现行主流系统的。不过还是要谢谢!woolzey

作者: ayer   发布时间: 2006-04-07

发错了,请版主删了!

作者: ayer   发布时间: 2006-04-07

发错了,请版主删了!

作者: ayer   发布时间: 2006-04-07