<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 深度介紹Linux內核是如何工作的

深度介紹Linux內核是如何工作的

作者: 時(shí)間:2016-10-08 來(lái)源:網(wǎng)絡(luò ) 收藏

本文發(fā)表于Linux Format magazine雜志,作者從技術(shù)深度上解釋了Linux Kernel是如何工作的。相信對Linux開(kāi)發(fā)者來(lái)說(shuō)有不小的幫助。

本文引用地址:http://dyxdggzs.com/article/201610/305866.htm

牛津字典中對kernel一詞的定義是:較軟的、通常是一個(gè)堅果可食用的部分。當然還有第二種定義:某個(gè)東西核心或者最重要的部分。對Linux來(lái)說(shuō),它的Kernel無(wú)疑屬于第二種解釋。讓我們來(lái)看看這個(gè)重要的東西是如何工作的,先從一點(diǎn)理論說(shuō)起。

廣義地來(lái)說(shuō)kernel就是一個(gè)軟件,它在硬件和運行在計算機上的應用程序之間提供了一個(gè)層。嚴格點(diǎn)從計算機科學(xué)的角度來(lái)說(shuō),Linux中的Kernel指的是Linus Torvalds在90年代初期寫(xiě)的那點(diǎn)代碼。

所有的你在Linux各版本中看到的其他東西--Bash shell、KDE窗口管理器、web瀏覽器、X服務(wù)器、Tux Racer以及所有的其他,都不過(guò)是運行在Linux上的應用而已,而不是操作系統自身的一部分。為了給大家一個(gè)更加直觀(guān)的感覺(jué),我來(lái)舉個(gè)例子,比如RHEL5的安裝大概要占據2.5GB的硬盤(pán)空間(具體多大當然視你的選擇安裝來(lái)定),在這其中,kernel以及它的各個(gè)模塊組件,只有47MB,所占比例約為2%。

在kernel內部

那么kernel到底是如何工作的呢?如下面的圖表。Kernel通過(guò)許多的進(jìn)入端口也就是我們從技術(shù)角度所說(shuō)的系統調用,來(lái)使得運行在它上面的應用程序可用。Kernel使用的系統調用比如讀和寫(xiě)來(lái)提供你硬件的抽象(abstraction)。

從程序員的視角來(lái)看,這些看起來(lái)只是普通的功能調用,然而實(shí)際上系統調用在處理器的操作模式上,從用戶(hù)空間到Kernel空間有一個(gè)明顯的切換。同時(shí),系統調用提供了一個(gè)Linux虛擬機,可以被認為是對硬件的抽象。

Kernel提供的更明顯的抽象之一是文件系統。舉例來(lái)說(shuō),這里有一段短的程序是用C寫(xiě)的,它打開(kāi)了一個(gè)文件并將內容拷貝到標準的輸出:

#include

int main()

{

int fd, count; char buf[1000];

fd=open(mydata, O_RDONLY);

count = read(fd, buf, 1000);

write(1, buf, count);

close(fd);

}

在這里,你可以看到四個(gè)系統調用的例子:打開(kāi)、讀、寫(xiě)和關(guān)閉。不談這段程序語(yǔ)法的細節,重點(diǎn)是:通過(guò)這些系統調用Linux Kernel提供了一個(gè)文件的錯覺(jué),而實(shí)際上它不過(guò)是一堆數據有了個(gè)名字,這樣一來(lái)你就不必去與硬件底層的堆棧、分區、頭和指針、分區等交涉了,而是直接以例子中的方式與硬件交流,這也就是我們所說(shuō)的抽象(abstraction),將底層的東西以更易懂的方式表達出來(lái)。

臺前幕后

系統文件是Kernel提供的較為明顯的一種抽象。還有一些特性不是這么的明顯,比如進(jìn)程調度。任何一個(gè)時(shí)間,都可能有好幾個(gè)進(jìn)程或者程序等待著(zhù)運行。Kernel的時(shí)間調度給每個(gè)進(jìn)程分配CPU時(shí)間,所以就一段時(shí)間內來(lái)說(shuō),我們會(huì )有種錯覺(jué):電腦同一時(shí)間運行好幾個(gè)程序。這是另外一個(gè)C程序:

#include

main()

{

if (fork()) {

write(1, Parentn, 7);

wait(0);

exit(0);

}

else {

write(1, Childn, 6);

exit(0);

}

}

在這個(gè)程序中創(chuàng )建了一個(gè)新進(jìn)程,而原來(lái)的進(jìn)程(父進(jìn)程)和新進(jìn)程(子進(jìn)程)都編寫(xiě)了標準輸出然后結束。注意系統調用fork(), exit() 以及 wait()執行程序的創(chuàng )建、結束和各自同步。這是進(jìn)程管理和調度中最典型的簡(jiǎn)單調用。

Kernel還有一個(gè)更加不易見(jiàn)到的功能,連程序員都不易察覺(jué),那就是存儲管理。每個(gè)程序運行得都好像它有個(gè)自己的地址空間來(lái)調用一樣,實(shí)際上它跟其他進(jìn)程一樣共享計算機的物理存儲,如果系統運行的存儲過(guò)低,它的地址空間甚至會(huì )被磁盤(pán)的交互區暫時(shí)寄用。存儲管理的另外一個(gè)方面是防止一個(gè)進(jìn)程訪(fǎng)問(wèn)其他進(jìn)程的地址空間--對于多進(jìn)程操作系統來(lái)說(shuō)這是很必要的一個(gè)防范措施。

Kernel同樣還配置網(wǎng)絡(luò )鏈接協(xié)議比如IP、TCP和UDP等,它們在網(wǎng)絡(luò )上提供機器對機器(machine-to-machine)和進(jìn)程對進(jìn)程(process-to-process)的通信。這里又會(huì )造成一種假象,即TCP在兩個(gè)進(jìn)程之間提供了一個(gè)固定連接--就好像連接兩個(gè)電話(huà)的銅線(xiàn)一樣,實(shí)際中卻并沒(méi)有固定的連接,特殊的引用協(xié)議比如FTP、DNS和HTTP是通過(guò)用戶(hù)級程序來(lái)實(shí)施的,而并非Kernel的一部分。

Linux(像之前的Unix)在安全方面口碑很好,這是因為Kernel跟蹤記錄了每個(gè)運行進(jìn)程的user ID和group ID,每次當一個(gè)應用企圖訪(fǎng)問(wèn)資源(比如打開(kāi)一個(gè)文件來(lái)寫(xiě)入)的時(shí)候,Kernel就會(huì )核對文件上的訪(fǎng)問(wèn)許可然后做出允許/禁止的命令。這種訪(fǎng)問(wèn)控制模式最終對整個(gè)Linux系統的安全作用很大。

Kernel還提供了一大套模塊的集合,其功能包括如何處理與硬件設備交流的諸多細節、如何從磁盤(pán)讀取一個(gè)分區、如果從網(wǎng)絡(luò )接口卡獲取數據包等。有時(shí)我們稱(chēng)這些為設備驅動(dòng)。

模塊化的Kernel

現在我們隊Kernel是做什么的已經(jīng)有了一些了解,讓我們再來(lái)簡(jiǎn)單看下它的物理組成。早期版本的Linux Kernel是整體式的,也就是說(shuō)所有的部件都靜態(tài)地連接成一個(gè)(很大的)執行文件。

相比較而言,現在的Linux Kernel是模塊化的:許多功能包含在模塊內,然后動(dòng)態(tài)地載入kernel中。這使得kernel的內核很小,而且在運行kernel時(shí)可以不必reboot就能載入和替代模塊。

Kernel的內核在boot time時(shí)從位于/boot 目錄的一個(gè)文件加載進(jìn)存儲中,通常這個(gè)/boot 目錄會(huì )被叫做KERNELVERSION,KERNELVERSION與kernel版本有關(guān)。(如果你想知道你的kernel版本是什么,運行命令行顯示系統信息-r。)kernel的模塊位于目錄/lib/modules/KERNELVERSION之下,所有的組件都會(huì )在kernel安裝時(shí)被拷貝。

管理模塊

大部分情況下,Linux管理它的模塊不需要你的幫忙,但是如果必要的時(shí)候有命令行可以來(lái)手動(dòng)檢查和管理模塊。比如,為了查清楚當前到底哪個(gè)模塊在載入kernel。這里有一個(gè)輸出的例子:


上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>