亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
1234下一頁
最近訪問板塊 發(fā)新帖
查看: 26487 | 回復(fù): 32
打印 上一主題 下一主題

關(guān)于ROM BIOS的啟動(dòng)問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-02-27 23:56 |只看該作者 |倒序?yàn)g覽
最近看了一本書,提到ROM中的系統(tǒng)BIOS程序在系統(tǒng)啟動(dòng)時(shí)的處理過程,看過以后不是很明白,希望大俠能夠指點(diǎn)一二。

1,文中提到,為使PC/AT計(jì)算機(jī)向上兼容,系統(tǒng)會(huì)產(chǎn)生一個(gè)影子區(qū)域,即BIOS代碼會(huì)被復(fù)制到這個(gè)區(qū)域,而另一方面原來系統(tǒng)ROM中的基本輸入輸出程序BIOS一直處于CPU能尋址的內(nèi)存最高端位置處。
     不太明白的是,保證ROM中BIOS程序一直處于CPU能尋址的內(nèi)存的最高端位置處是在什么時(shí)候完成的?

2,文中提到,PC/AT微機(jī)的BIOS有可能大于64KB。而我們?cè)趦?nèi)存中留出的影子區(qū)域(shadow)也就是ROM BIOS的映射區(qū)只有64KB。
那么我們是怎么選擇復(fù)制哪些BIOS程序呢?

3,文中提到,BIOS程序會(huì)使用一種稱作32位大模式的技術(shù)把數(shù)據(jù)寄存器的訪問范圍設(shè)置為4G(原來是64KB)。而BIOS在執(zhí)行一些列硬件檢測(cè)和初始化操作后,就會(huì)把于原來PC機(jī)兼容的64KB BIOS代碼和數(shù)據(jù)復(fù)制到內(nèi)存低端1MB末端的64KB處,然后跳轉(zhuǎn)到這個(gè)地方應(yīng)且讓CPU進(jìn)入真正的實(shí)地址模式工作。
     請(qǐng)問上面這個(gè)過程具體是怎么實(shí)現(xiàn)的?什么叫做真正的實(shí)地址模式呢?

第一次提問,不知道是不是太小白了,不過確實(shí)想不明白,謝謝關(guān)注的人,希望能有人幫忙~

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2008-02-28 01:15 |只看該作者
原帖由 daidongly 于 2008-2-27 23:56 發(fā)表
最近看了一本書,提到ROM中的系統(tǒng)BIOS程序在系統(tǒng)啟動(dòng)時(shí)的處理過程,看過以后不是很明白,希望大俠能夠指點(diǎn)一二。

1,文中提到,為使PC/AT計(jì)算機(jī)向上兼容,系統(tǒng)會(huì)產(chǎn)生一個(gè)影子區(qū)域,即BIOS代碼會(huì)被復(fù)制到這個(gè) ...

1. BIOS代碼的copy很常見。即在啟動(dòng)過程中,BIOS的代碼會(huì)被拷貝到一個(gè)指定的虛擬地址,其主要用途多用于OS在運(yùn)行過程中實(shí)時(shí)的調(diào)用BIOS提供的接口。是否拷貝到虛擬地址的高端部分應(yīng)該是操作系統(tǒng)決定的,例如windows就是如此,估計(jì)LZ看的書是以windows為例。

2.第二個(gè)不懂哦,這里為bios留出的shadow區(qū)域是什么意思,估計(jì)是leagcy bios的規(guī)定。bios不一定是只有64k,例如intel的EFI就可以達(dá)到2M多的大小。

3.這里說的是IA32架構(gòu)的big real mode。有人認(rèn)為這是cpu的一個(gè)bug。其過程是進(jìn)入保護(hù)模式后,將各個(gè)段寄存器設(shè)置恰當(dāng)后再退回到實(shí)模式,就可以在實(shí)模式下訪問和保護(hù)模式下一樣的4G地址空間。LZ可以google其詳細(xì)流程。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2008-02-28 02:07 |只看該作者
謝謝!

第二個(gè)問題估計(jì)是我自己沒說清楚,現(xiàn)在回過頭來自己看看都覺得不知所言。
我到網(wǎng)上Google了下,看到了些文章。不過還是有不少地方不懂~我盡量表述的清楚點(diǎn)呵

開機(jī)后,CPU重置,從地址FFFFFFF0取第一個(gè)命令,這個(gè)地址正好落在ROM BIOS中。該地址內(nèi)容一定是一個(gè)JMP指令,系統(tǒng)便跳轉(zhuǎn)到該JMP指令所指的地方。

1,而這里之后我開始不明白了。JMP要跳轉(zhuǎn)到的位置是在高地址(4G末端)Flash Rom BIOS中還是在低地址(1M末端)的shadow BIOS呢?

2,位于低地址(1M處)的(BIOS shadow)是從Flash BIOS拷貝而來呢,還是沒有任何拷貝過程僅僅利用地址映射到原Flash BIOS中的呢?

3,無論是拷貝還是映射,內(nèi)存地址空間上ROM BIOS映射區(qū)只有 0xF0000~0x100000之間的64KB。而ROM本身有可能大于2M。那映射的應(yīng)該是原BIOS程序的一部分,那么是哪一部分呢?

我很頭大,不知道有沒有問到點(diǎn)子上,盼解答。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2008-02-28 12:48 |只看該作者
原帖由 daidongly 于 2008-2-28 02:07 發(fā)表
謝謝!

第二個(gè)問題估計(jì)是我自己沒說清楚,現(xiàn)在回過頭來自己看看都覺得不知所言。
我到網(wǎng)上Google了下,看到了些文章。不過還是有不少地方不懂~我盡量表述的清楚點(diǎn)呵

開機(jī)后,CPU重置,從地址FFFFFFF0取 ...

恩,這部分我不感確定說的正確,mik對(duì)開機(jī)流程很清楚的,說錯(cuò)了請(qǐng)糾正,還有版主哈:wink:
>>1,而這里之后我開始不明白了。JMP要跳轉(zhuǎn)到的位置是在高地址(4G末端)Flash Rom BIOS中還是在低地址(1M末端)的shadow BIOS呢?

肯定跳轉(zhuǎn)的目標(biāo)在1M+64k以下,不會(huì)到4G末端。因?yàn)檫@個(gè)時(shí)候還處于實(shí)模式,無法尋址到4G末端去。
注意,big real mode是必須執(zhí)行到保護(hù)模式再退回實(shí)模式才行,這個(gè)時(shí)候離開機(jī)已經(jīng)走了很遠(yuǎn)了。

>>2,位于低地址(1M處)的(BIOS shadow)是從Flash BIOS拷貝而來呢,還是沒有任何拷貝過程僅僅利用地址映射到原Flash BIOS中的呢?

是拷貝到內(nèi)存中的。如果是直接映射的BIOS的flash的話,那就是做I/O,效率就很低了。
這個(gè)應(yīng)該不叫拷貝,應(yīng)該說是加載。通常說BIOS拷貝是指下面的內(nèi)容

在實(shí)模式時(shí),執(zhí)行的都是未拷貝的BIOS代碼(還位于被加載到內(nèi)存中的位置)。拷貝通常應(yīng)該是OS為了在運(yùn)行過程中調(diào)用BIOS代碼,而把BIOS代碼“挪”到其它的地方,例如4G末端;或者是OS要使用BIOS占用的地址空間,而進(jìn)行“挪”。發(fā)生拷貝的時(shí)候離啟動(dòng)已經(jīng)很遠(yuǎn)了。所以開機(jī)時(shí)執(zhí)行的仍然是未拷貝前的BIOS代碼。

>>3,無論是拷貝還是映射,內(nèi)存地址空間上ROM BIOS映射區(qū)只有 0xF0000~0x100000之間的64KB。而ROM本身有可能大于2M。那映射的應(yīng)該是原BIOS程序的一部分,那么是哪一部分呢?

leagcy BIOS,也就是傳統(tǒng)的BIOS大小應(yīng)該都在64K之下。ROM本身大于2M,并非ROM就全部是用來裝BIOS代碼,例如用于存儲(chǔ)設(shè)置的NVRAM,應(yīng)該也包含在ROM之中。其次,ROM本身比BIOS例程大,也有提供給OEM商做擴(kuò)展的用途。例如現(xiàn)在很流行的linux-BIOS項(xiàng)目就是把一個(gè)裁剪過的linux放在BIOS中(聽說華碩都出產(chǎn)品了 )。
此外,如果BIOS代碼本身大于64K,那么它在地址空間中的布局就會(huì)有變化,例如我所用的平臺(tái)上BIOS代碼就位于4G-16M而非0xF0000~0x100000

個(gè)人的一些看法,歡迎大家指正。

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

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2008-02-29 12:39 |只看該作者
原帖由 zx_wing 于 2008-2-28 12:48 發(fā)表

恩,這部分我不感確定說的正確,mik對(duì)開機(jī)流程很清楚的,說錯(cuò)了請(qǐng)糾正,還有版主哈:wink:
>>1,而這里之后我開始不明白了。JMP要跳轉(zhuǎn)到的位置是在高地址(4G末端)Flash Rom BIOS中還是在低地址(1M末端)的 ...

第二個(gè)問題我應(yīng)該說錯(cuò)了。
如果第一次執(zhí)行的時(shí)候不是用的映射,那么把代碼加載到內(nèi)存中的動(dòng)作應(yīng)該是誰做的呢?那就應(yīng)該用的是映射。
我查查資料先。慚愧

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2008-02-29 19:59 |只看該作者
樓主是不是在看BIOS研發(fā)技術(shù)剖析?

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2008-02-29 21:54 |只看該作者
關(guān)于第二個(gè)問題,我想應(yīng)該是用map的,我沒找到具體資料,但有一份關(guān)于BIOS啟動(dòng)時(shí)的option rom的資料。opition rom是映射的,所以BIOS應(yīng)該也是映射的。
希望了解的朋友講一下。
這份spec也不錯(cuò),如果LZ在研究BIOS,我想對(duì)你有益,作為附件上傳

BIOS_Boot_Spec_v1.01.pdf

178.89 KB, 下載次數(shù): 1372

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2008-02-29 22:40 |只看該作者
我看過一些資料,可能是錯(cuò)誤的,僅供參考,切勿笑話。
1,386以后的cpu沒有什么真正的實(shí)模式,執(zhí)行第一條指令時(shí),也就是"jmp far f000:e05b"的時(shí)候就是所謂32位的分段機(jī)制(就是用GDT,IDT來分段的那個(gè)什么來著),32位CPU在實(shí)模式下的分段機(jī)制其實(shí)就是加了一些限制的32位分段機(jī)制,很明顯,執(zhí)行第一條指令的時(shí)候A20是開啟的。這個(gè)問題說起來話長(zhǎng),這里就不多說了,就此打住。我的觀點(diǎn)是這個(gè)跳轉(zhuǎn)是跳到1M以下的那個(gè)BIOS,在bochs里面就可以看到,第一條指令的地址是0xFFFFFFFF0,而第二條則位于0x000FE0FD.


2,據(jù)我了解,應(yīng)該是拷貝的, 在bochs源代碼中,有一個(gè)BIOS的實(shí)現(xiàn),包括rombios.c,rombois32.c等文件,大致流程是,先切換到32位模式,然后把flash rom中的bios拷貝到一個(gè)臨時(shí)區(qū)域,再告訴北橋芯片組將原先分配給flash BIOS的地址重新分配給DRAM bios.關(guān)于這一點(diǎn),我們可以在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拷貝到臨時(shí)區(qū)域
    v = pci_config_readb(d, 0x59);
    v = (v & 0x0f) | (0x30);               
    pci_config_writeb(d, 0x59, v); //這里估計(jì)就是所謂的重新映射
    memcpy((void *)0x000f0000, (void *)BIOS_TMP_STORAGE, 0x10000);   //從臨時(shí)區(qū)域拷貝到剛映射的DRAM中。
   
    i440_pcidev = *d;
}

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2008-02-29 23:01 |只看該作者
原帖由 cainiao911 于 2008-2-29 22:40 發(fā)表
我看過一些資料,可能是錯(cuò)誤的,僅供參考,切勿笑話。
1,386以后的cpu沒有什么真正的實(shí)模式,執(zhí)行第一條指令時(shí),也就是"jmp far f000:e05b"的時(shí)候就是所謂32位的分段機(jī)制(就是用GDT,IDT來分段的那個(gè)什么來著 ...

嗯,第一個(gè)問題已經(jīng)論述過好多次了,版內(nèi)也有不少帖子,反正就是所謂開機(jī)的混沌模式了。

第二個(gè)問題,我有一點(diǎn)看法。
不管是bochs還是QEMU,由于它們是模擬器,所以這個(gè)bios的拷貝動(dòng)作是把bios代碼拷貝到客戶機(jī)地址空間中對(duì)應(yīng)的位置,例如1M以下。這個(gè)是可以理解的。因?yàn)閷?duì)于虛擬技術(shù)來說,其中的實(shí)現(xiàn)可以和真實(shí)的不一樣,只要結(jié)果一樣就行。所以它可以直接把代碼拷貝到地址空間中對(duì)應(yīng)的位置以代替映射這個(gè)操作,反正對(duì)于BIOS來說只要它執(zhí)行對(duì)應(yīng)地址上的代碼,而不管這個(gè)地址是映射過來的,還是在內(nèi)存中有真正的物理頁與之對(duì)應(yīng)。
但是在真實(shí)平臺(tái)上,如果是拷貝的話,這個(gè)拷貝的動(dòng)作是誰執(zhí)行的,我就是這點(diǎn)沒想通,也沒找到資料。

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2008-02-29 23:25 |只看該作者
我還是認(rèn)為應(yīng)該是拷貝,我又找了一些證據(jù)。
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 ;
  ;-------------------------------;

首先聲明我是菜鳥啊,剛研究這些東西沒多久,我找證據(jù)只是為了尋找尋找答案,學(xué)習(xí)技術(shù),呵呵。

[ 本帖最后由 cainiao911 于 2008-2-29 23:26 編輯 ]
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP