日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第五章--加载内核Kernel.bin

發(fā)布時間:2025/6/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第五章--加载内核Kernel.bin 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。