LinuxSir.cn,穿越时空的Linuxsir!

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

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

[复制链接]
发表于 2005-6-22 23:23:21 | 显示全部楼层
BIOS:   a b c
RAM:   123456

统一编址后:     123abc456
对应的地址为:   123456789
456对应BIOS的abc
123789对应RAM中的123456
明白了吧!
回复 支持 反对

使用道具 举报

发表于 2005-6-24 16:12:32 | 显示全部楼层
我是说如果将我的192M物理内存(RAM)编址为0x00000000-0x0c000000,是这样吧?
但是CPU引用物理地址640K-1M间的地址时,内存总线就自动到ROM中去读了,对吧?
那么本身RAM中编址的640K-1M间的那么些空间就始终不能被读写了?因为它们被ROM给盖住了?
回复 支持 反对

使用道具 举报

发表于 2005-8-19 13:58:32 | 显示全部楼层
回楼上的,你说的特定条件下是对的。
比尔盖茨说过“640K对任何人都足够了。”
为什么是640,就是这个原因。
原来在DOS下,要访问大于640K的内存,是要OS支持的,记得有个什么HIMEM什么的东西。
但是,在保护模式下,就不一样了。
菜鸟的个人理解,各位轻拍,^_^
回复 支持 反对

使用道具 举报

发表于 2005-11-8 13:58:47 | 显示全部楼层
靠,什么理解能力啊,人家说得已经很清楚了。
谁有规定ram编址必须连续么?
所以0xA0000 - 0x0FFFFF 是rom的地址
0x00000000-0x00009FFFF和0x000100000-0x0C00FFFFF是你的ram。
回复 支持 反对

使用道具 举报

发表于 2005-11-8 23:28:22 | 显示全部楼层
这个问题曾想了很久,到底是干脆放弃这 384K 内存不用呢,还是 RAM 编址不连续呢?

没有一个权威的材料。
回复 支持 反对

使用道具 举报

发表于 2006-3-16 23:06:13 | 显示全部楼层
Post by crquan
我是说如果将我的192M物理内存(RAM)编址为0x00000000-0x0c000000,是这样吧?
但是CPU引用物理地址640K-1M间的地址时,内存总线就自动到ROM中去读了,对吧?
那么本身RAM中编址的640K-1M间的那么些空间就始终不能被读写了?因为它们被ROM给盖住了?

我想你把物理地址和RAM的虚拟地址概念扯混了,其实对于某个体系结构,都会对不同的设备在物理地址中配置在不同的物理地址区域;
如你所说的192M物理内存(RAM)的物理编址可以为0x00000000-0x0c000000,也可以为0x00000ff-0x0c0000ff
回复 支持 反对

使用道具 举报

发表于 2006-3-31 10:20:17 | 显示全部楼层
个人理解:640k--1M ram部分会留给video 得buff ,剩下的就给其它设备的option rom (包括可启动的设备),注意这里是把option rom 里的内容全部放到ram中,这段地址其实是被用掉了。至于为啥不直接访问设备的option rom 呢?原因是访问rom的速度要比访问ram的速度慢上很多。
回复 支持 反对

使用道具 举报

发表于 2006-3-31 17:22:03 | 显示全部楼层
关于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怎样来看地址线,以及地址线上设备是怎样挂的。
                     
以上只是我个人的理解,请大虾排砖
回复 支持 反对

使用道具 举报

发表于 2006-4-4 04:04:54 | 显示全部楼层
在早期的机器里面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中执行。

Post by ayer
个人理解:640k--1M ram部分会留给video 得buff ,剩下的就给其它设备的option rom (包括可启动的设备),注意这里是把option rom 里的内容全部放到ram中,这段地址其实是被用掉了。至于为啥不直接访问设备的option rom 呢?原因是访问rom的速度要比访问ram的速度慢上很多。
回复 支持 反对

使用道具 举报

发表于 2006-4-7 17:06:45 | 显示全部楼层
Post by 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中执行。

请原谅我的笔误:vide buff 不是指显卡而是显示器的。还有就是这样的内存分配是针对现行主流系统的。不过还是要谢谢!woolzey
回复 支持 反对

使用道具 举报

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

本版积分规则

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