【正文】
?上述硬件是固定型號的,與 Host OS的實際硬件無關(guān) ?可以直接從 ISO文件上安裝 ?在一個 VMware上安裝的的操作系統(tǒng)形成的虛擬機,可以拷貝到其他裝有 VMware的機器上 2022/8/14 xlanchen: Linux OS Analysis 54/152 virtualbox ? ?Windows和 Kubuntu下都可以安裝 ?Kubuntu下安裝的是 virtualboxose (Open Source Edition) 2022/8/14 xlanchen: Linux OS Analysis 55/152 SourceInsight ?源代碼閱讀和編輯工具 ?擁有內(nèi)置的對 C/C++, C和 Java等程序的分析。 1 . S A V E _ A L L 和 R E S T O R E _ A L L 保存和恢復的寄存器 2 . 異常處理函數(shù)中的 E r r or _c ode 為保持一致而保存的數(shù) C P U 在進入中斷或者異常 前自動保存的寄存器 1 . 中斷(狹)和系統(tǒng)調(diào)用保存的中斷號和系統(tǒng)調(diào)用號 2 . 或者, C P U 為產(chǎn)生硬件錯誤碼的異常保存的硬件錯誤碼 3 . 或者,為保持一致,在異常處理函數(shù)中,隨便保存的一個無效的數(shù) Include/asmx86/ 2022/8/14 xlanchen: Linux OS Analysis 42/152 SAVE_ALL和 restore_all arch/x86/kernel/ restore_all使用 RESTORE_REGS 2022/8/14 xlanchen: Linux OS Analysis 43/152 用戶態(tài)和內(nèi)核態(tài)的概念 ?Why? ?假定不區(qū)分 ?用戶直接修改操作系統(tǒng)的數(shù)據(jù) ?用戶直接調(diào)用操作系統(tǒng)的內(nèi)部函數(shù) ?用戶直接操作外設(shè) ?用戶任意讀 /寫物理內(nèi)存 2022/8/14 xlanchen: Linux OS Analysis 44/152 ?因此,要區(qū)分用戶態(tài)和內(nèi)核態(tài): ?禁止用戶程序和底層硬件直接打交道 (最簡單的例子,如果用戶程序往硬件控制寄存器寫入不恰當?shù)闹?,可能導致硬件無法正常工作 ) ?禁止用戶程序訪問任意的物理內(nèi)存 (否則可能會破壞其他程序的正常執(zhí)行,如果對核心內(nèi)核所在的地址空間寫入數(shù)據(jù)的話,會導致系統(tǒng)崩潰) 2022/8/14 xlanchen: Linux OS Analysis 45/152 ?什么是用戶態(tài)和內(nèi)核態(tài)? ?一般現(xiàn)代 CPU都有幾種不同的指令執(zhí)行級別 ?在高執(zhí)行級別下,代碼可以執(zhí)行 特權(quán)指令 ,訪問 任意的物理地址 ,這種 CPU執(zhí)行級別就對應著內(nèi)核態(tài) ?而在相應的低級別執(zhí)行狀態(tài)下,代碼的掌控范圍會受到限制。 l ong e f l a gs 。 i nt xe s 。 l ong e d i 。 movl $0x2,0xfffffff8(%ebp) … 調(diào)用者 ebp esp ebp esp esp c=‘a(chǎn)’ x=1 y=2 高地址 低地址 2022/8/14 xlanchen: Linux OS Analysis 36/152 eip eip eip eip 觀察程序運行時堆棧的變化 main … p1(c) … p2(x,y) … p1 p2 main p2 p1 程序的代碼段 堆棧 eip esp main堆棧 c eip eip p1的堆棧 esp eip eip x, y p2堆棧 2022/8/14 xlanchen: Linux OS Analysis 37/152 另一段小程序 和前一段小程序稍有不同 在這個小程序中, main函數(shù)中調(diào)用了函數(shù) p2,而在 p2的執(zhí)行過程中又調(diào)用了函數(shù) p1 2022/8/14 xlanchen: Linux OS Analysis 38/152 觀察程序運行時堆棧的變化 eip eip eip eip main … p2(x,y) … p1 p2 … p1(c) … main p2 p1 程序的代碼段 堆棧 eip esp main堆棧 esp eip eip x, y eip p2堆棧 eip eip c eip p1堆棧 esp 2022/8/14 xlanchen: Linux OS Analysis 39/152 觀察堆棧在內(nèi)核中的使用 ?在內(nèi)核代碼中經(jīng)常有這樣的函數(shù),它的參數(shù)是 struct pt_regs *regs 可以往回一層層的尋找這個參數(shù)是怎么傳遞過來的,最后我們可以發(fā)現(xiàn)最源頭的函數(shù)使用了這樣的參數(shù) struct pt_regs regs 比如 unsigned int do_IRQ(struct pt_regs *regs) 如果再進一步尋找是誰調(diào)用了這個 do_IRQ,我們會發(fā)現(xiàn)只是一條簡單的匯編語句 call do_IRQ 2022/8/14 xlanchen: Linux OS Analysis 40/152 為什么要有 pt_regs結(jié)構(gòu) ?用戶態(tài) vs 內(nèi)核態(tài) ?寄存器上下文 ?從用戶態(tài)切換到內(nèi)核態(tài)時 ?必須保存用戶態(tài)的寄存器上下文 ?要保存哪些? ?保存在哪里? ?中斷 /int指令會在堆棧上保存一些寄存器的值 ?如:用戶態(tài)棧頂?shù)刂?、當時的狀態(tài)字、當時的 cs:eip的值 2022/8/14 xlanchen: Linux OS Analysis 41/152 pt_regs結(jié)構(gòu) s t r u c t pt _ r e gs { l ong e bx。a39。T opcode[b+w+l] src, dest ?寄存器: %reg ?訪存大?。?[b+w+l] 8, 16, 32 bits ?引用內(nèi)存地址: section:disp(base, index, scale) ?實際偏移: base + index*scale + disp 缺省為 0 取值可以是 1, 2, 4, 8 2022/8/14 xlanchen: Linux OS Analysis 29/152 // 調(diào)用者 … call target … //建立被調(diào)用者函數(shù)的堆棧