回 帖 发 新 帖 刷新版面

主题:[讨论]关于PC的内存和启动

众所周知,RAM 和 ROM 是混合编址的,基本内存储 + 上位内存,ROM BIOS 就没有空间了,这显然不行。那么就有两种情况:
1. 基本内存储 + ROM BIOS,而把上位内存暂时移到别处去,待启动后再把 ROM  复制到 RAM 中,然后再把 ROM 移到别处去,但在启动时必须是实模式,只有 20 条地址线,移到 1M  以外任何一处都访问不到。
2. 让ROM BIOS 和上位内存共同享有 A0000H  ~  FFFFFH  这段空间,显然要分时享用,不然要发生冲突,是怎样一种切换机制?还有,ROM BIOS  从最初的 64KB 经历 128KB、256KB,问题都不大,目前 512KB 超出了 384KB 又怎样编址?另外不同尺寸的ROM BIOS 是在低端与A0000H  处对齐还是高端与  FFFFFH  对齐呢?
在下聆听各位高见

回复列表 (共15个回复)

沙发

计算机开机的时候,内存空间的分配情况如下:
00000H  ~  003FFH  是中断向量表
00400H  ~  004FFH  是BOIS数据区
00500H  ~  9FFFFH  是自由内存区
A0000H  ~  BFFFFH  这段空间是视频显示区
C0000H  ~  FFFFFH  是BOIS中断处理程序区。
如果要讨论RAM 和 ROM 是混合编址的问题。讨论视频显示区就可以了。
比如下面的代码:
MOV AX,0B800H
MOV ES,AX
MOV ES:[0],‘A’
MOV ES:[1],01FH
它的功能是在屏幕的(0,0)位置显示一个字符'A',颜色由01FH确定。它的执行由大致由2个过程完成:
1、CPU把'A',01f分别送到ES:[0],ES:[1]中去。
2、视频处理器读这两个字节的单元内容处理并在屏幕显示字符'A'
在执行过程中,ES:[0],ES:[1]的内容并没有备份,它被覆盖了,也就是说混合编程的RAM的内存区域没有进行移动。
还有一个就是分时享用问题,实现的方法有很多,比如通过时钟周期来控制,通过内部寄存器状态来判断.........具体细节我不清楚,也没有必要去关心。

板凳

感谢您的回答,但有些事情还是不太清楚,本帖是偏重于硬件问题,我这样理解不知对否:上电时上位内存区被切换到 ROM BIOS 状态,完成自检后,把一部分代码拷贝到00500H  ~  9FFFFH  自由内存区,或者干脆拷贝到自由内存区再自检(因这时候还没有加载 DOS 和用户程序),然后切换到上位内存区 RAM 中 ,把  ROM BIOS 的内容拷贝到该区,就完成了映射,但 1MB 以下的内存区的内容是有严格限制的,不同版本的ROM BIOS 尺寸大不相同,512KB 的怎样编址?

3 楼

感觉你很多基本感念都理解错误了。
1:CPU只会运行RAM中的指令,不会运行ROM的内容。也就是ROM中内容是映射到了RAM中,CPU通过运行相应的RAM的内容来执行ROM中预定的功能。
2:ROM和RAM的映射问题。他们是通过混合编址来映射的,而不是通过代码拷贝来完成的,这个非常重要。简单的理解混合编址的映射,就是说,如果你访问内存RAM中C0000-FFFFF中任何一个字节,等价于访问ROM中的内容。
3:自由内存区的意思是说这个区域的内存没有被系统使用,用户可以随便使用它。
4:刚开机的时候,ROM和RAM的就映射好了。这个时候的CS=0F000H,IP=0FFF0H,也就是说CPU执行F000:FFF0处的指令,因为在这个时候只可以使用1M的内存,也就是说只有F000:FFF0---F000:FFFF这16个字节的空间存放指令,所以这个地方一般是存放一个JMP指令,让CPU跳到内存其他地方运行(这个地方必定要C0000-FFFFF之间)。我们把这期间运行的程序叫BOIS程序。

4 楼


太深奥了!据说ROM比RAM慢得多,拷贝可以提高速度,原来不是如此。

5 楼

这个问题最近搞清楚了:

PC 启动时,无论能寻址多大空间,比方最早的 PC 00000 ~ FFFFFH,或 386 兼容机 00000000 ~ FFFFFFFFH 或更大的64位机,第一条指令的地址都是 FFFFFFFFFFFFFFFFFFFFF0H,但由于 ROM BIOS 是不完全译码,所以有众多的重复地址,因而对于  ROM BIOS 而言,等价于 FFFFF0H,也就是 1MB 的顶端。有人会说,那不是和最高端的  RAM 发生冲突,是的,若按寻址能力插满,的确会的,但主板设计时考虑到了,不会让它插满,况且谁会在 286 机上插 16MB 内存?谁会在 386 机上插 4GB 内存?谁会在 PENTIU 机上插 64TB 内存?所以这种情况过去没有发生过,将来也永远不会发生。

    另外 PC 启动时必须从 ROM BIOS ,而且一定是实模式,这一点恐怕要维持相当长一段时间。

6 楼

等价于 FFFFF0H,也就是 1MB 的顶端。有人会说,那不是和最高端的  RAM 发生冲突
------------------------------------

既然是1MB的顶端,怎么又会和最高端的RAM发生冲突?另外,我也有一些与LZ共同的疑问,是否可以探讨一下?

7 楼

为了提高效率 ,ROM的数据 会被映射到 内存

8 楼

[quote]等价于 FFFFF0H,也就是 1MB 的顶端。有人会说,那不是和最高端的  RAM 发生冲突
------------------------------------

既然是1MB的顶端,怎么又会和最高端的RAM发生冲突?另外,我也有一些与LZ共同的疑问,是否可以探讨一下?[/quote]
    首先更正 5 楼的一个错误,FFFF0H是 1MB 的顶端。而不是 FFFFF0H
    以 80286 连接  29C010  ROM BIOS 和 一条16MB的内存条(RAM)为例,80286 24条地址线,  16MB的内存条也是24条地址线,可以一一对应地连接,29C010  只有 17 条地址线,其 A0 ~ A16 必须连接 80286 的 A3 ~ A19,访问 ROM BIOS 只与  A0 ~ A19 有关,而  A20 ~ A23 无论高低电平,都不会影响 ROM BIOS  的访问。
    送 0FFFF0H 到地址总线,只能访问 ROM BIOS 而不能访问RAM,而送地址 FFFFF0H 到地址总线,既能访问 ROM,又能访问 RAM,这不是发生冲突了?好在该主板不允许插 16MB 内存条。

9 楼

[quote]为了提高效率 ,ROM的数据 会被映射到 内存[/quote]
到现在没搞清楚什么是“映射”,和复制到某一区间有没有区别?

10 楼


是复制,从书上看来的

我来回复

您尚未登录,请登录后再回复。点此登录或注册