欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

关于BIOS的入口地址0xFFFF0的介绍

程序员文章站 2022-04-03 20:49:23
有网友问“BIOS程序是由0xFFFF0来执行的”该怎么理解呢?开机时内存中不是什么都没有,其实BIOS程序的入口地址恰恰就是0xFFFF0 !也就是说,BIOS程序的第一条指令就设计在这个位置上,... 17-03-25...

一直都说开机加电之后,将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就行了。如果不是我猜的那样,那回头在来补充吧。