計算機bios讀取硬碟第乙個扇區的資料到記憶體0x7c00位置,將控制權交給主引導記錄(mbr),mbr再搜尋系統的活動分割槽表,載入活動分割槽表的第乙個扇區到乙個固定的位址。mbr接下來將控制權交給pbr,pbr解析fat或ntfs格式檔案系統,找到引導核心的檔案ntldr,將該檔案載入到0x20000。最後將控制權交給ntldr進行核心啟動。
原版的啟動原始碼是一段匯程式設計序,這段匯程式設計序的路徑大概是在「\boot\freeldr\bootsect\dosmbr.asm」。
我這裡參考的原始碼不是原版reactos,這裡的參考原始碼是源於《windows核心設計思想》作者陳樹寶改寫的精簡版bmr啟動原始碼。我檢視了原版dosmbr**,它的**更加接近於windows xp的啟動邏輯。陳樹寶的版本更加易於理解。下面給出陳樹寶的**片段:
start:
cli; 關中斷,將標誌暫存器中的中斷標誌位清零,禁止中斷;
xor ax, ax ; 異或運算,兩個運算元相同,即清零運算;
mov ss, ax ; 設定棧段暫存器,段暫存器清零;
mov sp, 7c00h ; 設定棧頂,棧頂為0x7c00;
sti ; 開中斷,將標誌暫存器中的中斷標誌位置1,開啟中斷;
push
07c0h
pop ds
mov ax, 07c0h ; 設定資料段暫存器
mov ds, ax
; 載入ntldr
push dword 80000h/512-8
; count - ntldr扇區總數,80000h / 512 - 8 = 0x3f8
push dword 8
; src - 開始讀取的扇區號
push dword 20000h ; des - 存放資料的目的位址
call loadsector ; 載入扇區
;ntfsboot jmp 0x2000:0000,fatboot jmp 0x2000:0003
push word 2000h
push word 0000h
o16 retf
未完待續… 分析核心原始碼,裝置樹
u boot需要將裝置樹在記憶體中的儲存位址傳給核心。該樹主要由三大部分組成 頭 header 結構塊 structure block 字串塊 strings block 裝置樹在記憶體中的儲存布局圖如下 1.1 頭 1.2 結構塊 struct block 扁平裝置樹結構塊是線性化的樹形結構,和字...
Linux核心 fork 原始碼分析
核心版本 linux 4.4.18 原始碼位置 這裡 接著 呼叫copy process 它設定了程序描述符以及子程序所需的任何其他核心資料結構。ftrace graph init task 初始化ftrace,核心追蹤函式呼叫。rt mutex init task 初始化鎖。copy creds ...
原始碼分析 Linux 核心工具Sparse
sparse誕生於2004年,是由linux之父開發的,目的就是提供乙個靜態檢查 的工具,從而減少linux核心的隱患。起始,在sparse之前已經有了乙個不錯的 靜態檢查工具 swat 只不過這個工具不是免費軟體,使用上有一些限制。所以linus自己開發了乙個靜態檢查工具。核心 中有乙個對spar...