计算机启动过程(转自某论坛,不完整)

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

=============================

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

=============================

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

一刀切吧,比较物理地简略描述一下现代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为例说明。
==============================
BIOS: a b c
RAM: 123456

统一编址后: 123abc456
对应的地址为: 123456789
456对应BIOS的abc
123789对应RAM中的123456
明白了吧!
==============================
靠,什么理解能力啊,人家说得已经很清楚了。
谁有规定ram编址必须连续么?
所以0xA0000 - 0x0FFFFF 是rom的地址
0x00000000-0x00009FFFF和0x000100000-0x0C00FFFFF是你的ram
==============================
关于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怎样来看地址线,以及地址线上设备是怎样挂的。

以上只是我个人的理解,请大虾排砖
==============================
在早期的机器里面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中执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值