读书人

CPU实形式疑问

发布时间: 2012-08-17 02:08:34 作者: rapoo

CPU实模式疑问
近日学操作系统,发现系统启动后,首先进入实模式,但实模式的寻址空间只有1M,而我发现现代主板BIOS就要2M到4M大,根据linux内核加载原理,在实模式下首先跳转到0xffff0开始执行跳转代码,然后要将MBR加载到0x7c00处执行,若寻址空间只有1M的话,是不是0x7c00指向的应该是BIOS的内存空间?而BIOS是ROM,这个是不可改变的吧,怎么写入,这有点矛盾呢。
计算机内存空间整体我理解的是这样的
---------------------- 0x0000 0000
| RAM |
| 主存 |
----------------------
| RAM |
| 显存 |
----------------------
| ROM |
| 显存BIOS |
----------------------
| ROM |
| 网卡 |
----------------------
| ROM |
| BIOS |
----------------------0xffff ffff

求大神解释在实模式下寻址的1M的空间,在32位的机器当中,这个0x7c00是指向了0x00007c00还是0xfff07c00,如果是0x00007c00的话是如何寻址到的?
或者我对内存空间的寻址整体理解错了?

[解决办法]
0x7c00离bios区还远着呢。
首先就是bios的代码并不存在于内存中,所以它再大也没有关系。
它只是和内存地址之间有一个映射。通常设备接口有两种方式,端口映射和内存映射,bios就属于后者。
所以bios在完成POST之后所做的事也就不难理解。
然后你说的32位机的问题,在实模式下,不管多少位的计算机都工作于16位模式(只对于IA而言),这就是为什么实模式只能寻址1m常规内存的原因。
[解决办法]
1.0x7c00指0x00007c00内存地址。MBR被加载到0x00007c00处执行。
2.楼主图上的BIOS内存位置是对的。系统启动时BIOS被映射到内存的最高地址处,对于现在的32构架来说也就是4G内存空间中最后几M的地方,CPU通个地址来访问BIOS。
3.MBR不会覆盖BIOS空间。为了与早期机器兼容,现代几M的“大“BIOS会把与早期64KB的”小“BIOS功能等价的一小部分BIOS代码复制到1M内存的最后64KB处,即早期64KB BIOS所在的位置,形成所谓的”影子BIOS“,这样0x00007c00处的MBR当然不会与BIOS重合了。

读书人网 >C语言

热点推荐