bios2.61翻译(关于BIOS的入口地址0xFFFF0的介绍)
一直都说开机加电之后 ,将CS设置为0xFFFF ,IP设置为0x0000,这样组成的地址就是0xFFFF0 ,而这个就是BIOS的入口地址 ,之后CPU读取这个地址的代码 ,然后就巴拉巴拉的开始执行下去了 。
现在想知道这个地址0xFFFF0是在主板上呢 ,还是在内存上 。想着如果是统一编址的话 ,就可能是去读取主板上的ROM ,但是看书上的图 ,有像是在RAM中 ,如果是在 内存 中 ,那是什么时候,由哪段程序将ROM中的程序读取到内存中的 。自己猜的话 ,应该这个过程是固定的硬件实现的 ,将ROM中的所有内容拷贝到内存中最高位那一段中,之后 ,0xFFFF0就必然是指内存中的地址了 。
百度了一下 ,有篇文章就是说这个的 。
640KB~1MB 上位内存(这个区域的地址分配给ROM,相应的384KB的RAM被屏蔽掉 。所谓的影子内存技术 ,就是把ROM内容读取到对应地址的RAM中 ,以后系统就从RAM中读取数据 ,而不是从原来的ROM读取数据 ,从而提高速度 。)
1MB~ 扩展内存
注:
Shadow RAM也称为"影子内存",是为了提高计算机系统效率而采用的一种专门技术 ,所使用的物理芯片仍然是CMOS DRAM(动态随机存取存储器 ,参阅本书后面的内容)芯片 。Shadow RAM占据了系统主存的一部分地址空间 。其编址范围为C0000~FFFFF ,即为1MB主存中的768KB~1024KB区域。这个区域通常也称为内存 保留区 ,用户程序不能直接访问 。Shadow RAM的功能就是是用来存放各种ROM BIOS的内容 。也就是复制的ROM BIOS内容 ,因而又它称为ROM Shadow,这与Shadow RAM的意思一样 ,指得是ROM BIOS的"影子"。现在的计算机系统 ,只要一加电开机,BIOS信息就会被装载到Shadow RAM中的指定区域里 。由于Shadow RAM的物理编址与对应的ROM相同 ,所以当需要访问BIOS时 ,只需访问Shadow RAM而不必再访问ROM,这就能大大加快计算机系统的运算时间 。通常访问ROM的时间在200ns左右 ,访问DRAM的时间小于100ns 、60ns , 甚至更短。
在计算机系统运行期间 ,读取BIOS中的数据或调用BIOS中的程序模块的操作将是相当频繁的 ,采用了Shadow RAM技术后 ,无疑大大提高了工作效率 。
386 之前与386之后 ,这个地址是不同的 ,但都在系统内存的最高 地址段 。在386下为 FFFFFFF0H 。因为CS段是16位的 ,EIP是32位的 ,为了得到一个32位地址,386给CS段增加了几个字段 ,这是隐藏的字段 ,系统可以通过 GDT,IDT将更改段选择子的字段,此时地址转换就不是 段地址左移4位 + 偏移地址 ,而是CS的Base字段+偏移地址 。
下面是一个例子
当系统加电后 ,系统会复位 。此时在386以前的系统下CS=F000H,IP=FFF0H ,Bios地址为段地址左移4位 + 偏移地址挤即 F0000H + FFF0H = FFFF0H
在386以前系统可寻址范围为1MB即 00000H~FFFFFH
在386下CS=F000H ,IP=FFF0H ,这是不变的 ,但是这时 ,CScs中的内容为:
Selector = F000H (这个就是你可以看到的那部分内容)
这时隐藏的部分是不能用的 ,因为在实地址模式下 ,所以Bios地址与386以前的地址一样 ,
但是386可寻址范围为4GB 即 00000000H~FFFFFFFFH ,如果以这个地址(000FFFF0H)作为Bios地址的话,系统内存不连续 ,因此 ,386使用硬件置1的方式将A20~A31地址线置1,就变成FFFFFFF0H ,并以此作为Bios地址 。
这个置1的结果是 ,隐藏的部分的一个字段Base=FFFF0000H,这个操作不是由更改描述符表实现的 ,因为还没有进入保护模式 ,而且描述符表还没有 建立 。这是硬件实现的 ,而且当进行一次段间跳转后 ,由于置1的结果就不能保存 ,因为硬件设计是从会将其置0 ,所以当执行完FFFFFFF0H处的指令 jmp ,Base=00000000H ,这时 ,Bios就使用1M以下内存 。
关于入口地址的形成,有的文章上说是CS 0xFFFF和IP 0x0000的组成 ,有的文章上说是 CS 0xF000 和IP 0xFFF0的组合 ,我猜可能是不同硬件的初始化不同,只要最后形成的入口地址是 0xFFFF0就行了 。如果不是我猜的那样 ,那回头在来补充吧。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!