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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/6/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第五章--加载内核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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。