免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 25568 | 回复: 32
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-27 23:56 |只看该作者 |倒序浏览
最近看了一本书,提到ROM中的系统BIOS程序在系统启动时的处理过程,看过以后不是很明白,希望大侠能够指点一二。

1,文中提到,为使PC/AT计算机向上兼容,系统会产生一个影子区域,即BIOS代码会被复制到这个区域,而另一方面原来系统ROM中的基本输入输出程序BIOS一直处于CPU能寻址的内存最高端位置处。
     不太明白的是,保证ROM中BIOS程序一直处于CPU能寻址的内存的最高端位置处是在什么时候完成的?

2,文中提到,PC/AT微机的BIOS有可能大于64KB。而我们在内存中留出的影子区域(shadow)也就是ROM BIOS的映射区只有64KB。
那么我们是怎么选择复制哪些BIOS程序呢?

3,文中提到,BIOS程序会使用一种称作32位大模式的技术把数据寄存器的访问范围设置为4G(原来是64KB)。而BIOS在执行一些列硬件检测和初始化操作后,就会把于原来PC机兼容的64KB BIOS代码和数据复制到内存低端1MB末端的64KB处,然后跳转到这个地方应且让CPU进入真正的实地址模式工作。
     请问上面这个过程具体是怎么实现的?什么叫做真正的实地址模式呢?

第一次提问,不知道是不是太小白了,不过确实想不明白,谢谢关注的人,希望能有人帮忙~

论坛徽章:
0
2 [报告]
发表于 2008-02-28 01:15 |只看该作者
原帖由 daidongly 于 2008-2-27 23:56 发表
最近看了一本书,提到ROM中的系统BIOS程序在系统启动时的处理过程,看过以后不是很明白,希望大侠能够指点一二。

1,文中提到,为使PC/AT计算机向上兼容,系统会产生一个影子区域,即BIOS代码会被复制到这个 ...

1. BIOS代码的copy很常见。即在启动过程中,BIOS的代码会被拷贝到一个指定的虚拟地址,其主要用途多用于OS在运行过程中实时的调用BIOS提供的接口。是否拷贝到虚拟地址的高端部分应该是操作系统决定的,例如windows就是如此,估计LZ看的书是以windows为例。

2.第二个不懂哦,这里为bios留出的shadow区域是什么意思,估计是leagcy bios的规定。bios不一定是只有64k,例如intel的EFI就可以达到2M多的大小。

3.这里说的是IA32架构的big real mode。有人认为这是cpu的一个bug。其过程是进入保护模式后,将各个段寄存器设置恰当后再退回到实模式,就可以在实模式下访问和保护模式下一样的4G地址空间。LZ可以google其详细流程。

论坛徽章:
0
3 [报告]
发表于 2008-02-28 02:07 |只看该作者
谢谢!

第二个问题估计是我自己没说清楚,现在回过头来自己看看都觉得不知所言。
我到网上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程序的一部分,那么是哪一部分呢?

我很头大,不知道有没有问到点子上,盼解答。

论坛徽章:
0
4 [报告]
发表于 2008-02-28 12:48 |只看该作者
原帖由 daidongly 于 2008-2-28 02:07 发表
谢谢!

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

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

恩,这部分我不感确定说的正确,mik对开机流程很清楚的,说错了请纠正,还有版主哈:wink:
>>1,而这里之后我开始不明白了。JMP要跳转到的位置是在高地址(4G末端)Flash Rom BIOS中还是在低地址(1M末端)的shadow BIOS呢?

肯定跳转的目标在1M+64k以下,不会到4G末端。因为这个时候还处于实模式,无法寻址到4G末端去。
注意,big real mode是必须执行到保护模式再退回实模式才行,这个时候离开机已经走了很远了。

>>2,位于低地址(1M处)的(BIOS shadow)是从Flash BIOS拷贝而来呢,还是没有任何拷贝过程仅仅利用地址映射到原Flash BIOS中的呢?

是拷贝到内存中的。如果是直接映射的BIOS的flash的话,那就是做I/O,效率就很低了。
这个应该不叫拷贝,应该说是加载。通常说BIOS拷贝是指下面的内容

在实模式时,执行的都是未拷贝的BIOS代码(还位于被加载到内存中的位置)。拷贝通常应该是OS为了在运行过程中调用BIOS代码,而把BIOS代码“挪”到其它的地方,例如4G末端;或者是OS要使用BIOS占用的地址空间,而进行“挪”。发生拷贝的时候离启动已经很远了。所以开机时执行的仍然是未拷贝前的BIOS代码。

>>3,无论是拷贝还是映射,内存地址空间上ROM BIOS映射区只有 0xF0000~0x100000之间的64KB。而ROM本身有可能大于2M。那映射的应该是原BIOS程序的一部分,那么是哪一部分呢?

leagcy BIOS,也就是传统的BIOS大小应该都在64K之下。ROM本身大于2M,并非ROM就全部是用来装BIOS代码,例如用于存储设置的NVRAM,应该也包含在ROM之中。其次,ROM本身比BIOS例程大,也有提供给OEM商做扩展的用途。例如现在很流行的linux-BIOS项目就是把一个裁剪过的linux放在BIOS中(听说华硕都出产品了 )。
此外,如果BIOS代码本身大于64K,那么它在地址空间中的布局就会有变化,例如我所用的平台上BIOS代码就位于4G-16M而非0xF0000~0x100000

个人的一些看法,欢迎大家指正。

[ 本帖最后由 zx_wing 于 2008-2-28 17:27 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-02-29 12:39 |只看该作者
原帖由 zx_wing 于 2008-2-28 12:48 发表

恩,这部分我不感确定说的正确,mik对开机流程很清楚的,说错了请纠正,还有版主哈:wink:
>>1,而这里之后我开始不明白了。JMP要跳转到的位置是在高地址(4G末端)Flash Rom BIOS中还是在低地址(1M末端)的 ...

第二个问题我应该说错了。
如果第一次执行的时候不是用的映射,那么把代码加载到内存中的动作应该是谁做的呢?那就应该用的是映射。
我查查资料先。惭愧

论坛徽章:
0
6 [报告]
发表于 2008-02-29 19:59 |只看该作者
楼主是不是在看BIOS研发技术剖析?

论坛徽章:
0
7 [报告]
发表于 2008-02-29 21:54 |只看该作者
关于第二个问题,我想应该是用map的,我没找到具体资料,但有一份关于BIOS启动时的option rom的资料。opition rom是映射的,所以BIOS应该也是映射的。
希望了解的朋友讲一下。
这份spec也不错,如果LZ在研究BIOS,我想对你有益,作为附件上传

BIOS_Boot_Spec_v1.01.pdf

178.89 KB, 下载次数: 1369

论坛徽章:
0
8 [报告]
发表于 2008-02-29 22:40 |只看该作者
我看过一些资料,可能是错误的,仅供参考,切勿笑话。
1,386以后的cpu没有什么真正的实模式,执行第一条指令时,也就是"jmp far f000:e05b"的时候就是所谓32位的分段机制(就是用GDT,IDT来分段的那个什么来着),32位CPU在实模式下的分段机制其实就是加了一些限制的32位分段机制,很明显,执行第一条指令的时候A20是开启的。这个问题说起来话长,这里就不多说了,就此打住。我的观点是这个跳转是跳到1M以下的那个BIOS,在bochs里面就可以看到,第一条指令的地址是0xFFFFFFFF0,而第二条则位于0x000FE0FD.


2,据我了解,应该是拷贝的, 在bochs源代码中,有一个BIOS的实现,包括rombios.c,rombois32.c等文件,大致流程是,先切换到32位模式,然后把flash rom中的bios拷贝到一个临时区域,再告诉北桥芯片组将原先分配给flash BIOS的地址重新分配给DRAM bios.关于这一点,我们可以在rombios32.c的源代码中看到:

static int find_bios_table_area(void)
{
    unsigned long addr;
    for(addr = 0xf0000; addr < 0x100000; addr += 16) {
        if (*(uint32_t *)addr == 0xaafb4442) {
            bios_table_cur_addr = addr + 8;
            bios_table_end_addr = bios_table_cur_addr + *(uint32_t *)(addr + 4);
            BX_INFO("bios_table_addr: 0x%08lx end=0x%08lx\n",
                    bios_table_cur_addr, bios_table_end_addr);
            return 0;
        }
    }
    return -1;
}

static void bios_shadow_init(PCIDevice *d)
{
    int v;

    if (find_bios_table_area() < 0)
        return;

    /* remap the BIOS to shadow RAM an keep it read/write while we
       are writing tables */
    memcpy((void *)BIOS_TMP_STORAGE, (void *)0x000f0000, 0x10000);  //将BIOS拷贝到临时区域
    v = pci_config_readb(d, 0x59);
    v = (v & 0x0f) | (0x30);               
    pci_config_writeb(d, 0x59, v); //这里估计就是所谓的重新映射
    memcpy((void *)0x000f0000, (void *)BIOS_TMP_STORAGE, 0x10000);   //从临时区域拷贝到刚映射的DRAM中。
   
    i440_pcidev = *d;
}

论坛徽章:
0
9 [报告]
发表于 2008-02-29 23:01 |只看该作者
原帖由 cainiao911 于 2008-2-29 22:40 发表
我看过一些资料,可能是错误的,仅供参考,切勿笑话。
1,386以后的cpu没有什么真正的实模式,执行第一条指令时,也就是"jmp far f000:e05b"的时候就是所谓32位的分段机制(就是用GDT,IDT来分段的那个什么来着 ...

嗯,第一个问题已经论述过好多次了,版内也有不少帖子,反正就是所谓开机的混沌模式了。

第二个问题,我有一点看法。
不管是bochs还是QEMU,由于它们是模拟器,所以这个bios的拷贝动作是把bios代码拷贝到客户机地址空间中对应的位置,例如1M以下。这个是可以理解的。因为对于虚拟技术来说,其中的实现可以和真实的不一样,只要结果一样就行。所以它可以直接把代码拷贝到地址空间中对应的位置以代替映射这个操作,反正对于BIOS来说只要它执行对应地址上的代码,而不管这个地址是映射过来的,还是在内存中有真正的物理页与之对应。
但是在真实平台上,如果是拷贝的话,这个拷贝的动作是谁执行的,我就是这点没想通,也没找到资料。

论坛徽章:
0
10 [报告]
发表于 2008-02-29 23:25 |只看该作者
我还是认为应该是拷贝,我又找了一些证据。
award源代码:
  ;-------------------------------;
  ;  Switch to Proctected Mode ;
  ;-------------------------------;
      cli   
      lgdt    fword ptr cs:A_GDTR ; Load descriptor table
      mov     eax,cr0                 ; Enter protected mode
      or      al,1
      mov     cr0,eax
      jmp short $+2
      mov     ax,B_DATA1_INDEX
      mov     ds,ax                   ; DS = 00000000h

      mov esi,0f0000000H  ; ROM location
      cmp word ptr [esi],0AA55H ; ROM signature
      jne short NoVideoRom
      mov edi,0000C0000h  ; shadow RAM address
      mov ecx,64*1024/4  ;copy 64Kb video ROM
      cld
      db 67h
      rep movsd   ;copy ROM to shadow RAM
      NoVideoRom:
  ;-------------------------------;
  ;  Leave Proctected Mode ;
  ;-------------------------------;

首先声明我是菜鸟啊,刚研究这些东西没多久,我找证据只是为了寻找寻找答案,学习技术,呵呵。

[ 本帖最后由 cainiao911 于 2008-2-29 23:26 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP