亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

2007-3-11 19:11:00 cpu執行第一條指令時情形

系統 1592 0
cpu執行的第一條指令不在內存中,眾所周知,內存是由ram組成的 ,而ram不斷電,可以保存信息,一旦斷電,ram中的信息將會丟失,所以cpu要執行的第一條指令被固化在rom中
以前8086年代,由于內存是1M的,所以rom被編址在1M的最后的64K中,所以它的段地址是0xFFFF0,這樣就不至于不ram分成兩個部分,就是將cs設置成0XF000,cpu執行的BIOS第一條指令的地址是:0XF000:FFF0H,這樣使得固件的地址在尋址空間靠后的位置16個字節處,這是一條跳轉指令,向前調轉到一個地方,然后開始執行, 啟動代碼由 jmp F000 : XXXX 中的偏移 XXXX 來把握,如果使用得多, XXXX 就小,使用得少, XXXX 就大,這樣使啟動代碼盡量靠后,而不浪費多余的地址空間,由于地址空間安排在最后,也不會把整個地址空間隔離成兩段。
而出現80386以后,內存已經大于1M,所以

如果把冷啟動固件編址在 F000h 段內,就會把整個地址空間隔離成不連續的兩段,一段是 F000h 以前的地址,一段是 1M 以后的地址,這很不方便。 intel 采用的辦法是,還是默認將執行啟動代碼的 BIOS ROM 編址在系統可尋址空間的最后(如 32 x86 機的話,這段地址就位于 4GB 的最后一個 64K 內),在系統復位時, CPU 進入實模式,并將 CS 寄存器設置成 F000h ,而將它的 shadow register Base 設置成 FFFF0000h (理論上正常情況下 CS F000h 的話,其 shadow register Base 應該設置成 000F 0000h ,但 intel 有意識的將高 12 位觸發成 1 了,除了這樣他也沒有什么好辦法讓機器一啟動就跑道 4GB 那么高的地址上去執行),而偏移量 EIP 置成 0000FFF0h ,所以機器執行的第一條指令的固件安排的物理地址顯然就變成了 FFFFFFF0h 。 BIOS 代碼和以前還是要兼容的,也就是說此時從 FFFFFFF0h 處取出的還是一條遠跳轉指令 jmp F000 : XXXX (我跟蹤調試過好幾款 BIOS ,這里的 XXXX 似乎都是 E05B ),問題隨之而來。這個遠跳轉指令是要更新 CS 寄存器和它的 shadow register 的,也就是說執行這條 jmp F000 : E05B 之后(也就是 CPU 執行第一條指令之后), CS 將被更新成 F000 ,其實 CS 原來就是這個值,這里說不上是更新,但 CS shadow register 就不一樣了,它被真正的更新了,它的 Base 域被更新成 000F 0000h 了(高 12 不再具有觸發成 1 的功能,那個功能只在機器啟動到第一次更新 CS 的內容期間有效)。這個 Base 再加上虛擬地址中的偏移量 E05B ,得到物理地址 000FE05Bh ,這就是 CPU 執行的第二條指令的地址,但是這條指令的地址已經是 1M 以內了。但我們不要忘記,這時的 F000h 段內可不再是 BIOS ROM 了,這一段此時安排的事實上是我們的 RAM 空間,這一段 RAM 需不需要初始化才能使用那還另說,關鍵是此時此刻這個地方不應該有可以執行的代碼才對啊? CPU 第二條指令就跳到這里不是自尋死路嗎 ?

似乎走進了死胡同,但我翻閱了很多資料,找到了一點線索。在很久以前出現過一個叫著 Chips & Technoloqies 的公司,他設計出一組被稱著 neat 的芯片組, 可以將內存高端的 BIOS ROM 映射到 1M 以內的 RAM 空間里 , 并且可以使這一段被映射的 RAM 空間具有與 ROM 類似的只讀屬性。 這個公司后來被 intel 收購。但后來這種映射似乎就成為了一種標準。由于這種映射關系我們有理由相信,機器啟動的時候, 4G 的最后一個 64K 里與 1M 的最后一個 64K 里應該具有相同的東西, 所以即使從 FFFFFFF0h 用一條 jmp 跳到 000FE05Bh ,也仍然能夠找到正確的代碼去執行。

那么 BIOS 接下來要干一些什么事呢?它有很多事情要做,我只舉幾件有代表性的,其中有兩件事是 DRAM 的初始化和 memory sizing 。按理說這個時候 CPU 還處在實模式下, BIOS 還沒有辦法去確定超過 1M 的內存量。另外還有一件事就是代碼和數據拷貝,因為映射到 1M 以內來的 BIOS ROM 容量有限,事實上還有很大一部分沒有映射過來,以壓縮的形式存放在高端的 ROM 中了, BIOS 1M 以內執行初始化時難免需要將高端的那些內容拷過來使用,這也是不容易做到的。但不要忘了,我們可以使用前面說的將段 break 4G 的方法來做成這幾件事。當然,似乎還存在著這樣一種可能性,那就是 切換到保護模式 ,這些事情就都可以做了,并且好像沒有必要再切換回實模式。情況沒有想象中那么簡單,從我前面的那個實驗看,我切換到保護模式之后只執行了幾行非常必要的將段 break 4G 的代碼,其他的事情一律不做,因為保護模式下有非常嚴格的特權檢查,并且需要設置 GDT , IDT , LDT 等一系列的表格,一般的代碼是不容易在保護模式下跑起來的,所以想在保護模式下完成整個 BIOS 的初始化,工程過于浩大,幾乎等于寫一套小型的保護模式操作系統了( FreeBios 可能就是這么干的)。

當然我也有足夠多的證據證明我們常用的 BIOS 都使用了這種 break limit 的技術,并且它們完成 break 后都是迅速切換回實模式 。
---------------------------------------------
                參考了

X86 CPU在段式管理下的地址形成機制以及BIOS初始化過程對這種機制的利用

                   陳英豪 ? 中科院計算所

2007-3-11 19:11:00 cpu執行第一條指令時情形


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日韩婷婷| 精品一区二区三区在线播放 | 夜夜爽夜夜操 | 国产香港特级一级毛片 | 国产一区二区三区日韩欧美 | jizz中国人 | 天天草天天干天天 | 狠狠色狠狠色 | 成人在线毛片 | 97在线免费视频观看 | 日本一级毛片aaaaa | 日韩 在线视频精品 | 高清中文字幕视频在线播 | 性生活国产| 狠狠综合久久久久综合 | 激情久久久久久久久久久 | 国产精品1区2区3区 国产精品1区2区3区在线播放 | 青青热久久久久综合精品 | 欧美日日夜夜 | 123日本不卡在线观看 | 日本xoxo | 久久久噜久噜久久综合 | 性欧美极品xxxx欧美一区二区 | 久久久久久久亚洲精品一区 | 久久久午夜影院 | 午夜国产福利 | 717影院理论午夜伦八戒 | 2018天天干天天操 | 亚洲精品欧美精品一区二区 | 欧美视频一二三区 | 神马影院我不卡888 神马影院我不卡手机 | 中文字幕视频一区 | 天天干天天拍天天射天天添天天爱 | 青青青国产在线手机免费观看 | 欧美激情久久久久久久久 | 在线手机福利免费福利院 | a国产精品 | 国产美女色视频 | 欧美一级爱操视频 | 久久精品国产免费一区 | 五月婷婷中文 |