簡介
作用是將應(yīng)用層序的請(qǐng)求傳遞給硬件,并充當(dāng)?shù)讓域?qū)動(dòng)程序,對(duì)系統(tǒng)中的各種設(shè)備和組件進(jìn)行尋址。目前支持模塊的動(dòng)態(tài)裝卸(裁剪)。Linux內(nèi)核就是基于這個(gè)策略實(shí)現(xiàn)的。Linux進(jìn)程1.采用層次結(jié)構(gòu),每個(gè)進(jìn)程都依賴于一個(gè)父進(jìn)程。內(nèi)核啟動(dòng)init程序作為第一個(gè)進(jìn)程。該進(jìn)程負(fù)責(zé)進(jìn)一步的系統(tǒng)初始化操作。init進(jìn)程是進(jìn)程樹的根,所有的進(jìn)程都直接或者間接起源于該進(jìn)程。virt/ ---- 提供虛擬機(jī)技術(shù)的支持。
Linux內(nèi)核預(yù)備工作
理解Linux內(nèi)核最好預(yù)備的知識(shí)點(diǎn):
懂C語言
懂一點(diǎn)操作系統(tǒng)的知識(shí)
熟悉少量相關(guān)算法
懂計(jì)算機(jī)體系結(jié)構(gòu)
Linux內(nèi)核的特點(diǎn):
結(jié)合了unix操作系統(tǒng)的一些基礎(chǔ)概念
Linux內(nèi)核的任務(wù):
1.從技術(shù)層面講,內(nèi)核是硬件與軟件之間的一個(gè)中間層。作用是將應(yīng)用層序的請(qǐng)求傳遞給硬件,并充當(dāng)?shù)讓域?qū)動(dòng)程序,對(duì)系統(tǒng)中的各種設(shè)備和組件進(jìn)行尋址。
2.從應(yīng)用程序的層面講,應(yīng)用程序與硬件沒有聯(lián)系,只與內(nèi)核有聯(lián)系,內(nèi)核是應(yīng)用程序知道的層次中的最底層。在實(shí)際工作中內(nèi)核抽象了相關(guān)細(xì)節(jié)。
3.內(nèi)核是一個(gè)資源管理程序。負(fù)責(zé)將可用的共享資源(CPU時(shí)間、磁盤空間、網(wǎng)絡(luò)連接等)分配得到各個(gè)系統(tǒng)進(jìn)程。
4.內(nèi)核就像一個(gè)庫,提供了一組面向系統(tǒng)的命令。系統(tǒng)調(diào)用對(duì)于應(yīng)用程序來說,就像調(diào)用普通函數(shù)一樣。
內(nèi)核實(shí)現(xiàn)策略:
1.微內(nèi)核。最基本的功能由中央內(nèi)核(微內(nèi)核)實(shí)現(xiàn)。所有其他的功能都委托給一些獨(dú)立進(jìn)程,這些進(jìn)程通過明確定義的通信接口與中心內(nèi)核通信。
2.宏內(nèi)核。內(nèi)核的所有代碼,包括子系統(tǒng)(如內(nèi)存管理、文件管理、設(shè)備驅(qū)動(dòng)程序)都打包到一個(gè)文件中。內(nèi)核中的每一個(gè)函數(shù)都可以訪問到內(nèi)核中所有其他部分。目前支持模塊的動(dòng)態(tài)裝卸(裁剪)。Linux內(nèi)核就是基于這個(gè)策略實(shí)現(xiàn)的。
哪些地方用到了內(nèi)核機(jī)制?
1.進(jìn)程(在cpu的虛擬內(nèi)存中分配地址空間,各個(gè)進(jìn)程的地址空間完全獨(dú)立;同時(shí)執(zhí)行的進(jìn)程數(shù)最多不超過cpu數(shù)目)之間進(jìn)行通 信,需要使用特定的內(nèi)核機(jī)制。
2.進(jìn)程間切換(同時(shí)執(zhí)行的進(jìn)程數(shù)最多不超過cpu數(shù)目),也需要用到內(nèi)核機(jī)制。
進(jìn)程切換也需要像FreeRTOS任務(wù)切換一樣保存狀態(tài),并將進(jìn)程置于閑置狀態(tài)/恢復(fù)狀態(tài)。
3.進(jìn)程的調(diào)度。確認(rèn)哪個(gè)進(jìn)程運(yùn)行多長的時(shí)間。
Linux進(jìn)程
1.采用層次結(jié)構(gòu),每個(gè)進(jìn)程都依賴于一個(gè)父進(jìn)程。內(nèi)核啟動(dòng)init程序作為第一個(gè)進(jìn)程。該進(jìn)程負(fù)責(zé)進(jìn)一步的系統(tǒng)初始化操作。init進(jìn)程是進(jìn)程樹的根,所有的進(jìn)程都直接或者間接起源于該進(jìn)程。
2.通過pstree命令查詢。實(shí)際上得系統(tǒng)第一個(gè)進(jìn)程是systemd,而不是init(這也是疑問點(diǎn))
3.系統(tǒng)中每一個(gè)進(jìn)程都有一個(gè)唯一標(biāo)識(shí)符(ID),用戶(或其他進(jìn)程)可以使用ID來訪問進(jìn)程。
Linux內(nèi)核源代碼的目錄結(jié)構(gòu)
Linux內(nèi)核源代碼包括三個(gè)主要部分:
內(nèi)核核心代碼,包括第3章所描述的各個(gè)子系統(tǒng)和子模塊,以及其它的支撐子系統(tǒng),例如電源管理、Linux初始化等
其它非核心代碼,例如庫文件(因?yàn)長inux內(nèi)核是一個(gè)自包含的內(nèi)核,即內(nèi)核不依賴其它的任何軟件,自己就可以編譯通過)、固件集合、KVM(虛擬機(jī)技術(shù))等
編譯腳本、配置文件、幫助文檔、版權(quán)說明等輔助性文件
使用ls命令看到的內(nèi)核源代碼的頂層目錄結(jié)構(gòu),具體描述如下。
include/ ---- 內(nèi)核頭文件,需要提供給外部模塊(例如用戶空間代碼)使用。
kernel/ ---- Linux內(nèi)核的核心代碼,包含了3.2小節(jié)所描述的進(jìn)程調(diào)度子系統(tǒng),以及和進(jìn)程調(diào)度相關(guān)的模塊。
mm/ ---- 內(nèi)存管理子系統(tǒng)(3.3小節(jié))。
fs/ ---- VFS子系統(tǒng)(3.4小節(jié))。
net/ ---- 不包括網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)的網(wǎng)絡(luò)子系統(tǒng)(3.5小節(jié))。
ipc/ ---- IPC(進(jìn)程間通信)子系統(tǒng)。
arch// ---- 體系結(jié)構(gòu)相關(guān)的代碼,例如arm, x86等等。
arch//mach- ---- 具體的machine/board相關(guān)的代碼。
arch//include/asm ---- 體系結(jié)構(gòu)相關(guān)的頭文件。
arch//boot/dts ---- 設(shè)備樹(Device Tree)文件。
init/ ---- Linux系統(tǒng)啟動(dòng)初始化相關(guān)的代碼。
block/ ---- 提供塊設(shè)備的層次。
sound/ ---- 音頻相關(guān)的驅(qū)動(dòng)及子系統(tǒng),可以看作“音頻子系統(tǒng)”。
drivers/ ---- 設(shè)備驅(qū)動(dòng)(在Linux kernel 3.10中,設(shè)備驅(qū)動(dòng)占了49.4的代碼量)。
lib/ ---- 實(shí)現(xiàn)需要在內(nèi)核中使用的庫函數(shù),例如CRC、FIFO、list、MD5等。
crypto/ ----- 加密、解密相關(guān)的庫函數(shù)。
security/ ---- 提供安全特性(SELinux)。
virt/ ---- 提供虛擬機(jī)技術(shù)(KVM等)的支持。
usr/ ---- 用于生成initramfs的代碼。
firmware/ ---- 保存用于驅(qū)動(dòng)第三方設(shè)備的固件。
samples/ ---- 一些示例代碼。
tools/ ---- 一些常用工具,如性能剖析、自測(cè)試等。
Kconfig, Kbuild, Makefile, scripts/ ---- 用于內(nèi)核編譯的配置文件、腳本等。
COPYING ---- 版權(quán)聲明。
MAINTAINERS ----維護(hù)者名單。
CREDITS ---- Linux主要的貢獻(xiàn)者名單。
REPORTING-BUGS ---- Bug上報(bào)的指南。文章來源:http://www.zghlxwxcb.cn/news/detail-805513.html
Documentation, README ---- 幫助、說明文檔。文章來源地址http://www.zghlxwxcb.cn/news/detail-805513.html
到了這里,關(guān)于Linux內(nèi)核架構(gòu)和工作原理詳解(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!