linux操作系統(tǒng)內(nèi)核分析
linux操作系統(tǒng)內(nèi)核分析
“內(nèi)核”指的是一個(gè)提供硬件抽象層、磁盤及文件系統(tǒng)控制、多任務(wù)等功能的系統(tǒng)軟件。一個(gè)內(nèi)核不是一套完整的操作系統(tǒng)。一套基于Linux內(nèi)核的完整操作系統(tǒng)叫作Linux操作系統(tǒng),或是GNU/Linux。學(xué)習(xí)啦小編為大家?guī)?lái)了linux操作系統(tǒng)內(nèi)核分析詳解,希望大家喜歡。
linux操作系統(tǒng)內(nèi)核分析
一、操作系統(tǒng)概述
在Richard Stevens的unix環(huán)境高級(jí)編程中這樣定義“它控制計(jì)算機(jī)硬件資源,提供程序運(yùn)行環(huán)境。一般而言我們稱這種軟件為內(nèi)核(kernel),它相對(duì)較小,位于環(huán)境的中心”。總結(jié)下就是控制硬件,提供環(huán)境。程序員主要關(guān)心的是所謂的環(huán)境,主要說(shuō)下提供什么環(huán)境。
操作系統(tǒng)都會(huì)想它們運(yùn)行的程序提供各種服務(wù),執(zhí)行新的程序,打開(kāi)文件,讀文件,分配存儲(chǔ)空間,獲得當(dāng)前時(shí)間等(一般通過(guò)系統(tǒng)調(diào)用)。
廣義上,操作系統(tǒng)還有內(nèi)核外的系統(tǒng)調(diào)用,基于系統(tǒng)調(diào)用的shell(也是一種特殊的應(yīng)用程序,為其他應(yīng)用程序提供接口)和庫(kù)函數(shù)(對(duì)系統(tǒng)調(diào)用的封裝),和基于shell,系統(tǒng)調(diào)用,庫(kù)函數(shù)(這三個(gè)東西基本組成了我們常用的環(huán)境)的應(yīng)用軟件。有圖如下:
在使用linux的man幫助的時(shí)候可以指定是查詢系統(tǒng)命令還是系統(tǒng)調(diào)用使用man時(shí)可以指定不同的section來(lái)瀏覽,各個(gè)section 如下:
1 - commands
2 - system calls
3 - library calls
其實(shí)還有其他的section 不常見(jiàn)就沒(méi)有列出來(lái),可以man 1 chmod 也可以 man 2 chmod 得到的幫助內(nèi)容是不同的。
為了增加unix可移植性,IEEE定義了POSIX的標(biāo)準(zhǔn),后來(lái)這個(gè)標(biāo)準(zhǔn)不只限于unix操作系統(tǒng)。POSIX標(biāo)準(zhǔn)只是定義了一套接口,并沒(méi)有規(guī)定接口的實(shí)現(xiàn)(類似于概要設(shè)計(jì)),(各個(gè)操作系統(tǒng)對(duì)接口的實(shí)現(xiàn)可能有所不同),也沒(méi)有詳細(xì)的區(qū)分系統(tǒng)調(diào)用和庫(kù)函數(shù),所有的例程都叫做函數(shù)。需要說(shuō)明的是,并不是每個(gè)操作系統(tǒng)都嚴(yán)格遵守POSIX標(biāo)準(zhǔn),POSIX標(biāo)準(zhǔn)現(xiàn)在是一個(gè)很大的協(xié)議族(類似于TCP/IP),標(biāo)準(zhǔn)很多。
二、Linux 是什么內(nèi)核是什么
Linus Torvalds1991年的一片文章上寫道“
LINUX is a free unix-like kernel for 386-AT computers, coming with full source code. It is meant for hackers/computer science students to use, learn and enjoy. It is written mostly inC, but parts of it are in gnu-format assembler, and the boot-sequence is in intel 086 assembly language. TheC-code is relatively ANSI, with a few GNU enhancements (mostly__asm__ andinline).
”-其實(shí),linux只是一個(gè)主要用c寫的內(nèi)核。
從不同的角度來(lái)看,內(nèi)核擔(dān)任的角色不同。從純技術(shù)角度來(lái)看,內(nèi)核只是軟件和硬件的一個(gè)中間層,它把從軟件發(fā)來(lái)的請(qǐng)求發(fā)送給硬件,完成尋址等操作,還充當(dāng)了底層驅(qū)動(dòng)。
從應(yīng)用程序角度來(lái)看,內(nèi)核是對(duì)硬件的一個(gè)高層次的抽象,應(yīng)用程序與硬件沒(méi)有聯(lián)系,只與內(nèi)核有聯(lián)系,內(nèi)核是應(yīng)用程序知道的最底層。
從多個(gè)并發(fā)的進(jìn)程的角度來(lái)看,內(nèi)核是一個(gè)資源管理器,它完成對(duì)進(jìn)程的切換,調(diào)度,共享計(jì)算機(jī)資源(CPU,內(nèi)存,磁盤,網(wǎng)絡(luò)等)。
還可以把內(nèi)核看成一個(gè)庫(kù),通過(guò)系統(tǒng)調(diào)用向內(nèi)核發(fā)送各種請(qǐng)求。
三、內(nèi)核有什么
這個(gè)問(wèn)題是淘寶面試的時(shí)候問(wèn)我的問(wèn)題,當(dāng)時(shí)不知道從何下手,簡(jiǎn)單的總結(jié)下。有什么,最簡(jiǎn)單的就是直接看看內(nèi)核源代碼文件夾下有什么,一般內(nèi)核文件在linux的目錄/usr/src/kernels的文件夾下,我安裝的操作系統(tǒng)是redhet的,當(dāng)時(shí)沒(méi)有安裝上內(nèi)核源文件,而且即使是安裝上了也是2.6版本的,也不便于學(xué)習(xí),所以下載了一個(gè)0.11版本的在http://www.oldlinux.org/index_cn.html上面,1.0版本及以上的可在http://www.kernel.org/pub/linux/kernel/上下載到。
簡(jiǎn)單看下1.0版本有什么文件主要的:
drivers:驅(qū)動(dòng)代碼
fs:文件系統(tǒng)的代碼
include :包含文件,這個(gè)文件利用其他模塊重建內(nèi)核
init:初始化代碼,內(nèi)核工作的起點(diǎn) //這里面有內(nèi)核初始化程序main.c,是內(nèi)核完成所有初始化工作并進(jìn)入正常運(yùn)行的關(guān)鍵
ipc:進(jìn)程間通信的相關(guān)代碼
kernel:主內(nèi)核的代碼 //最重要的是進(jìn)程調(diào)度函數(shù)schedule()、sleep_on()函數(shù)和有關(guān)的系統(tǒng)調(diào)用程序
mm:內(nèi)存管理的代碼
net:網(wǎng)絡(luò)管理的代碼
0.11版本的.c文件代碼有8578行,而1.0版本里面的.c文件代碼大概有14w行,其中drives文件夾下就有7w行,2.6版本的有幾百萬(wàn)行,估計(jì)那是任何大嬸也讀不完的~
上面簡(jiǎn)單的說(shuō)明了源代碼的目錄結(jié)構(gòu),如果從系統(tǒng)的結(jié)構(gòu)來(lái)看,linux操作系統(tǒng)可以分成五個(gè)比較核心的模塊,進(jìn)程調(diào)度模塊,內(nèi)存管理模塊,文件系統(tǒng)模塊,進(jìn)程間通信模塊和網(wǎng)絡(luò)接口模塊。其中的內(nèi)存管理模塊用于確保所有的進(jìn)程能夠安全地共享機(jī)器主要內(nèi)存區(qū),同時(shí)內(nèi)存管理模塊還支持虛擬內(nèi)存的管理方式,使得Linux支持進(jìn)程使用比實(shí)際內(nèi)存空間多的內(nèi)存容量。文件系統(tǒng)模塊用于支持對(duì)外部設(shè)備的驅(qū)動(dòng)和存儲(chǔ),虛擬文件系統(tǒng)模塊通過(guò)對(duì)向所有的外部存儲(chǔ)設(shè)備提供一個(gè)通用的文件接口,隱藏了各種硬件設(shè)備的不同細(xì)節(jié),提高兼容性。下面是操作系統(tǒng)各個(gè)模塊間的簡(jiǎn)單關(guān)系,虛線和虛框表示0.11上還為實(shí)現(xiàn)。
從圖中可以看出,所有的模塊都與進(jìn)程調(diào)度模塊存在依賴關(guān)系,因?yàn)樗麄兌夹枰揽窟M(jìn)程調(diào)度程序來(lái)掛起(暫停)或重新運(yùn)行它們的進(jìn)程。還可以根據(jù)源代碼的結(jié)構(gòu)將內(nèi)核結(jié)構(gòu)劃分成如下的形式: