关于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就行了。如果不是我猜的那样,那回头在来补充吧。