第五章--加载内核Kernel.bin
1、Linux系統的安裝 和 與宿主計算機共享文件夾
2、global 和 extern 關鍵字的作用
3、C調用規范(C Calling Convention)
4、ELF文件
5、Loader.bin進行加載內核——進入保護模式——向內核交出控制權
一、Linux系統的安裝 和 與宿主計算機共享文件
提到Linux系統的安裝,我們需要回歸到第2章中2.3節——"安裝虛擬Linux"。本書的作者使用的是在Virtual PC上安裝的Red Hat 9.0,然后通過samba來實現與宿主機進行文件共享。開始我也是很想在Virtual PC上嘗試安裝和共享文件,但是n次共享文件失敗后,我失去了信心,我最后實現了Linux系統與Windows系統進行相互ping IP,但是執行mount指令總是失敗。最后不得已換了虛擬機,嘗試使用了WMware。
1、Linux系統的安裝
?Linux系統的安裝按著課本中提到的幾個主要步驟來完成,其他的次要步驟基本直接就Next。可以參照如下:
http://blog.csdn.net/zgh1988/article/details/7315676
2、與宿主計算機共享文件
(1)????如果你使用的是Virtual PC虛擬機,你可以嘗試按著以下步驟來實現,
http://hi.baidu.com/weiloujushi/blog/item/3c3bd8586d688cda9c8204bf.html
(2) 如果你使用的是VMware虛擬機的話,首先VMware虛擬機可以通過它的VM Tools來實現文件夾的共享,所以我們要在Red Hat9.0上安裝VM Tools,下面就是安裝VM Tools的主要步驟,你可以嘗試按著以下步驟來實現:
點擊VMware菜單欄的VM--->Install VMware Tools....
執行之后,會將VMware Tools添加到cdrom中,通過cd指令進入到cdrom,然后執行ls,顯示出該文件夾內所包含的文件,你會發現有存在一個WMwareTools-8.4.5-324285.tar.gz,然后執行tar -zxvfWMwareTools-8.4.5-324285.tar.gz -C /tmp,將其解壓縮到/tmp文件夾內。
我們利用cd指令進入到解壓縮文件,會發現在/tmp文件夾下,有vmware-tools-distrib,繼續進入到vmware-tools-distrib,
然后會發現該文件夾內存在一個 vmware-install.pl,這就是該VMware-tools的安裝文件。
繼續執行./vmware-install.pl,進行安裝。在安裝好之后,需要對環境進行配置,基本上都是選擇yes進行默認的環境配置,有一個選擇分辨率的需要根據情況進行選擇,我選擇的是800*600,如果你選擇的分辨率過高,可能會出現問題。
安裝好VMware-tools之后,我們設置文件共享,選擇VM -->Setting--> Options-->Shared Folders
設置其為Always enabled。然后將宿主計算機上的一個文件,添加到共享文件夾選項里,實現該文件的共享。
共享文件夾之后,需要在Linux系統里查找該文件,首先執行df,查看磁盤分配情況,發現最后一行為./host:/。這個就是我們所要共享的文件夾,在Linux系統中,它的路徑名為 /mnt/hgfs。于是我們使用cd命令來進入該文件
cd /mnt ? ?cd hgfs ? ?cd Tinix 每執行一步,通過ls來查看該文件夾的情況。
二、global 和 extern 關鍵字的作用
global + 函數名/變量名? 的作用是:向外界提供函數和變量鏈接接口。
extern + 函數名/變量名? 的作用是:從外界引入函數和變量。
三、C調用規范(C Calling Convention)
簡單的介紹一下C調用規范,有兩條規定:1、后面的參數先入棧;2、由調用者(Caller)清理堆棧。
首先我們知道 函數int choose(int a, int b),a和b為形式參數,該函數存在于bar.c中。
然后在foo.asm中調用choose函數,首先需要將其參數(numlst和num2nd)入棧,我們在程序中整個調用過程是這樣完成的:由于使用的是C調用規范,故后面的參數先入棧,則實參num2nd的值將會傳遞給形參b;而實參num1st的值將會傳遞給形參a;所以當調用choose函數時,相當于執行了choose(num1st, num2nd),故結果將返回 the 2nd one。
通過程序執行的結果,來證明我們的分析是正確的。
四、ELF文件
下面只是根據書上的內容,來簡單的介紹一下數據結構,等以后對ELF進行深入研究之后,會專門寫一篇關于ELF文件的介紹。
1、ELF文件格式:
由圖中可以看出, ELF文件由4部分組成: ELF頭(ELF header)、程序頭表(Program header table)、節(Sections)和節頭表(Section header table)。
2、ELF header的格式:
#define EI_NIDENT 16
typedef struct{
unsigned char ? ? ? ? ? ? ? e_ident[EI_NIDENT];
Elf32_Half ? ? ? ? ? ? ? ? ? ? e_type; ? ? ? ? ? ? ?//標識該文件的類型
Elf32_Half ? ? ? ? ? ? ? ? ? ? e_machine; ? ? ? //表明運行該程序需要的體系結構
Elf32_Word ? ? ? ? ? ? ? ? ?e_version; ? ? ? ? //確定文件的版本
Elf32_Addr ? ? ? ? ? ? ? ? ? e_entry; ? ? ? ? ? ? //程序的入口地址
Elf32_Off ? ? ? ? ? ? ? ? ? ? ? e_phoff; ? ? ? ? ? ?//Program header table在文件中的偏移量
Elf32_Off ? ? ? ? ? ? ? ? ? ? ? e_shoff; ? ? ? ? ? ?//Section header table 在文件中的偏移量
Elf32_Word ? ? ? ? ? ? ? ? ? e_flags; ? ? ? ? ? //對IA32而言,此項為0
Elf32_Half ? ? ? ? ? ? ? ? ? ? ?e_ehsize; ? ? ? ? //ELF header的大小
Elf32_Half ? ? ? ? ? ? ? ? ? ? ?e_phentsize; ? //Program header table中每一個條目的大小
Elf32_Half ? ? ? ? ? ? ? ? ? ? ?e_phnum; ? ? ? ? //Program header table中有多少個條目
Elf32_Half ? ? ? ? ? ? ? ? ? ? ?e_shentsize; ? //Section header table 中每一個條目的大小
Elf32_Half ? ? ? ? ? ? ? ? ? ? ?e_shnum; ? ? ? ? //Section header table中有多少個條目
Elf32_Half ? ? ? ? ? ? ? ? ? ? ?e_shstrndx;
}Elf32_Ehdr;
3、Program header數據結構:
typedef struct {
Elf32_Wordp_type;//當前Program header所描述的段的類型
Elf32_Offp_offset;//段的第一個字節在文件中的偏移
Elf32_Addrp_vaddr;//段的第一個字節在內存中的虛擬地址
Elf32_Addrp_paddr;//在物理地址定位相關的系統中,此項是為物理地址保留
Elf32_Wordp_filesz;//段在文件中的長度
Elf32_Wordp_memsz;//段在內存中的長度
Elf32_Wordp_flags;//與段相關的標識
Elf32_Wordp_align;//根據此項值來確定段在文件中以及內存中如何對齊
}
五、Loader.bin進行加載內核——進入保護模式——向內核交出控制權
在面對一些復雜的程序時,我習慣做出一個簡單的流程圖,就是將整個程序過程一點點的走一遍,以便熟悉整個流程。下面就是我自己腦子里邊想邊繪出來的流程圖,雖然簡單,不規范,但是思路還是清晰得。
1、Loader加載內核
2、Loader進入保護模式
3、向內核交出控制權
就這樣。我們從無到有,一點點的完成了Loader的所有工作。
4、下面就是最終的內存分配圖
總結
以上是生活随笔為你收集整理的第五章--加载内核Kernel.bin的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第三章--堆栈段的工作方式
- 下一篇: 特权级和调用门