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