|  | |
| 嵌入式linux內核的五個子系統 | |
| Linux內(nei)核主要由(you)進程調度(SCHED)、內(nei)存管(guan)理(MM)、虛擬文件系統(VFS)、網絡(luo)接口(kou)(NET)和進程間通信(IPC)5個子系統組成,如圖1所(suo)示。      1.進程調度 進(jin)程(cheng)調(diao)度(du)控制系(xi)(xi)統(tong)中(zhong)(zhong)(zhong)的(de)(de)多個進(jin)程(cheng)對CPU的(de)(de)訪問(wen),使得多個進(jin)程(cheng)能在CPU中(zhong)(zhong)(zhong)“微觀串行(xing),宏(hong)觀并行(xing)”地執行(xing)。進(jin)程(cheng)調(diao)度(du)處于系(xi)(xi)統(tong)的(de)(de)中(zhong)(zhong)(zhong)心位置,內核中(zhong)(zhong)(zhong)其他(ta)的(de)(de)子(zi)系(xi)(xi)統(tong)都依(yi)賴它,因(yin)為(wei)每個子(zi)系(xi)(xi)統(tong)都需要掛起或恢(hui)復進(jin)程(cheng)。      如上(shang)圖2所(suo)示,Linux的(de)(de)進程(cheng)在幾(ji)個(ge)狀態(tai)間進行切換。在設(she)備驅(qu)動(dong)編(bian)程(cheng)中,當(dang)請(qing)求(qiu)的(de)(de)資源不(bu)能(neng)得到(dao)滿足時(shi),驅(qu)動(dong)一般(ban)會調度(du)其他進程(cheng)執行,并使本進程(cheng)進入(ru)睡(shui)眠(mian)(mian)狀態(tai),直到(dao)它請(qing)求(qiu)的(de)(de)資源被釋放,才會被喚(huan)醒(xing)而(er)進入(ru)就(jiu)緒(xu)態(tai)。睡(shui)眠(mian)(mian)分成(cheng)可被打斷(duan)(duan)(duan)的(de)(de)睡(shui)眠(mian)(mian)和不(bu)可被打斷(duan)(duan)(duan)的(de)(de)睡(shui)眠(mian)(mian),兩者的(de)(de)區別在于可被打斷(duan)(duan)(duan)的(de)(de)睡(shui)眠(mian)(mian)在收到(dao)信號的(de)(de)時(shi)候(hou)會醒(xing)。 在(zai)設(she)備驅動(dong)編程中,當請(qing)求的(de)資(zi)源(yuan)不能得到(dao)(dao)滿足時,驅動(dong)一般會調度其他進(jin)程執(zhi)行,其對應進(jin)程進(jin)入睡眠(mian)狀態,直(zhi)到(dao)(dao)它(ta)請(qing)求的(de)資(zi)源(yuan)被釋(shi)放(fang),才(cai)會被喚醒而進(jin)入就緒態。   設備(bei)驅(qu)動中,如果(guo)需(xu)要(yao)幾個并(bing)發(fa)執(zhi)行(xing)的任務,可以(yi)啟動內核(he)線程,啟動內核(he)線程的函數為:   pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); 2.內存管理 內(nei)存(cun)管理的主要作用是控(kong)制多個進(jin)程(cheng)安全地共享主內(nei)存(cun)區(qu)域。當(dang)CPU提供(gong)內(nei)存(cun)管理單(dan)元(MMU)時,Linux內(nei)存(cun)管理完成為(wei)每個進(jin)程(cheng)進(jin)行(xing)虛(xu)擬內(nei)存(cun)到物理內(nei)存(cun)的轉(zhuan)換。Linux 2.6引入了(le)對無(wu)MMU CPU的支持。 如下圖3所(suo)示,一般而言,Linux的每個(ge)進程享(xiang)有(you)4GB的內(nei)存(cun)空(kong)間(jian),0~3GB屬于用(yong)戶空(kong)間(jian),3~4GB屬于內(nei)核空(kong)間(jian),內(nei)核空(kong)間(jian)對常(chang)規內(nei)存(cun)、I/O設備內(nei)存(cun)以及高端內(nei)存(cun)存(cun)在不(bu)同的處(chu)理(li)方式。      3.虛擬文件系統 如下圖4所(suo)示(shi),Linux虛擬文件(jian)(jian)系(xi)(xi)統(VFS)隱藏各(ge)種(zhong)了硬件(jian)(jian)的(de)具體(ti)細(xi)節(jie),為所(suo)有的(de)設(she)備提(ti)供了統一(yi)的(de)接口。而且,它獨立(li)于各(ge)個具體(ti)的(de)文件(jian)(jian)系(xi)(xi)統,是對各(ge)種(zhong)文件(jian)(jian)系(xi)(xi)統的(de)一(yi)個抽象,它使用(yong)超      級塊super block存放文(wen)件系統(tong)相關信息,使(shi)用索引節點inode存放文(wen)件的物理(li)信息,使(shi)用目(mu)錄項dentry存放文(wen)件的邏(luo)輯信息。 4.網絡接口 網(wang)(wang)(wang)絡(luo)接口提供(gong)了對各(ge)種網(wang)(wang)(wang)絡(luo)標準(zhun)的(de)(de)(de)存(cun)取(qu)和(he)各(ge)種網(wang)(wang)(wang)絡(luo)硬(ying)件的(de)(de)(de)支持。如下圖5所示,在Linux中(zhong)網(wang)(wang)(wang)絡(luo)接口可(ke)分為網(wang)(wang)(wang)絡(luo)協(xie)(xie)議和(he)網(wang)(wang)(wang)絡(luo)驅(qu)動程序(xu),網(wang)(wang)(wang)絡(luo)協(xie)(xie)議部分負責(ze)實現(xian)每一(yi)種可(ke)能的(de)(de)(de)網(wang)(wang)(wang)絡(luo)傳輸協(xie)(xie)議,網(wang)(wang)(wang)絡(luo)設(she)備驅(qu)動程序(xu)負責(ze)與(yu)硬(ying)件設(she)備通(tong)信,每一(yi)種可(ke)能的(de)(de)(de)硬(ying)件設(she)備都有相應的(de)(de)(de)設(she)備驅(qu)動程序(xu)。      5.進程通信 進(jin)(jin)程通信(xin)(xin)支持提供進(jin)(jin)程之間的通信(xin)(xin),Linux支持進(jin)(jin)程間的多種通信(xin)(xin)機制,包含(han)信(xin)(xin)號量、共享內存、管道等,這些機制可協助(zhu)多個進(jin)(jin)程、多資源的互斥訪問、進(jin)(jin)程間的同步和消(xiao)息傳(chuan)遞。 Linux內核的(de)(de)5個組(zu)成部分之間的(de)(de)依賴(lai)關系如下。 ·進(jin)程(cheng)(cheng)調度與內存管理之間的(de)關(guan)系:這(zhe)兩(liang)個子(zi)系統互相依(yi)賴(lai)。在多道程(cheng)(cheng)序環境(jing)下(xia),程(cheng)(cheng)序要運行必須為之創建進(jin)程(cheng)(cheng),而創建進(jin)程(cheng)(cheng)的(de)第一件事情(qing),就是(shi)將程(cheng)(cheng)序和數據裝(zhuang)入內存。 ·進(jin)程間(jian)通(tong)信(xin)與內(nei)(nei)存管理(li)的(de)關系(xi):進(jin)程間(jian)通(tong)信(xin)子系(xi)統要依賴(lai)內(nei)(nei)存管理(li)支持共(gong)享內(nei)(nei)存通(tong)信(xin)機制,這種機制允許兩個進(jin)程除了擁(yong)有(you)自己的(de)私有(you)空間(jian),還可以存取共(gong)同(tong)的(de)內(nei)(nei)存區(qu)域(yu)。 ·虛(xu)擬文件(jian)系統與網(wang)絡接(jie)口(kou)之間的關系:虛(xu)擬文件(jian)系統利用網(wang)絡接(jie)口(kou)支(zhi)持網(wang)絡文件(jian)系統(NFS),也利用內存管理支(zhi)持RAMDISK設備。 ·內(nei)存(cun)管(guan)理與(yu)虛擬(ni)(ni)文(wen)件系(xi)統之間(jian)的關系(xi):內(nei)存(cun)管(guan)理利用虛擬(ni)(ni)文(wen)件系(xi)統支持交換(huan),交換(huan)進程(swapd)定(ding)期(qi)由調度程序(xu)調度,這也是內(nei)存(cun)管(guan)理依賴(lai)于進程調度的惟(wei)一(yi)原(yuan)因。當(dang)一(yi)個進程存(cun)取的內(nei)存(cun)映(ying)射被換(huan)出時,內(nei)存(cun)管(guan)理向文(wen)件系(xi)統發出請求,同時,掛起當(dang)前正在(zai)運行的進程。 除了這些(xie)依(yi)(yi)賴(lai)關系(xi)外,內核(he)中的(de)(de)所有(you)子(zi)系(xi)統(tong)還要依(yi)(yi)賴(lai)于一(yi)些(xie)共同的(de)(de)資源。這些(xie)資源包(bao)括所有(you)子(zi)系(xi)統(tong)都用到的(de)(de)例程,如分配和釋(shi)放內存空(kong)間(jian)的(de)(de)函數(shu)、打印(yin)警告(gao)或錯誤信(xin)息的(de)(de)函數(shu)及系(xi)統(tong)提供(gong)的(de)(de)調(diao)試(shi)例程等。 熱點鏈(lian)接(jie): 
         1、如何分析Linux內核源碼 |