Linux從頭學05-系統(tǒng)啟動過程中的幾個神秘地址,你知道是什么意思嗎?
-
0xFFFF:0x0000
-
0xF000:0xE05B
-
0x0000:0x7C00
0xFFFF:0x0000
這個地址,是處理器上電之后的第一個重要的物理地址。
段地址:0xFFFF當處理器的reset引腳被觸發(fā)后,處理器首先進行硬件初始化,也就是把處理器內(nèi)部的每個寄存器都設置為一個初始的默認狀態(tài):偏移地址:0x0000
計算得到物理地址:0xFFFF0
把段寄存器 cs 設置為 0xFFFF,指令寄存器 ip 設置為 0x0000;當所有的初始化完成之后,CPU 就開始執(zhí)行第一條指令。把其它的所有寄存器設置為 0x0000;
每一條指令的第一個字節(jié)都是操作碼,CPU 根據(jù)操作碼,能夠知道當前指令的字節(jié)長度,并把 ip 寄存器指向下一條指令。既然硬件初始化時,已經(jīng)把cs初始化為0xFFFF,把ip初始化為0x0000,經(jīng)過段尋址的公式計算之后,就得到了物理地址:0xFFFF0,也就是說,CPU 執(zhí)行的第一條指令位于物理地址0xFFFF0這個地方。
8086 處理器有 20 根地址線,尋址范圍是:0x00000 ~ 0xFFFFF,最大就是 1 MB。我們再回到系統(tǒng)的啟動流程。但是 8086 的處理器是 16 位的,寄存器最大表示的范圍是 0xFFFF,也就是 64 KB。
采用【段基址:偏移量】來表示一個段時,這個段的最大偏移范圍就是 64 KB。
所謂的映射:就是訪問某個地址空間中的內(nèi)容時,就會自動定位到被映射的目標物理設備中進行訪問,這是由硬件來保證的。CPU在執(zhí)行指令的時候,ip寄存器是遞增的,也就是說會從低地址到高地址,依次執(zhí)行每一條指令。
0xF000:0xE05B
這個地址處的代碼,才是BIOS真正開始執(zhí)行的地方。BIOS所做的事情包括:
偵測硬件設備:系統(tǒng)中有哪些硬件設備,工作狀態(tài)是什么;在BIOS的最后一個步驟中,它把引導程序讀取到內(nèi)存中0x0000:0x7C00地址處,計算得到物理地址就是:0x07C00。對硬件設備進行初始化:比如最初始的中斷向量表;
偵測操作系統(tǒng)啟動設備:選擇好一個系統(tǒng)盤之后,把系統(tǒng)盤中主引導扇區(qū)中的引導程序讀取到內(nèi)存中;
中間空著的那塊地址空間,映射到一些外設。
0x0000:0x7C00
這個地址,就是操作系統(tǒng)的引導代碼被讀取到內(nèi)存中的地方。
在此也鄙視一下現(xiàn)在很多的應用軟件,動不動就占用那么多的內(nèi)存,都以為整個電腦只為它一家軟件服務的?!可以看到,引導代碼幾乎位于RAM的頂端了,這樣的話,從中斷向量開始的0x00400,一直到引導代碼的0x07C00,這塊地址空間就是連續(xù)的一整塊,可以被操作系統(tǒng)更方便的操作。
------ End ------