vxWorksbsp分析之rominit_第1頁
vxWorksbsp分析之rominit_第2頁
vxWorksbsp分析之rominit_第3頁
vxWorksbsp分析之rominit_第4頁
vxWorksbsp分析之rominit_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Rominit 分析包含 C 的 4 個(gè)頭文件。vxWorks.h 為系統(tǒng)頭文件sysLib.h 為系統(tǒng)提供給 BSP 的頭文件 config.h 是 BSP 的頭文件Asm.h。是系統(tǒng)頭號文件 開始數(shù)據(jù)段。以下內(nèi)容出現(xiàn)在數(shù)據(jù)段里 :.globl copyright_wind_river.long copyright_wind_river /* the first in .data */ .globl romwait.globl _romInit.globl _sdata 等等申明全局變量_romlnit和_sdata等定義一個(gè)以0結(jié)尾的字符串” start of data。這個(gè)串出現(xiàn)在數(shù)據(jù)段

2、的第一個(gè)無名 變量之后.text.align 16.text開始代碼段,以下內(nèi)容出現(xiàn)在代碼段里。.align 16使對齊編譯器進(jìn)行填充, 使得下一條指令出現(xiàn)在能被 16 整除的地址上 對齊可使 CPU 取指令快一點(diǎn)。進(jìn)入 rominit 處:Cli 關(guān)中斷jmp cold 跳轉(zhuǎn)到 cold 處。這是段內(nèi)相對跳轉(zhuǎn)。balign 16在32-bit代碼前加這樣的前綴可以讓它變?yōu)?6-bit代碼;在16-bit代碼前可以變?yōu)?32-bit 代碼 進(jìn)入 romWarmHigh 處:Cli 關(guān)中斷movl SP_ARG1(%esp),%ebx 把 esp+ SP_ARG1 偏移處的值賦予 ebx 寄存器

3、 jmp warm 跳轉(zhuǎn)到 warm 處。這是段內(nèi)相對跳轉(zhuǎn) .balign 16在32-bit代碼前加這樣的前綴可以讓它變?yōu)?16-bit代碼;在16-bit代碼 前可以變?yōu)?32-bit 代碼進(jìn)入 romWarmLow 處:cli 關(guān)中斷cld 清方向標(biāo)志movl $ RAM_LOW_ADRS,%esi /* 把 RAM_LOW_ADRS 地址賦給 esi movl $ ROM_TEXT_ADRS,%edi /*把 RAM_LOW_ADRS 地址賦給 edi movl $ ROM_SlZE,%ecx /*把 RAM_size 地址賦給 ecxshrl $2,%ecx /* ecx 右移兩位

4、256 字節(jié)變成 64 個(gè)雙字 repmovsl 循環(huán)執(zhí)行 esi-edi 真到 ecx=0movl SP_ARG1(%esp),%ebx 把 esp+ SP_ARG1 偏移處的值賦予 ebx 寄存器 jmp warm /* jump to warm */.ascii Copyright 1984-2002 Wind River Systems, Inc.balign 16,0x90cold: /cold 處.byte 0x67, 0x66 與 blign1 6功能相同lidt %cs:(romIdtr - romInit) 將中斷和量表加載到 cs:(romIdtr - romInit) 處

5、.byte 0x67, 0x66 與 blign1 6功能相同Igdt %cs:(romGdtr - romInit)將斷描述表加載到 cs:( romGdtr - romInit)處mov%cr0,%eax/* move CR0 to EAX */.byte0x66/* next inst has 32bit operand */or $0x00000001,%eax /* set the PE bit */mov %eax,%cr0 /* move EAX to CR0 */以上代碼的作用是將控制寄存器cr0的PE位置1jmp romInit1 /*跳轉(zhuǎn)到 rominit1 處。Romin

6、it1: 進(jìn)入 rominit1 處.byte0x66/* next inst has 32bit operand */mov$0x0010,%eax/* set data segment 0x10 is 3rd one */mov%ax,%ds/* set DS */mov%ax,%es/* set ES */mov%ax,%fs/* set FS */mov%ax,%gs/* set GS */mov%ax,%ss/* set SS */.byte0x66/* next inst has 32bit operand */mov$ ROM_STACK,%esp /* set lower me

7、m stack pointer */.byte0x67, 0x66/* next inst has 32bit operand */ljmp$0x08, $ ROM_TEXT_ADRS + romInit2 - romInit現(xiàn)在已進(jìn)入保護(hù)模式。 然而各個(gè)段寄存器的值, 以及它們的高速緩存寄存器中的 值還是實(shí)模式下的。把 DS, ES, FS, GS, SS寄存器設(shè)為0x0010,即指向GDT的 第2項(xiàng)(從0開始),DPL=0。它們都指向一個(gè)段。把堆棧指針esp設(shè)為ROM_STACK,由于CS還是以前的值,意味著目前代碼段的屬性還是16-bit代碼。 所以使用指令前綴以執(zhí)行32-bit代碼。執(zhí)

8、行一個(gè)遠(yuǎn)程段間跳轉(zhuǎn)修改 CS。CS的新 值為0x08,即GDT的第1項(xiàng),DPL=0。修改CS時(shí)它的高速緩存寄存器也會(huì)自 動(dòng)更新。romIDT (In terrupt Description Table),中斷描述符表,空的。 romGdtr:.word 0x0027.long ROM_TEXT_ADRS + ROM_GDT/設(shè)置段描述表的大小及基地址balign 16,0x90romGdt: 段描述表/* 0(selector=0x0000): Null descriptor */.word .word .byte .byte .byte .byte0x00000x00000x000x000x

9、000x00/* 1(selector=0x0008): Code descriptor */.word.word.byte0xffff/* limit: xffff */ 段界限低 16位0x0000/* base : xxxx0000 */ 基地址低 16位0x00/* base : xx00xxxx */ 基地址中間 8 位.byte.byte.byte0x9a/段屬性0xcf/段屬性含段界限高 4 位0x00/* base :基地址高 8 位/* 2(selector=0x0010): Data descriptor */.word .word .byte .byte .byte .b

10、yte0xffff/* limit: xffff */0x0000/* base : xxxx0000 */0x00/* base : xx00xxxx */0x92/* Data r/w, Present, DPL0 */0xcf/* limit: fxxxx, Page Gra, 32bit */0x00/* base : 00xxxxxx */* 3(selector=0x0018): Code descriptor, for the nesting interrupt */.word .word .byte.byte .byte .byte0xffff/* limit: xffff *

11、/0x0000/* base : xxxx0000 */0x00/* base : xx00xxxx */0x9a/* Code e/r, Present, DPL0 */0xcf/* limit: fxxxx, Page Gra, 32bit */0x00/* base : 00xxxxxx */* 4(selector=0x0020): Code descriptor, for the nesting interrupt */.word0xffff/* limit: xffff */.word0x0000/* base : xxxx0000 */.byte0x00/* base : xx0

12、0xxxx */.byte0x9a/* Code e/r, Present, DPL0 */.byte0xcf/* limit: fxxxx, Page Gra, 32bit */.byte0x00/* base : 00xxxxxx */.balign 16,0x90romInit2:/ 進(jìn)入 rominit2 處cli 關(guān)中斷movl $ ROM_STACK,%esp 設(shè)置 esp 成 rom_stack 0x8000h#if defined (TGT_CPU) & defined (SYMMETRIC_IO_MODE) movl $ MP_N_CPU, %eax lock incl (%

13、eax)#endif 定義 TGT_CPU 和 SYMMETRIC_IO_MODE#ifdef INCLUDE_WINDML /* WindML + VesaBIOS initialization */Movl $ VESA_BIOS_DATA_PREFIX,%ebx/* move BIOS prefix addr to EBX */movl $ VESA_BIOS_KEY_1,(%ebx) /* store BIOS */addl $4, %ebx/* increment EBX */movl $ VESA_BIOS_KEY_2,(%ebx) /* store DATA */movl $ V

14、ESA_BIOS_DATA_SIZE,%ecx /* load ECX with nBytes to copy */shrl$2,%ecx/* get nLongs to copy */movl $0,%esi/* load ESI with source addr */movl $ VESA_BIOS_DATA_ADDRESS,%edi /* load EDI with dest addr */ repmovsl/* copy BIOS data to VRAM */#endif /* INCLUDE_WINDML */*/ 定義 INCLUDE_WINDML 并初始化 VesaBIOS/*

15、 enable A20 */* is A20 enabled? */ no: jump romInitHlt */#ifndef INCLUDE_IACSFL call FUNC(romA20on) cmpl $0, %eax jne romInitHlt /*#endif定義 INCLUDE_IACSFLwarm:/進(jìn)入 warm 處ARCH_REGS_INIT/*初始化DR0-7標(biāo)志位寄存器*/#if (CPU = PENTIUM) | (CPU = PENTIUM2) | (CPU = PENTIUM3) | (CPU = PENTIUM4) xorl %eax, %eax /* zer

16、o EAX */ movl %eax, %cr4#endif 如果是奔騰系列初將 cr4 清零movl $romGdtr,%eax 加載前面的 romGdt 表subl$ FUNC(romInit),%eaxaddl$ ROM_TEXT_ADRS,%eaxpushl %eaxcall FUNC(romLoadGdt)movl $ STACK_ADRS, %esp /* initialise the stack pointer */movl $ ROM_TEXT_ADRS, %esi /* get src addr(ROM_TEXT_ADRS)movl $ romInit, %edi /* ge

17、t dst addr(romInit) */cmpl %esi, %edi /* is src and dst same? */je romInit4如果rom_text_adrs和rominit處相同的話就跳轉(zhuǎn)到 rominit4處執(zhí)行movl $ FUNC(end), %ecx /* get end addr */subl%edi, %ecx/* get nBytes to copy */shrl$2, %ecx/* get nLongs to copy */cld/* clear the direction bit */rep/* repeat next inst ECX time */

18、movsl如果rom_text_adrs和rominit處不相同的話 將rom_text_adrs處拷貝至 (en d-romi nit)處romlnit4:進(jìn)入 rominit4 處xorl %ebp, %ebp ebp 清零pushl $0popfl /清標(biāo)志寄存器pushl %ebx ebx 進(jìn)棧movl $ FUNC(romStart),%eax /* jump to romStart */ call *%eax /跳轉(zhuǎn)到romStart處執(zhí)下一步。romInitHlt:pushl %eaxcall FUNC(romEaxShow)/調(diào)用 romEaxShow 顯示 eax 寄存器的內(nèi)

19、容hltjmp romInitHlt 死循環(huán),當(dāng)機(jī).balign 16,0x90FUNC_LABEL(romA20on)/進(jìn)入romA20on處:打開a20以擴(kuò)大尋址范圍空間 call FUNC(romWait) /調(diào)用 romwait 等待movl $0xd1,%eax /* 向 64h 寄存器寫入 d1h*/ outb %al,$0x64call FUNC(romWait)movl $0xdf,%eax/* Enable A20 */outb %al,$0x60call FUNC(romWait)向 60h 寄存器寫入 dfh*/ 調(diào)用 romwait 等待movl $0xff,%eax

20、向 64h 寄存器寫入 ffh*/ outb %al,$0x64call FUNC(romWait) 調(diào)用 romwait 等待movl $0x000000,%eax/* Check if it worked */movl $0x100000,%edxpushl (%eax)pushl (%edx)movl $0x0,(%eax)movl $0x0,(%edx)movl $0x01234567,(%eax)cmpl $0x01234567,(%edx)popl (%edx)popl (%eax)jne romA20on0以上代碼是檢查 A20地址線是否打開,就是檢查 OOOOOOh和10000

21、0是否相同, 即當(dāng)超過 20 位時(shí)看看會(huì)不會(huì)和第 0 位時(shí)相同,如果不相同說明打開了 A20 地址 線。否則沒打開。嘗試別一種方法打開/* another way to enable A20 */movl $0x02,%eaxoutb %al,$0x92 /向 92H 寄存器寫入 02 xorl %ecx,%ecx ecx 清零romA20on1:/ 接著上面向 92H 寄存器寫入 02 后 inb $0x92,%al andb $0x02,%alloopz romA20on1 / 確保 92H 為 02movl $0x000000,%eax /* Check if it worked */ movl $0x100000,%edxpushl (%eax) pushl (%edx) movl $0x0,(%eax) movl $0x0,(%edx) movl $0x01234567,(%eax) cmpl $0x01234567,(%edx) popl (%edx) popl (%eax) jne romA20on0movl $ 0xdeaddea

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論