LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: nike333

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

[复制链接]
发表于 2005-5-18 16:13:58 | 显示全部楼层

启动计算机后寄存器中的初始内容是如何得到的?

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

使用道具 举报

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

告诉你一个办法。在dos下用dubug.exe从FFFF0去跟踪执行一遍启动过程。不要用保护模式(如:Windows或linux)下的debug,因为地址是虚的。
回复 支持 反对

使用道具 举报

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

以上基本对,第三点进入回圈是对的。
回复 支持 反对

使用道具 举报

发表于 2005-5-22 16:01:03 | 显示全部楼层
Post by trinity
既然此贴加精,那我就说两句,不一定对,请批评。
2.系统BIOS并不是将自己复制到RAM中,而是本来就在那个地址空间中(机器设计时地址总线决定)


这一点我一直觉得很奇怪,如果地址总线上 0xa000 - 0x10000 被映射到 ROM 中,那么本来RAM 中有的这 384K 内存是不是就始终没有没映射地址了?还有 14M - 16M 的内存也是?
回复 支持 反对

使用道具 举报

发表于 2005-5-30 14:22:27 | 显示全部楼层
地址是在存储系统安排好后确定的,rom,ram,甚至flash都可以作为内存,然后进行统一编址,所以不是谁占了谁的位置,而是统一排队。
另外主引导扇区MBR实际上就是主引导扇区的一部分,主引导扇区512字节,其中MBR446字节,分区信息64字节,标识位2字节,大家所说的Grub就是主引导扇区的MBR中的引导程序,它将系统导入具体的系统,每个活跃的主分区也有一个引导扇区,它是引导这个主分区中的操作系统的。
回复 支持 反对

使用道具 举报

发表于 2005-6-4 03:44:02 | 显示全部楼层
内存其时并不完全指RAM,还包括主板的ROM,板卡的ROM,硬盘的ROM.....等等,当然还有板卡的RAM,如:显存,它们是一起编址的。实际上主要指640K——1M之间的地址,而0xFFFF0地址恰恰对应BIOS的第一条指令(跳转指令)。这些都是历史遗留下来的。
回复 支持 反对

使用道具 举报

发表于 2005-6-5 03:12:43 | 显示全部楼层
Post by minisunboy

如:显存,它们是一起编址的。实际上主要指640K——1M之间的地址,而0xFFFF0地址恰恰对应BIOS的第一条指令(跳转指令)。这些都是历史遗留下来的。


何谓一起编址呢?
如买的内存条上有128M内存,也就是RAM有128M,应该编址从0-0x07ffffff,如果是将RAM和ROM连续编再一起,那加一下最后地址是0x07ffffff+384K+...,而最后地址0x07ffffff说明内存条上的640K-1M间的384K的空间被浪费了,是这样吧?
回复 支持 反对

使用道具 举报

发表于 2005-6-6 14:14:24 | 显示全部楼层
Post by crquan
何谓一起编址呢?
如买的内存条上有128M内存,也就是RAM有128M,应该编址从0-0x07ffffff,如果是将RAM和ROM连续编再一起,那加一下最后地址是0x07ffffff+384K+...,而最后地址0x07ffffff说明内存条上的640K-1M间的384K的空间被浪费了,是这样吧?


x86实模式只识别0-1M的内存,因为8086只有20根地址线。
回复 支持 反对

使用道具 举报

发表于 2005-6-6 16:59:07 | 显示全部楼层
问题太多了,都不知道先回答哪一个(而且很多问题本身就有问题:()

一刀切吧,比较物理地简略描述一下现代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为例说明。
回复 支持 反对

使用道具 举报

发表于 2005-6-22 15:06:09 | 显示全部楼层
这个问题还是没说清。

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表