關於BIOS的入口位址0xFFFF0

2021-07-05 21:30:24 字數 1954 閱讀 5839

一直都說開機加電之後,將cs設定為0xffff,ip設定為0x0000,這樣組成的位址就是0xffff0,而這個就是bios的入口位址,之後cpu讀取這個位址的**,然後就巴拉巴拉的開始執行下去了。

現在想知道這個位址0xffff0是在主機板上呢,還是在記憶體上。想著如果是統一編址的話,就可能是去讀取主機板上的rom,但是看書上的圖,有像是在ram中,如果是在 記憶體 中,那是什麼時候,由哪段程式將rom中的程式讀取到記憶體中的。自己猜的話,應該這個過程是固定的硬體實現的,將rom中的所有內容拷貝到記憶體中最高位那一段中,之後,0xffff0就必然是指記憶體中的位址了。

640kb~1mb 上位記憶體(這個區域的位址分配給rom,相應的384kb的ram被遮蔽掉。所謂的影子記憶體技術,就是把rom內容讀取到對應位址的ram中,以後系統就從ram中讀取資料,而不是從原來的rom讀取資料,從而提高速度。)

1mb~ 擴充套件記憶體

注:shadow ram也稱為"影子記憶體",是為了提高計算機系統效率而採用的一種專門技術,所使用的物理晶元仍然是cmos dram(動態隨機訪問儲存器,參閱本書後面的內容)晶元。shadow ram佔據了系統主存的一部分位址空間。其編址範圍為c0000~fffff,即為1mb主存中的768kb~1024kb區域。這個區域通常也稱為記憶體 保留區,使用者程式不能直接訪問。shadow ram的功能就是是用來存放各種rom bios的內容。也就是複製的rom bios內容,因而又它稱為rom shadow,這與shadow ram的意思一樣,指得是rom bios的"影子"。現在的計算機系統,只要一加電開機,bios資訊就會被裝載到shadow ram中的指定區域裡。由於shadow ram的物理編址與對應的rom相同,所以當需要訪問bios時,只需訪問shadow ram而不必再訪問rom,這就能大大加快計算機系統的運算時間。通常訪問rom的時間在200ns左右,訪問dram的時間小於100ns、60ns, 甚至更短。

在計算機系統執行期間,讀取bios中的資料或呼叫bios中的程式模組的操作將是相當頻繁的,採用了shadow ram技術後,無疑大大提高了工作效率。

386 之前與386之後,這個位址是不同的,但都在系統記憶體的最高 位址段。在386下為 fffffff0h。因為cs段是16位的,eip是32位的,為了得到乙個32位位址,386給cs段增加了幾個字段,這是隱藏的字段,系統可以通過 gdt,idt將更改段選擇子的字段,此時位址轉換就不是 段位址左移4位 + 偏移位址,而是cs的base欄位+偏移位址。

下面是乙個例子

當系統加電後,系統會復位。此時在386以前的系統下cs=f000h,ip=fff0h,bios位址為段位址左移4位 + 偏移位址擠即 f0000h + fff0h = ffff0h

在386以前系統可定址範圍為1mb即 00000h~fffffh

在386下cs=f000h,ip=fff0h,這是不變的,但是這時,cscs中的內容為:

selector = f000h (這個就是你可以看到的那部分內容)

這時隱藏的部分是不能用的,因為在實位址模式下,所以bios位址與386以前的位址一樣,

但是386可定址範圍為4gb 即 00000000h~ffffffffh,如果以這個位址(000ffff0h)作為bios位址的話,系統記憶體不連續,因此,386使用硬體置1的方式將a20~a31位址線置1,就變成fffffff0h,並以此作為bios位址。

這 個置1的結果是,隱藏的部分的乙個欄位base=ffff0000h,這個操作不是由更改描述符表實現的,因為還沒有進入保護模式,而且描述符表還沒有 建立。這是硬體實現的,而且當進行一次段間跳轉後,由於置1的結果就不能儲存,因為硬體設計是從會將其置0,所以當執行完fffffff0h處的指令 jmp ,base=00000000h,這時,bios就使用1m以下記憶體。

關於bios影子記憶體:

關於入口位址的形成,有的文章上說是cs 0xffff和ip 0x0000的組成,有的文章上說是 cs 0xf000 和ip 0xfff0的組合,我猜可能是不同硬體的初始化不同,只要最後形成的入口位址是 0xffff0就行了。如果不是我猜的那樣,那回頭在來補充吧。

詳解 0xff 的作用

通常配合移位操作符 使用 例如,有個數字 0x1234,如果只想將低8位寫入到記憶體中 將 0x1234 0xff 0x1234 表示為二進位制 00010010 00110100 0xff 表示為二進位制 11111111 兩個數做與操作,顯然將0xff補充到16位,就是高位補0 此時0xff 為...

關於BIOS的入口位址0xFFFF0

關於bios的入口位址0xffff0 一直都說開機加電之後,將cs設定為0xffff,ip設定為0x0000,這樣組成的位址就是0xffff0,而這個就是bios的入口位址,之後cpu讀取這個位址的 然後就巴拉巴拉的開始執行下去了。現在想知道這個位址0xffff0是在主機板上呢,還是在記憶體上。想著...

關於BIOS的入口位址0xFFFF0

一直都說開機加電之後,將cs設定為0xffff,ip設定為0x0000,這樣組成的位址就是0xffff0,而這個就是bios的入口位址,之後cpu讀取這個位址的 然後就巴拉巴拉的開始執行下去了。現在想知道這個位址0xffff0是在主機板上呢,還是在記憶體上。想著如果是統一編址的話,就可能是去讀取主機...