免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: daidongly

关于ROM BIOS的启动问题 [复制链接]

论坛徽章:
0
发表于 2008-03-02 23:49 |显示全部楼层

回复 #20 cainiao911 的帖子

已发

论坛徽章:
0
发表于 2008-03-03 09:42 |显示全部楼层
原帖由 cainiao911 于 2008-3-2 15:44 发表
Intel的MCH DataSheet确实只是说到了映射,没说过程。
不知阁下有无PCI System Architecture电子版,能否共享?


这种书上emule搜索,我有这些,都是emule来的:

2002-10-03_2002-09-06_pci中文规范.pdf                                                   PCI Bus Demystified.pdf
Addison.Wesley,.MindShare,.PCI.System.Architecture.pdf                                  PCI_Express_Base_11.pdf
build_history.pdf                                                                       PCI.Express.Base.Specification.v2.0.pdf
conventional_pci_2_3.pdf                                                                PCI Express Complete Core.pdf
ECN-Interrupt_Line_Register_Usage_061605.pdf                                            PCI Express System Architecture.chm
ECN_PCI_Connector_Finish.pdf                                                            PCI Firmware Specification - Revision 3.0-2005.pdf
ECN_SATA_Class_Code.pdf                                                                 PCI Local Bus Specification-Revesion 3.0-2004.pdf
Introduction to PCI Express - A Hardware and Software Developers Guide.Intel.Press.pdf  PCI Local Bus Specification Revision 3.0.pdf
msi-x_ecn.pdf                                                                           PCI System Architecture, 4th Chinese-English Edition.pdf
PCI_2_3_Errata_9_08_03.pdf                                                              PCI局部总线.pdf
pci30_faq.pdf                                                                           prd_msc_pcitech.pdf
PCI BIOS Specification -Revision 2.1, 1994.pdf                                          SATA_CAP_Ptr_ECN_-_final.pdf

论坛徽章:
0
发表于 2008-03-03 09:53 |显示全部楼层
Mindshare的书比较好。我有ISA System Architecture,80486 System Architecture
但找不到《Pentium Processor System Architecture》,《Protected Mode Software Architecture》,《Pentium Pro and Pentium II System Architecture》

论坛徽章:
0
发表于 2008-03-03 12:41 |显示全部楼层
原帖由 cainiao911 于 2008-3-3 09:53 发表
Mindshare的书比较好。我有ISA System Architecture,80486 System Architecture
但找不到《Pentium Processor System Architecture》,《Protected Mode Software Architecture》,《Pentium Pro and Pentium  ...

mindshare的书不求多,一本本的看,看懂一本就不错了。
我老大当时读P4那本,我靠,一个星期2000页的书就读完了,然后给我们讲前端总线。而且讲的非常之清楚。
不过他说了,很多东西都是知道的,读这些书只是总结,我想我去读一本,怕是一年都看不完。

晕,变资料交换帖了,大哥们继续研究这个启动的过程啊,研究好了发个总结帖。我人懒啊,想捡个现成。

论坛徽章:
0
发表于 2008-03-04 13:52 |显示全部楼层

回复 #3 daidongly 的帖子

谢谢!

第二个问题估计是我自己没说清楚,现在回过头来自己看看都觉得不知所言。
我到网上Google了下,看到了些文章。不过还是有不少地方不懂~我尽量表述的清楚点呵

开机后,CPU重置,从地址FFFFFFF0取第一个命令,这个地址正好落在ROM BIOS中。该地址内容一

定是一个JMP指令,系统便跳转到该JMP指令所指的地方。

1,而这里之后我开始不明白了。JMP要跳转到的位置是在高地址(4G末端)Flash Rom BIOS中还是

在低地址(1M末端)的shadow BIOS呢?

2,位于低地址(1M处)的(BIOS shadow)是从Flash BIOS拷贝而来呢,还是没有任何拷贝过程仅

仅利用地址映射到原Flash BIOS中的呢?

3,无论是拷贝还是映射,内存地址空间上ROM BIOS映射区只有 0xF0000~0x100000之间的64KB。而

ROM本身有可能大于2M。那映射的应该是原BIOS程序的一部分,那么是哪一部分呢?

对这个问题的回答需要阐明机关概念:
1.机器加电时,内存控制器还没有初时化,内存是不可用。
2.机器加电时,对CPU的指令的解码不是北桥,CPU发出的地址被传递到南桥并由FHW(Firmware

Hub)解码到BIOS ROM芯片(Flash)。在加电时一直到引导进程初,BIOS的E段(0xE0000~0xEFFFF)和F

段(0xF0000~0xFFFFF)和4G内存顶端的对应段0xFFFE0000~0xFFFEFFFF和0xFFFF0000~0xFFFFFFFF都

被FWH解码到BIOS的ROM芯片的两个64区域。即在启动阶段访问0xE0000~0xEFFFF和

0xFFFE0000~0xFFFEFFFF是同一个BIOS区域,访问0xF0000~0xFFFFF和0xFFFF0000~0xFFFFFFFF是同

一个BIOS区域。
3.机器加电时,CS段寄存器值为0xF000,EIP值为0x0000FFF0,但CPU的取的地址是段寄存器不可见

的部分(影子寄存器)加上偏移部分,此时影子寄存器的值为0xFFFFFFF0。所以CPU执行的第一条指

令是0xFFFFFFF0(复位向量),通常在BIOS ROM对应的指令是一个跳转指令JMP F000:E05B,当取出跳

转完成后,由于CS段的影子寄存器刷新并重新加载,下一条指令地址是0xFE05B。不过这条指令仍

然从BIOS ROM里取得。
4.关于shadow BIOS,BIOS程序通常是压缩的,在系统初始化阶段,BIOS会解压BIOS Image到RAM中

,然后编程北桥控制器对0xE0000~0xFFFFF置为write only,这样对该区域的写被传递到DRAM里,

然后把解压的BIOS拷贝到E段和F段。最后重新编程北桥控制器对0xE0000~0xFFFFF置为read only。
对于PCI ROM BIOS,BIOS会把每个卡上的ROM拷贝到0xC0000~0xDFFFF然后执行他们的初时化代码。
5.BIOS ROM可以很大,但不都是可执行的,如含有ACPI Table等,开始解压到0xE0000~0xFFFFF只

是其中一部分,在启动过程中还需要从BIOS ROM解压代码到RAM中,并覆盖其中不需要的代码。这

个就好像BIOS ROM是硬盘(不过可用直接访问),真正执行的代码在RAM中一样。硬盘可以很大但RAM

小,这也就是程序的局部性原理。

其它对开机过程的误识也会从我的回答中得到答案。

论坛徽章:
0
发表于 2008-03-04 14:12 |显示全部楼层
原帖由 cj_ict 于 2008-3-4 13:52 发表
谢谢!

第二个问题估计是我自己没说清楚,现在回过头来自己看看都觉得不知所言。
我到网上Google了下,看到了些文章。不过还是有不少地方不懂~我尽量表述的清楚点呵

开机后,CPU重置,从地址FFFFFFF0取 ...

有几个问题没弄明白,想请教一下

2.机器加电时,对CPU的指令的解码不是北桥,CPU发出的地址被传递到南桥并由FHW(Firmware

Hub)解码到BIOS ROM芯片(Flash)。在加电时一直到引导进程初,BIOS的E段(0xE0000~0xEFFFF)和F

段(0xF0000~0xFFFFF)和4G内存顶端的对应段0xFFFE0000~0xFFFEFFFF和0xFFFF0000~0xFFFFFFFF都

被FWH解码到BIOS的ROM芯片的两个64区域。即在启动阶段访问0xE0000~0xEFFFF和

0xFFFE0000~0xFFFEFFFF是同一个BIOS区域,访问0xF0000~0xFFFFF和0xFFFF0000~0xFFFFFFFF是同

一个BIOS区域。


这么说BIOS拷贝到高端内存是架构决定的?也就是说所有操作系统都是这样的?
我认为是操作系统决定的。而且我认为开机的时候4G末端是没有BIOS的映射的,而是系统启动中BIOS被操作系统拷贝的到这个位置去的。
希望能看到出处,最好是有BIOS的specification之类的权威规范。

另外还有个问题就是我们讨论的“开机时BIOS是否是被映射执行的?这个映射过程是如何的?”希望这个问题能得到解答。

论坛徽章:
0
发表于 2008-03-04 16:06 |显示全部楼层
原帖由 zx_wing 于 2008-3-4 14:12 发表

我认为是操作系统决定的。而且我认为开机的时候4G末端是没有BIOS的映射的,而是系统启动中BIOS被操作系统拷贝的到这个位置去的。


我谈谈我的看法。
先不管映不映射。至少在执行第一条指令的时候,4G末端Bios是存在的。
还是拿bochs来举例。
1,启动bochsdbg.
2,执行disasm 0xFFFFFF00 0xFFFFFFFF
3,执行disasm 0x000FFF00 0x000FFFFF
可以看到两个地方反汇编出来的代码是一样的。
虚拟机的具体实现可能与现实中有区别,但这个BIOS是个独立模块,可以用于Bochs,Plex86,QEMU,具有一定的可信度。

梁肇新先生的书《编程高手箴言》讲到“在DOS实模式下读取4GB内存”,用代码证实了BIOS在两个地方同时出现,我想,我们
直接将代码写在硬盘或软盘第一个扇区应该可以达到同样的效果。

cj_ict 貌似是高手,不会不来了吧!?

论坛徽章:
0
发表于 2008-03-04 17:06 |显示全部楼层
原帖由 cainiao911 于 2008-3-4 16:06 发表


我谈谈我的看法。
先不管映不映射。至少在执行第一条指令的时候,4G末端Bios是存在的。
还是拿bochs来举例。
1,启动bochsdbg.
2,执行disasm 0xFFFFFF00 0xFFFFFFFF
3,执行disasm 0x000FFF00 0x000FFFF ...

cainiao911兄不要怪我多疑,实在是因为这种情况导致我有几个地方想不通。

1.  为什么4G末端会有BIOS的映射?
兄台和cj_ict看来应该是做BIOS相关工作的,那肯定就知道BIOS的服务可以分为boottime和runtime两种。我对4G末端有BIOS映射的解释是操作系统为了在运行期间调用BIOS的runtime服务,而把BIOS拷贝到这个区域。并且是操作系统决定的,并非所有操作系统遵守这个情况。
我想问一下兄台用bochsdbg看的时候,操作系统启动没有?还是刚开机的时候?

2. 4G末端的映射什么时候被使用到?
对4G末端的访问前面说过,只有在big real mode下才可能访问,不可能在一上电的时候就访问到。如果是通过big real mode访问,那就是开机后很久的事情的。那么如果4G末端的映射一开机就存在,那么它有什么用?什么时候会被用到。

所以我想看到有权威的spec来解释这个东西。

论坛徽章:
0
发表于 2008-03-04 17:34 |显示全部楼层
4G那部分在刷BIOS的时候要用到,具体不清楚。
我前面的帖子里面有个链接,里面有讲到。
BIOS Boot Hijacking And VMware Vulnerabilities Digging
你还可以用google搜索 "TOP_SWAP"看看。

论坛徽章:
0
发表于 2008-03-04 21:22 |显示全部楼层
综合看了cainiao911发的PDF文档,又根据里面的内容查阅了ICH9的spec,看了TOP_SWAP的相关章节,有一点看法。写出来大家讨论一下。
首先一个概念要先区分一下,我认为这个是问题的关键。即,这里的4G末端是个映射,所指向的不是RAM,而是BIOS ROM,这时的BIOS根本没有被拷贝。

为什么这样说。有几点原因:1)此时MCH没有参与地址地址访问,而内存还未初始化,此时RAM不可用 2)从TOP_SWAP的讲述来看,此时ICH的A16被invert,所有访问0xFFFF0000 ~ 0xFFFFFFFF的访问变成对0xFFFE0000~0xFFFEFFFF的访问。我认为这里A16就是一个地址线引脚,所谓invert就是被拉低了。所以这时ICH在参与地址访问。3)还是老原因,实模式无法寻址到4G。

综上3个原因,我认为问题JMP要跳转到的位置是在高地址(4G末端)Flash Rom BIOS中还是在低地址(1M末端)的shadow BIOS呢?”的实际解释是:0xF0000~0xFFFFF和0xFFFF0000~0xFFFFFFFF都是指向BIOS ROM的两个映射而已,BIOS的拷贝只有一份,在BIOS ROM里,这两个映射都指向它。所以无论跳转到哪儿,都是指向BIOS ROM,在跳转后CS被flush掉,这个时候使用低地址映射执行BIOS代码。

所以在这个过程中根本就没有RAM的参与,所谓4G末端只是个地址空间上的概念,BIOS也没有被拷贝。

我原先理解成BIOS被拷贝到RAM中,而这个RAM的在地址地址空间中位于4G末端。把OS拷贝BIOS例程到高端内存和这里的高端地址映射BIOS ROM混淆了。各位可能早就清楚上述事实,多半被我的问题搅晕了o" />ps:" />

但还有一个问题没想通,上电的时候CS位于0XFFFF0000,但执行完一个long jmp后CS会被flush掉,按理说后面就不会有高于1M+64K的地址出现了,那么在4G末端映射整个BIOS ROM又有什么用呢?我想这样做的原因是可以让long jmp跳到BIOS ROM里的任何地址,而非是特定的某个地方。不知道对不对。

[ 本帖最后由 zx_wing 于 2008-3-4 21:25 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP