返回列表 发帖

关于BIOS的第一条指令位置

根据我的认识,80x86CPU复位第一条指令的位置应该是在 FFFF:0000,也就是物理地址的FFFF0H,这里一般存放第一条BIOS的指令,很多都为JMP FAR(EA 5B E0 00 F0)(当然跳转的地址也有不同,仅是为了兼容以前旧机,F000:E05B用得比较多),想请教一下大家:
  我们的PC是如何把这个指令对应到FFFF:0000这个地址的,因为我发现用传统的BIOS与EFI的BIOS的第一个跳转指令在FLASH芯片中的地址不一样(这里指我们编译生成的BIOS文件),而加入ME功能后的BIOS程序在FLASH文件中又不一样,百思不得其解,如果有哪位大侠知晓,一起讨论一下
EFI、ME、都是新东西。

引用自http://linux.chinaunix.net/bbs/thread-991510-1-1.html   6楼

第一条 long jmp 指令,也就成为 x86 pc 机的固有约定或者说是规范吧。

     其实主要的原因是兼容!追溯到最早 808X 系列处理器,8080 是 16 位 address bus, 8086 及 8088 改进为 20 进 address bus,整个 808X 系列处理就是整个 x86 架构的始祖。寻址空间 00000 ~ FFFFFh 也就是 1M 的空间。
     当时 IBM 决定使用 8086 处理作为 IBM PC 机,故事就从那里开始,BIOS 这个名词也就是 IBM 发明出来的,IBM 搞出来的 BIOS 定位在 8086 处理器的寻址高端,也就是 F0000 到 FFFFF 区域。从 386 开始,address bus 增加到 32 条,寻址范围从 0 ~ FFFFFFFFh,BIOS 的定位也在 4G 的高端FFFF0000 ~ FFFFFFFFh,但为了兼容,对 F0000 ~ FFFFF 的访问被映射到 FFFF0000 ~ FFFFFFFFh,这是从理论上定义的。
     从物理上来讲,F0000 ~ FFFFFh 映射到 FFFF0000 ~ FFFFFFFFh 靠硬件来保证,在地址解码时,F0000 ~ FFFFFh 与 FFFF0000 ~ FFFFFFFFh 会被解码到同一个区域。现在的芯片组提供的厂商有很多,如:Intel,AMD,nvidia,VIA,SIS 等,它们的解码实现方法可能会不同,但都要保证这个所谓的“别名”机制。
    Intel 实现是:MCH 将 C_0000 ~ F_FFFF 这段区域定义为 PAM(Programed attribute memory),分 disable,read-only ,wirte-only,read/write 四种属性,初始属性是 disable,也即是无用,因此这段区域将被送去 ICH 解码,FFE0_0000 ~ FFFF_FFFFh 的也被 ICH 解码,ICH 转交 LPC bridge 处理,它们被解码为同一区域。
    AMD 实现是:无论是 C_0000 ~ F_FFFF,还是 FFFC_0000 ~ FFFF_FFFF 最终结果都将送到 LPC bus 上的 FFFC_0000 ~ FFFF_FFFF 物理地址上。其它的厂商实现也大体这样。

    因此:long jmp 后,转到 FE05B(jmp far ptr F000:E05B)执行,它将被映射到物理地址 FFFFE05B 上,这还是 BIOS 所在的 ROM 中。第一条指令的 FFFFFFF0 与 第二条的 FE05B 都是在 BIOS 的 ROM 上。


不知以上有没有帮助,还有楼主说的编译生成的BIOS文件地址是在哪里看到的?16进制编辑工具(如UE)吗?我自己理解,AMI的legacy BIOS中第一条指令在BIOS文件(1MByte)offset  000ffff0的地方,整个BIOS ROM会被decode到系统memory地址的fff0_0000~ffff_ffff段,最后第一条指令刚好就在CPU reset后取指令的地方ffff_fff0了。
所以只要BIOS的第一条指令在上电时能被解码到ffff_fff0的地方就可以了。
【没有做过EFI和有ME功能的BIOS】
studying

TOP

楼上的

用UE打开BIOS的二进制文件,就如你说的,发现第一条指令EA 5B E0 00 FF(即JMP FAR指令,很多不一定是E05B)的地址不固定在BIOS的二进制文件某一个地方,
无法理解它是如何映射到CPU RESET后的FFFF_FFFF0的位置,因为同一个平台,不同BIOS位置不同,但是用RU去看内存,却是正确的。
EFI、ME、都是新东西。

TOP

关于第一条指令CPU RESET后的FFFF_FFF0的位置的解码. 我来解释下我的理解。这个和硬件的地址线等是相联系
1,我们可以去看LPC bios/FLASH芯片上面的地址线,1M byte Flash他的地址线是A0--A19,512K BYTE Flash他的地址线是A0--A18。就是说当CPU解码FFFF_FFF0到LPC的时候只能解码后面对应地址线。即当时1M byte Flash的时候为FFFF0 当是512K BYTE Flash的时候为7FFF0
2,现在有SPI接口的bios/FLASH芯片,且这种芯片一般比较大,有2M/4M byte的。
这个时候,他能解码的地址相应为1FFFF0/3FFFF0。但是我们注意到当CPU刚上电的时候A20#是无效的。就是说A20这根地址线是0。所以这是解码的地址相应变为0FFFF0/2FFFF0

还有个要注意到的,关于“加入ME功能后的BIOS”,不知道我有没准确理解你的意思。
1,这个ME功能好像是SPI接口BIOS当中的一个image。
2,我们现在有做案子也是SPI接口的Legacy bios(不是EFI。EFI还没接触过,可惜啊。。),我们source code 生成bios image是1M的。然后可以通过intel的SPI工具 FPT.exe烧到Flash芯片中去,我想说的是“加入ME功能后的BIOS”第一条指令的位置应该就是 我们source code 生成1M bios image 被烧到Flash芯片中去后的位置是一样的。 也就是说source code 生成bios image是被放到 flash 芯片中间的一个什么地方,不像LPC接口bios 生成的bios image和flash芯片大小是一样的。
spi接口的flash里面可以分好几个regions。
0-Descriptor
1- bios
2-ME
3-GBE
4-PDR

不知道我说的对你有没帮助~呵呵

TOP

回楼上

理解上是这样理解,实际上的情况不是这样啊,用1M的Legacy bios加入ME(FPT工具)等功能生能4M的BIOS,一般BIOS放在最后,0x300000-0x3fffff的位置。并且我的BIOS文件在这个地方是EA AA FF 00 F0,但RU在内存处看却是EA 5B E0 00 FF
而EFI的BIOS文件甚至这个位置都不是跳转(0F 09 E9 33 FF),但RU在内存处看却同样是EA 5B E0 00 FF,所以有点郁闷
EFI、ME、都是新东西。

TOP

新手,顶一下了,向各位学习。

TOP

我的AMI 的legacy BIOS,不含ME,1M byte image的000ffff0处是EA AA FF 00 F0,通过RU在DOS下看到memory space:
FFFF FFF0处为EA AA FF 00 F0==>same as BIOS image, CPU cold reset vector
000F FFF0处为EA 5B E0 00 F0==>filled by BIOS in POST, CPU warm reset vecor

不知道楼主说的是不是memory 000F FFF0处的指令,那是BIOS POST过程中填的。
studying

TOP

回楼上

AMI 的legacy BIOS,含ME,4M byte image的000FFFF0处是EA AA FF 00 F0,但RU看(Alt+7)00000FFFF0H处是EA 5B E0 00 F0,可能BIOS首先是执行SPI FLASH里面,再往memory 里填,但是那么至少不管是EFI还是legacy的BIOS,同样4M BYTES 的情况下BIOS的image的某个地址应该是对就PC reset后的第一条指令,legacy 的3FFFF0H就是EA AA FF 00 F0,但对应此位置的EFI的BIOS image却是(0F 09 E9 33 FF),所以比较疑惑。
主要是对BIOS在内存中的分配及POST段解压缩后对就内存映射关系不熟,呵。另外,也是想写一个刷BIOS的小工具
EFI、ME、都是新东西。

TOP

听一位做EFI的兄弟讲,EFI的code的第一条指令是wbinvd,第二条指令是jmp,
0F09                WBINVD
E933FF           JMP     00010038

所以,我明白了。
studying

TOP

原帖由 kunsailor 于 2008-5-8 15:33 发表
AMI 的legacy BIOS,含ME,4M byte image的000FFFF0处是EA AA FF 00 F0,但RU看(Alt+7)00000FFFF0H处是EA 5B E0 00 F0,可能BIOS首先是执行SPI FLASH里面,再往memory 里填,但是那么至少不管是EFI还是legacy的BIOS, ...


BIOS ROM的映射地址是4G往下的地方
而内存地址0E0000-0FFFFF的地方是shadow BIOS ROM image top 64k。
000F FFF0处为EA 5B E0 00 F0==>filled by BIOS in POST 这个我以前还不知道呵呵,原来是post过程中写进去的。

TOP

原帖由 xtdumpling 于 2008-5-8 21:30 发表
听一位做EFI的兄弟讲,EFI的code的第一条指令是wbinvd,第二条指令是jmp,
0F09                WBINVD
E933FF           JMP     00010038

所以,我明白了。



恩~这个我昨天和做EFI的同事也看了下。

TOP

回楼上

那么我们是不是可以这么理解:
PC开机后,BIOS被映射在menory(FFFFFFFF)4G向下的位置,然后CPU会执行FFFFFFF0H的硬体FLASHIC中的指令,并初始化menory及最基本的设备功能,然后将引导块解压缩、装载到0FFFF0H的menory的1M(FFFFFH)处,然后再跳转到内存运行各部分程序?
EFI、ME、都是新东西。

TOP

回楼上

你说的基本差不多

你要写flash tool访问BIOS ROM的时候一定要把A20#打开~进入的big real mode。
不过有一个软件工具可以帮你实现这个麻烦的步骤~ 你只要用它的命令编译就行
软件名称:open-watcom, 你还需要DOS4G.EXE这个工具

To compile and link our example program which is stored in the file hello.c, enter the following command:
      
     C>wcl386 /l=dos4g hello.c
The typical messages that appear on the screen are shown in the following illustration.
      
     C>wcl386 /l=dos4g  hello.c
     Open Watcom C/C++32 Compile and Link Utility
     Copyright (c) 2006 the Open Watcom Contributors. All Rights Reserved.
     Portions Copyright (c) 1988, 2002 Sybase, Inc. All Rights Reserved.
     Source code is available under the Sybase Open Watcom Public License.
     See http://www.openwatcom.org/ for details.
             wcc386 hello.c  
     Open Watcom C32 Optimizing Compiler
     Copyright (c) 2006 the Open Watcom Contributors. All Rights Reserved.
     Portions Copyright (c) 1984, 2002 Sybase, Inc. All Rights Reserved.
     Source code is available under the Sybase Open Watcom Public License.
     See http://www.openwatcom.org/ for details.
     hello.c: 6 lines, included 174, 0 warnings, 0 errors
     Code size: 24
     Open Watcom Linker
     Copyright (c) 2006 the Open Watcom Contributors. All Rights Reserved.
     Portions Copyright (c) 1985, 2002 Sybase, Inc. All Rights Reserved.
     Source code is available under the Sybase Open Watcom Public License.
     See http://www.openwatcom.org/ for details.
     loading object files
     searching libraries
     creating a DOS/4G executable
Provided that no errors were encountered during the compile or link phases, the "hello" program may now be run.
      
     C>hello
     Hello world
If you examine the current directory, you will find that two files have been created.  These are hello.obj (the result of compiling hello.c) and hello.exe (the result of linking hello.obj with the appropriate Open Watcom C/C++ libraries).  It is hello.exe that is run by DOS when you enter the "hello" command.

TOP

4G memory layout
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

TOP

顶楼上一个!
修得一身好灵气,万事花开万事春。-- 争取每日一帖!

TOP

回楼上

感谢perseverance,
看来perseverance是个senior BIOS Engineer,向你学习
EFI、ME、都是新东西。

TOP

想求证一下

最后想证一下,PC开机后,BIOS被映射在menory(FFFFFFFF)4G向下的位置,然后CPU会执行FFFFFFF0H的硬体FLASHIC中的指令,CPU复位向量是无法改变的,那么是CPU第一条指令地址FFFF:FFF0H被映射成FFFFFFF0H?那最终真正的FFFF:FFFF0H又是通过什么机制访问的?有没有这菤的资料介绍下载?谢谢
EFI、ME、都是新东西。

TOP

个人理解,CPU的第一条指令地址为FFFFFFF0h,和F000:FFF0h相同【地址FFFF0h】,而不是FFFF:FFF0!
FFFF:FFF0h需要开A20地址线访问。
studying

TOP

CPU的第一条指令地址查查CPU的SPEC就知道了阿
修得一身好灵气,万事花开万事春。-- 争取每日一帖!

TOP

同意xtdumpling的观点~ A20没打开之前~只能访问0-1M之间循环地址~超过1M的地址又会被影射到从0M的地方开始 即0-1M和1-2M之间的东西是一样的。等A20有效并切换到big real mode之后才能访问到真正的FFFF:FFFF0H。 IA32的第三卷有提到cpu的第一条指令~但没有详细的说明
Let's study together!

TOP

返回列表
GForce-200 PLC-GIPENG.COM