关于“从开机到内核开始引导”的一些个人理解
时间: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
谁先谁后由你自己的CMOS设置决定。
至于支持多硬件的问题,这只不过是BIOS的功能加强了。你也知道BIOS的基本功能就是在开机后的第一时间去收集各个硬件的中断、IO号等等。
希望我的回答能你满意。
作者: nike333 发布时间: 2003-10-09
二家公司称,本周公布的这一交易旨在使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
作者: gradetwo 发布时间: 2004-10-27
作者: 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 发表 程序没在内存里时如何执行? 不能执行又如何解压? 所以最开始必然是硬件映射的. 否则根本无从开始. |
你所说的从硬件映射开始我不理解,因为实模式硬件地址映射是取决于你怎样把cpu的针脚和硬件的针脚连接起来,不是软件的问题。第一条指令确实是在ROM区,如有疑问请参见intel的手册。
作者: phyma 发布时间: 2004-12-10
作者: westroom 发布时间: 2004-12-25
作者: aweil 发布时间: 2005-01-01
作者: aweil
现在都是Grub的方式启动。
|
作者: freesky64 发布时间: 2005-01-07
作者: jonw 发布时间: 2005-01-14
作者: zswlb9999 发布时间: 2005-01-28
作者: chairman 发布时间: 2005-05-18
作者: hncw13 发布时间: 2005-05-18
作者: hncw13
对于i386机器的启动以及初始化过程可能一些书上会说的很详细,我看在这里争论也没有什么意义。我想知道,如果通过实验、实践,如何查看到计算机启动初始化时寄存器里的一些内容的?就好像说,牛顿告诉了我们物理定律的内容,但却没有告诉我们如何思考得到的一样。
|
作者: 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中,而是本来就在那个地址空间中(机器设计时地址总线决定) |
作者: crquan 发布时间: 2005-05-22
另外主引导扇区MBR实际上就是主引导扇区的一部分,主引导扇区512字节,其中MBR446字节,分区信息64字节,标识位2字节,大家所说的Grub就是主引导扇区的MBR中的引导程序,它将系统导入具体的系统,每个活跃的主分区也有一个引导扇区,它是引导这个主分区中的操作系统的。
作者: pillar 发布时间: 2005-05-30
作者: 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的空间被浪费了,是这样吧? |
作者: 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
RAM: 123456
统一编址后: 123abc456
对应的地址为: 123456789
456对应BIOS的abc
123789对应RAM中的123456
明白了吧!
作者: pillar 发布时间: 2005-06-23
但是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
没有一个权威的材料。
作者: crquan 发布时间: 2005-11-09
作者: crquan
我是说如果将我的192M物理内存(RAM)编址为0x00000000-0x0c000000,是这样吧?
但是CPU引用物理地址640K-1M间的地址时,内存总线就自动到ROM中去读了,对吧? 那么本身RAM中编址的640K-1M间的那么些空间就始终不能被读写了?因为它们被ROM给盖住了? |
如你所说的192M物理内存(RAM)的物理编址可以为0x00000000-0x0c000000,也可以为0x00000ff-0x0c0000ff
作者: Roc&Linux 发布时间: 2006-03-17
作者: ayer 发布时间: 2006-03-31
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
当时的机器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中执行。 |
作者: ayer 发布时间: 2006-04-07
作者: ayer 发布时间: 2006-04-07
作者: ayer 发布时间: 2006-04-07
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28