下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 CT權(quán) 第三篇Lin u系統(tǒng)內(nèi)核分析 第8章Linu內(nèi)核簡介 本章介紹有關(guān) Lin uX勺內(nèi)核內(nèi)容,如系統(tǒng)初始化、運(yùn)行以及內(nèi)核提供的各種調(diào)用等。 8.1系統(tǒng)初始化 當(dāng)PC啟動時(shí),Inte系列的CPU首先進(jìn)入的是實(shí)模式,并開始執(zhí)行位于地址OxFFFF處的代 碼,也就是 ROM-BIO起始位置的代碼。BIOS先進(jìn)行一系列的系統(tǒng)自檢,然后初始化位于地 址0的中斷向量表。最后BIOS各啟動盤的第一個(gè)扇區(qū)裝入到0X7C0P并開始執(zhí)行此處的代碼。 這就是對內(nèi)核初始化過程的一個(gè)最簡單的描述。 最初,Linux核心的最開始部分是用8086匚編語言編寫的。當(dāng)開始運(yùn)行時(shí),核心將自己裝 入到絕對地址 0 x900
2、00再將其后的 2k字節(jié)裝入到地址0 x902(處,最后將核心的其余部分裝入 到0 x10000當(dāng)系統(tǒng)裝入時(shí),會顯示Loading言息。裝入完成后,控制轉(zhuǎn)向另一個(gè)實(shí)模式下的 匯編語言代碼 boot/Setup.S Setu部分首先設(shè)置一些系統(tǒng)的硬件設(shè)備,然后將核心從0 x100處移至0 x100處。這時(shí)系 統(tǒng)轉(zhuǎn)入保護(hù)模式,開始執(zhí)行位于0 x100處的代碼。 接下來是內(nèi)核的解壓縮。0 x100處的代碼來自于文件zBoot/head.它用來初始化寄存器 禾口調(diào)用 decompress_ke程el() decompress_ke程序由 zBoot/inflate.c, zBoot/un和p.c zB
3、oot/misCB成。解壓縮后的數(shù)據(jù)被裝入到了0 x1000處,這也是 Linux不能在內(nèi)存小于 2M 的環(huán)境下運(yùn)行的主要原因。 解壓后的代碼在0 x10100處開始執(zhí)行,緊接著所有的32位的設(shè)置都將完成:IDT GDT 和LDT將被裝入,處理器初始化完畢,設(shè)置好內(nèi)存頁面,最終調(diào)用start_kerne程。這大概是 整個(gè)內(nèi)核中最為復(fù)雜的部分。 start_kern程序用于初始化系統(tǒng)內(nèi)核的各個(gè)部分,包括: ?設(shè)置內(nèi)存邊界,調(diào)用pag in g_in初始臺化內(nèi)存頁面。 ?初始化陷阱,中斷通道和調(diào)度。 ?對命令行進(jìn)行語法分析。 ?初始化設(shè)備驅(qū)動程序和磁盤緩沖區(qū)。 ?校對延遲循環(huán)。 最后,系統(tǒng)核心轉(zhuǎn)向
4、move_to_user_moc以便創(chuàng)建初始化進(jìn)程(in it)。此后,進(jìn)程0開 始進(jìn)入無限循環(huán)。 8.2系統(tǒng)運(yùn)行 初始化進(jìn)程開始執(zhí)行/etc/init /bin/ini或/sbin/in中的一個(gè)之后,系統(tǒng)內(nèi)核就不再對程序 進(jìn)行直接控制了。之后系統(tǒng)內(nèi)核的作用主要是給進(jìn)程提供系統(tǒng)調(diào)用,以及提供異步中斷事件的 74訶 計(jì)計(jì)第二篇 Linu系統(tǒng)內(nèi)核分析 處理。多任務(wù)機(jī)制已經(jīng)建立起來,并開始處理多個(gè)用戶的登錄和fork(創(chuàng)建的進(jìn)程。 8.3內(nèi)核提供的各種系統(tǒng)調(diào)用 8.3.1進(jìn)程的基本概念和系統(tǒng)的基本數(shù)據(jù)結(jié)構(gòu) 從系統(tǒng)內(nèi)核的角度看來,一個(gè)進(jìn)程僅僅是進(jìn)程控制表(process tab中的一項(xiàng)。 進(jìn)程控制表中
5、的每一項(xiàng)都是一個(gè)task_struct結(jié)構(gòu),而task_struct結(jié)構(gòu)本身是在 in clude/li nux/sch中定義的。在task_strUCt構(gòu)中存儲各種低級和高級的信息,包括從一些 硬件設(shè)備的寄存器拷貝到進(jìn)程的工作目錄的鏈接點(diǎn)。 進(jìn)程控制表既是一個(gè)數(shù)組,又是一個(gè)雙向鏈表,同時(shí)又是一個(gè)樹。其物理實(shí)現(xiàn)是一個(gè)包括 多個(gè)指針的靜態(tài)數(shù)組。此數(shù)組的長度保存在in clude/li nux/tas定義的常量 NR_TASKS,其 缺省值為128數(shù)組中的結(jié)構(gòu)則保存在系統(tǒng)預(yù)留的內(nèi)存頁中。鏈表是由next_ta和prev_ta!k 個(gè)指針實(shí)現(xiàn)的,而樹的實(shí)現(xiàn)則比較復(fù)雜。 系統(tǒng)啟動后,內(nèi)核通常作為某一個(gè)
6、進(jìn)程的代表。一個(gè)指向task_struc的全局指針變量 current來記錄正在運(yùn)行的進(jìn)程。變量current能由kernel/sche中.的進(jìn)程調(diào)度改變。當(dāng)系統(tǒng) 需要查看所有的進(jìn)程時(shí),則調(diào)用for_each_tas這將比系統(tǒng)搜索數(shù)組的速度要快得多。 某一個(gè)進(jìn)程只能運(yùn)行在用戶方式(user mode或內(nèi)核方式(kernel mo)e下。用戶程序 運(yùn)行在用戶方式下,而系統(tǒng)調(diào)用運(yùn)行在內(nèi)核方式下。在這兩種方式下所用的堆棧不一樣:用戶 方式下用的是一般的堆棧,而內(nèi)核方式下用的是固定大小的堆棧(一般為一個(gè)內(nèi)存頁的大?。?。 8.3.2創(chuàng)建和撤消進(jìn)程 Linux系統(tǒng)使用系統(tǒng)調(diào)用fork(來創(chuàng)建一個(gè)進(jìn)程,使用
7、exit(來結(jié)束進(jìn)程。fork(和exit(的源 程序保存在ker nel/fork.c and kerne中xitfork(的主要任務(wù)是初始化要?jiǎng)?chuàng)建進(jìn)程的數(shù)據(jù)結(jié)構(gòu), 其主要的步驟有: 1)申請一個(gè)空閑的頁面來保存task_struct 2查找一個(gè)空的進(jìn)程槽(fin d_empty_pro)ss() 3為kernel_stack_pO請另一個(gè)空閑的內(nèi)存頁作為堆棧。 4)將父進(jìn)程的LDT表拷貝給子進(jìn)程。 5復(fù)制父進(jìn)程的內(nèi)存映射信息。 6)管理文件描述符和鏈接點(diǎn)。 撤消一個(gè)進(jìn)程可能稍微復(fù)雜些,因?yàn)槌废舆M(jìn)程必須通知父進(jìn)程。另外,使用kill()也可以 結(jié)束一個(gè)進(jìn)程。sys_kill() sys_w
8、a和 sys_ex都保存在文件 exit.中。 8.3.3執(zhí)行程序 使用fork(創(chuàng)建一個(gè)進(jìn)程后,程序的兩個(gè)拷貝都在運(yùn)行。通常一個(gè)拷貝使用exec調(diào)用另一 個(gè)拷貝。系統(tǒng)調(diào)用exec負(fù)責(zé)定位可執(zhí)行文件的二進(jìn)制代碼,并負(fù)責(zé)裝入和運(yùn)行。 Linux系統(tǒng)中的exec通過使用linux_binfr結(jié)構(gòu)支持多種二進(jìn)制格式。每種二進(jìn)制格式都 代表可執(zhí)行代碼和鏈接庫。linux_binfr結(jié)構(gòu)種包含兩個(gè)指針,一個(gè)指向裝入可執(zhí)行代碼的函 數(shù),另一個(gè)指向裝入鏈接庫的函數(shù)。 Unix系統(tǒng)提供給程序員6種調(diào)用exec()的方法。其中的5種是作為庫函數(shù)實(shí)現(xiàn),而 計(jì)75 sys_execv是由系統(tǒng)內(nèi)核實(shí)現(xiàn)的。它執(zhí)行一個(gè)十
9、分簡單的任務(wù):裝入可執(zhí)行文件的文件頭, 并試圖執(zhí)行它。如果文件的頭兩個(gè)字節(jié)是#!那么它就調(diào)用在文件第一行中所指定的解釋器,否 則,它將逐個(gè)嘗試注冊的二進(jìn)制格式。 8.4存取文件系統(tǒng) 眾所周知,文件系統(tǒng)是Unix系統(tǒng)最基本的資源。最初的Unix系統(tǒng)一般都只支持一種單一類 型的文件系統(tǒng),在這種情況下,文件系統(tǒng)的結(jié)構(gòu)深入到整個(gè)系統(tǒng)內(nèi)核中。而現(xiàn)在的系統(tǒng)大多都 在系統(tǒng)內(nèi)核和文件系統(tǒng)之間提供一個(gè)標(biāo)準(zhǔn)的接口,這樣不同文件結(jié)構(gòu)之間的數(shù)據(jù)可以十分方便 地交換。Lin uX也在系統(tǒng)內(nèi)核和文件系統(tǒng)之間提供了一種叫做VFS( virtual file system勺標(biāo)準(zhǔn) 接口。 這樣,文件系統(tǒng)的代碼就分成了兩部分:上
10、層用于處理系統(tǒng)內(nèi)核的各種表格和數(shù)據(jù)結(jié)構(gòu); 而下層用來實(shí)現(xiàn)文件系統(tǒng)本身的函數(shù),并通過VFS來調(diào)用。這些函數(shù)主要包括: ?管理緩沖區(qū)(buffer。) ?響應(yīng)系統(tǒng)調(diào)用 fentl(和 ioctl()(fcntl.c and ioctl.c) ?將管道和文件輸入輸岀映射到索引節(jié)點(diǎn)和緩沖區(qū)(fifo.c, pipe。) ?鎖定和不鎖定文件和記錄(locks.c) ?映射名字到索引節(jié)點(diǎn)(n amei.c, ope n.c) ?實(shí)現(xiàn) selec函數(shù)(selects) ?提供各種信息(stat.c) ?掛接和卸載文件系統(tǒng)(super ?調(diào)用可執(zhí)行代碼和轉(zhuǎn)存核心(execQ ?裝入各種二進(jìn)制格式(bin_fmt*Q VFS口則由一系列相對高級的操作組成,這些操作由和文件系統(tǒng)無關(guān)的代碼調(diào)用,并且 由不同的文件系統(tǒng)執(zhí)行。其中最主要的結(jié)構(gòu)有in ode_operat和ns
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 牙科診所運(yùn)營管理模式-洞察分析
- 虛擬化網(wǎng)絡(luò)運(yùn)維技術(shù)-洞察分析
- 虛擬貨幣交易機(jī)制創(chuàng)新-洞察分析
- 虛擬現(xiàn)實(shí)惡意軟件檢測-洞察分析
- 郵政快遞業(yè)競爭態(tài)勢-洞察分析
- 2024年05月江蘇中國建設(shè)銀行建行大學(xué)華東學(xué)院“建習(xí)生”暑期實(shí)習(xí)生招考筆試歷年參考題庫附帶答案詳解
- 《離散數(shù)學(xué)半群與群》課件
- 農(nóng)業(yè)大棚轉(zhuǎn)讓合同(2篇)
- MySQL數(shù)據(jù)庫教程課件
- 2024年05月北京中信銀行機(jī)構(gòu)客戶部社會招考(511)筆試歷年參考題庫附帶答案詳解
- 調(diào)味料生產(chǎn)工藝流程圖
- 2023北師大版六年級上冊數(shù)學(xué)期末試卷(共8套)
- 企業(yè)的涉稅風(fēng)險(xiǎn)
- 武漢大學(xué)抬頭信簽紙
- 新人教版七年級下冊生物每課知識點(diǎn)總結(jié)
- 印刷作業(yè)指導(dǎo)書
- 2022年農(nóng)業(yè)示范基地建設(shè)工作總結(jié)
- 硬筆書法比賽方案精選
- 火力發(fā)電廠山谷型干貯灰場設(shè)計(jì)
- 柳宗元毛筆楷書字帖
- 電伴熱帶熱計(jì)算表xls
評論
0/150
提交評論