計算機開機執行的第一條指令是什么?


第一條指令的位置在FFFF:0000,也就是物理地址FFFF0。第一條指令是跳轉到F000:EO5B。

接下來准備由實模式進入保護模式。加載GDT,置PE位為1,清指令預取隊列並真正進入保護模式。

那么計算機一直更新換代,這種模式是如何一直保持兼容的呢?

追溯到最早 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的地方就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM