0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

快速理解什么是Linux內(nèi)核以及Linux內(nèi)核的內(nèi)容

Q4MP_gh_c472c21 ? 來(lái)源:嵌入式ARM ? 作者:嵌入式ARM ? 2020-10-21 12:02 ? 次閱讀

01

前言

本文主要講解什么是Linux內(nèi)核,以及通過(guò)多張圖片展示Linux內(nèi)核的作用與功能,以便于讀者能快速理解什么是Linux內(nèi)核,能看懂Linux內(nèi)核。

擁有超過(guò)1300萬(wàn)行的代碼,Linux內(nèi)核是世界上最大的開(kāi)源項(xiàng)目之一,但是內(nèi)核是什么,它用于什么?

02

什么是內(nèi)核


內(nèi)核是與計(jì)算機(jī)硬件接口的易替換軟件的最低級(jí)別。它負(fù)責(zé)將所有以“用戶模式”運(yùn)行的應(yīng)用程序連接到物理硬件,并允許稱為服務(wù)器的進(jìn)程使用進(jìn)程間通信(IPC)彼此獲取信息。

03

內(nèi)核還要分種類?

是的,沒(méi)錯(cuò)。

3.1 微內(nèi)核

微內(nèi)核只管理它必須管理的東西:CPU、內(nèi)存和IPC。計(jì)算機(jī)中幾乎所有的東西都可以被看作是一個(gè)附件,并且可以在用戶模式下處理。微內(nèi)核具有可移植性的優(yōu)勢(shì),因?yàn)橹灰?a target="_blank">操作系統(tǒng)仍然試圖以相同的方式訪問(wèn)硬件,就不必?fù)?dān)心您是否更改了視頻卡,甚至是操作系統(tǒng)。微內(nèi)核對(duì)內(nèi)存和安裝空間的占用也非常小,而且它們往往更安全,因?yàn)橹挥刑囟ǖ倪M(jìn)程在用戶模式下運(yùn)行,而用戶模式不具有管理員模式的高權(quán)限。

3.1.1 Pros

可移植性

安裝占用空間小

小內(nèi)存占用

安全

3.1.2 Cons

通過(guò)驅(qū)動(dòng)程序,硬件更加抽象

硬件可能反應(yīng)較慢,因?yàn)轵?qū)動(dòng)程序處于用戶模式

進(jìn)程必須在隊(duì)列中等待才能獲得信息

進(jìn)程不能在不等待的情況下訪問(wèn)其他進(jìn)程

3.2 單內(nèi)核

單內(nèi)核與微內(nèi)核相反,因?yàn)樗鼈儾粌H包含CPU、內(nèi)存和IPC,而且還包含設(shè)備驅(qū)動(dòng)程序、文件系統(tǒng)管理和系統(tǒng)服務(wù)器調(diào)用等內(nèi)容。單內(nèi)核更擅長(zhǎng)于訪問(wèn)硬件和多任務(wù)處理,因?yàn)槿绻粋€(gè)程序需要從內(nèi)存或運(yùn)行中的其他進(jìn)程中獲取信息,那么它就有一條更直接的線路來(lái)訪問(wèn)信息,而不需要在隊(duì)列中等待來(lái)完成任務(wù)。但是,這可能會(huì)導(dǎo)致問(wèn)題,因?yàn)樵诠芾砟J较逻\(yùn)行的東西越多,如果行為不正常,就會(huì)有越多的東西導(dǎo)致系統(tǒng)崩潰。

3.2.1 Pros

更直接地訪問(wèn)程序的硬件

流程之間更容易通信

如果支持您的設(shè)備,它應(yīng)該不需要額外安裝就可以工作

進(jìn)程反應(yīng)更快,因?yàn)闆](méi)有等待處理器時(shí)間的隊(duì)列

3.2.2 Cons

較大安裝體積

較大內(nèi)存占用

不太安全,因?yàn)樗胁僮鞫荚诠芾砟J较逻\(yùn)行

04

混合的內(nèi)核


混合內(nèi)核能夠選擇在用戶模式下運(yùn)行什么,以及在管理模式下運(yùn)行什么。通常情況下,設(shè)備驅(qū)動(dòng)程序和文件系統(tǒng)I/O將在用戶模式下運(yùn)行,而IPC和服務(wù)器調(diào)用將保持在管理器模式下。這是兩全其美,但通常需要硬件制造商做更多的工作,因?yàn)樗序?qū)動(dòng)程序的責(zé)任都由他們來(lái)承擔(dān)。它還可能存在一些與微內(nèi)核固有的延遲問(wèn)題。

4.1 Pros

開(kāi)發(fā)人員可以選擇什么在用戶模式下運(yùn)行,什么在管理模式下運(yùn)行

比單片內(nèi)核更小的安裝占用空間

比其他型號(hào)更靈活

4.2 Cons

會(huì)遭受與微內(nèi)核相同的進(jìn)程延遲

設(shè)備驅(qū)動(dòng)程序需要由用戶管理(通常)

05

Linux內(nèi)核文件在哪里


Ubuntu中的內(nèi)核文件存儲(chǔ)在/boot文件夾中,稱為vmlinux -version。vmlinuz這個(gè)名字來(lái)自于unix世界,早在60年代,他們就把內(nèi)核簡(jiǎn)單地稱為“unix”,所以當(dāng)內(nèi)核在90年代首次開(kāi)發(fā)時(shí),Linux就開(kāi)始把內(nèi)核稱為“Linux”。

當(dāng)開(kāi)發(fā)虛擬內(nèi)存以便更容易地進(jìn)行多任務(wù)處理時(shí),將“vm”放在文件的前面,以顯示內(nèi)核支持虛擬內(nèi)存。有一段時(shí)間,Linux內(nèi)核被稱為vmlinux,但是內(nèi)核變得太大,無(wú)法裝入可用的引導(dǎo)內(nèi)存,因此壓縮了內(nèi)核映像,并將末尾的x更改為z,以顯示它是用zlib壓縮的。并不總是使用相同的壓縮,通常用LZMA或BZIP2替換,一些內(nèi)核簡(jiǎn)單地稱為zImage。

版本號(hào)將采用A.B.C.格式D在。B可能是2.6,C是您的版本,D表示您的補(bǔ)丁或補(bǔ)丁。

在/boot文件夾中還有其他非常重要的文件,稱為initrd.img-version、system.map-version, config-version。initrd文件用作一個(gè)小RAM磁盤(pán),用于提取和執(zhí)行實(shí)際的內(nèi)核文件。這個(gè)系統(tǒng)。map文件用于內(nèi)核完全加載之前的內(nèi)存管理,配置文件告訴內(nèi)核在編譯內(nèi)核映像時(shí)要加載哪些選項(xiàng)和模塊。

06

Linux內(nèi)核體系結(jié)構(gòu)


因?yàn)長(zhǎng)inux內(nèi)核是單片的,所以它比其他類型的內(nèi)核占用空間最大,復(fù)雜度也最高。這是一個(gè)設(shè)計(jì)特性,在Linux早期引起了相當(dāng)多的爭(zhēng)論,并且仍然帶有一些與單內(nèi)核固有的相同的設(shè)計(jì)缺陷。

為了解決這些缺陷,Linux內(nèi)核開(kāi)發(fā)人員所做的一件事就是使內(nèi)核模塊可以在運(yùn)行時(shí)加載和卸載,這意味著您可以動(dòng)態(tài)地添加或刪除內(nèi)核的特性。這不僅可以向內(nèi)核添加硬件功能,還可以包括運(yùn)行服務(wù)器進(jìn)程的模塊,比如低級(jí)別虛擬化,但也可以替換整個(gè)內(nèi)核,而不需要在某些情況下重啟計(jì)算機(jī)。
想象一下,如果您可以升級(jí)到Windows服務(wù)包,而不需要重新啟動(dòng)……

07

內(nèi)核模塊


如果Windows已經(jīng)安裝了所有可用的驅(qū)動(dòng)程序,而您只需要打開(kāi)所需的驅(qū)動(dòng)程序怎么辦?這本質(zhì)上就是內(nèi)核模塊為L(zhǎng)inux所做的。內(nèi)核模塊,也稱為可加載內(nèi)核模塊(LKM),對(duì)于保持內(nèi)核在不消耗所有可用內(nèi)存的情況下與所有硬件一起工作是必不可少的。

模塊通常向基本內(nèi)核添加設(shè)備、文件系統(tǒng)和系統(tǒng)調(diào)用等功能。lkm的文件擴(kuò)展名是.ko,通常存儲(chǔ)在/lib/modules目錄中。由于模塊的特性,您可以通過(guò)在啟動(dòng)時(shí)使用menuconfig命令將模塊設(shè)置為load或not load,或者通過(guò)編輯/boot/config文件,或者使用modprobe命令動(dòng)態(tài)地加載和卸載模塊,輕松定制內(nèi)核。

第三方和封閉源碼模塊在一些發(fā)行版中是可用的,比如Ubuntu,默認(rèn)情況下可能無(wú)法安裝,因?yàn)檫@些模塊的源代碼是不可用的。該軟件的開(kāi)發(fā)人員(即nVidia、ATI等)不提供源代碼,而是構(gòu)建自己的模塊并編譯所需的.ko文件以便分發(fā)。雖然這些模塊像beer一樣是免費(fèi)的,但它們不像speech那樣是免費(fèi)的,因此不包括在一些發(fā)行版中,因?yàn)榫S護(hù)人員認(rèn)為它通過(guò)提供非免費(fèi)軟件“污染”了內(nèi)核。

內(nèi)核并不神奇,但對(duì)于任何正常運(yùn)行的計(jì)算機(jī)來(lái)說(shuō),它都是必不可少的。Linux內(nèi)核不同于OS X和Windows,因?yàn)樗瑑?nèi)核級(jí)別的驅(qū)動(dòng)程序,并使許多東西“開(kāi)箱即用”。希望您能對(duì)軟件和硬件如何協(xié)同工作以及啟動(dòng)計(jì)算機(jī)所需的文件有更多的了解。

08

Linux 內(nèi)核學(xué)習(xí)經(jīng)驗(yàn)總結(jié)

開(kāi)篇

學(xué)習(xí)內(nèi)核,每個(gè)人都有自己的學(xué)習(xí)方法,仁者見(jiàn)仁智者見(jiàn)智。以下是我在學(xué)習(xí)過(guò)程中總結(jié)出來(lái)的東西,對(duì)自身來(lái)說(shuō),我認(rèn)為比較有效率,拿出來(lái)跟大家交流一下。

內(nèi)核學(xué)習(xí),一偏之見(jiàn);疏漏難免,懇請(qǐng)指正。

為什么寫(xiě)這篇博客

剛開(kāi)始學(xué)內(nèi)核的時(shí)候,不要執(zhí)著于一個(gè)方面,不要專注于一個(gè)子系統(tǒng)就一頭扎到實(shí)際的代碼行中去,因?yàn)檫@樣的話,牽涉的面會(huì)很廣,會(huì)碰到很多困難,容易產(chǎn)生挫敗感,一個(gè)函數(shù)體中(假設(shè)剛開(kāi)始的時(shí)候正在學(xué)習(xí)某個(gè)方面的某個(gè)具體的功能函數(shù))很可能摻雜著其他各個(gè)子系統(tǒng)方面設(shè)計(jì)理念(多是大量相關(guān)的數(shù)據(jù)結(jié)構(gòu)或者全局變量,用于支撐該子系統(tǒng)的管理工作)下相應(yīng)的代碼實(shí)現(xiàn),這個(gè)時(shí)候看到這些東西,紛繁蕪雜,是沒(méi)有頭緒而且很不理解的,會(huì)產(chǎn)生很多很多的疑問(wèn),(這個(gè)時(shí)候如果對(duì)這些疑問(wèn)糾纏不清,刨根問(wèn)底,那么事實(shí)上就是在學(xué)習(xí)當(dāng)前子系統(tǒng)的過(guò)程中頻繁的去涉足其他子系統(tǒng),這時(shí)候注意力就分散了),而事實(shí)上等了解了各個(gè)子系統(tǒng)后再回頭看這些東西的話,就簡(jiǎn)單多了,而且思路也會(huì)比較清晰。所以,要避免 “只見(jiàn)樹(shù)木,不見(jiàn)森林”,不要急于深入到底層代碼中去,不要過(guò)早研究底層代碼。

我在大二的時(shí)候剛開(kāi)始接觸內(nèi)核,就犯了這個(gè)錯(cuò)誤,一頭扎到內(nèi)存管理里頭,去看非常底層的實(shí)現(xiàn)代碼,雖然也是建立在內(nèi)存管理的設(shè)計(jì)思想的基礎(chǔ)上,但是相對(duì)來(lái)說(shuō),比較孤立,因?yàn)榇藭r(shí)并沒(méi)有學(xué)習(xí)其它子系統(tǒng),應(yīng)該說(shuō)無(wú)論是視野還是思想,都比較狹隘,所以代碼中牽涉到的其它子系統(tǒng)的實(shí)現(xiàn)我都直接跳過(guò)了,這一點(diǎn)還算聰明,當(dāng)然也是迫不得已的。

我的學(xué)習(xí)方法

剛開(kāi)始,我認(rèn)為主要的問(wèn)題在于你知道不知道,而不是理解不理解,某個(gè)子系統(tǒng)的實(shí)現(xiàn)采用了某種策略、方法,而你在學(xué)習(xí)中需要做的就是知道有這么一回事兒,然后才是理解所描述的策略或者方法。

根據(jù)自己的學(xué)習(xí)經(jīng)驗(yàn),剛開(kāi)始學(xué)習(xí)內(nèi)核的時(shí)候,我認(rèn)為要做的是在自己的腦海中建立起內(nèi)核的大體框架,理解各個(gè)子系統(tǒng)的設(shè)計(jì)理念和構(gòu)建思想,這些理念和思想會(huì)從宏觀上呈獻(xiàn)給你清晰的脈絡(luò),就像一個(gè)去除了枝枝葉葉的大樹(shù)的主干,一目了然;當(dāng)然,肯定還會(huì)涉及到具體的實(shí)現(xiàn)方法、函數(shù),但是此時(shí)接觸到的函數(shù)或者方法位于內(nèi)核實(shí)現(xiàn)的較高的層次,是主(要)函數(shù),已經(jīng)了解到這些函數(shù),針對(duì)的是哪些設(shè)計(jì)思想,實(shí)現(xiàn)了什么樣的功能,達(dá)成了什么樣的目的,混個(gè)臉熟的說(shuō)法在這兒也是成立的。至于該主函數(shù)所調(diào)用的其它的輔助性函數(shù)就等同于枝枝葉葉了,不必太早就去深究。此時(shí),也就初步建立起了內(nèi)核子系統(tǒng)框架和代碼實(shí)現(xiàn)之間的關(guān)聯(lián),關(guān)聯(lián)其實(shí)很簡(jiǎn)單,比如一看到某個(gè)函數(shù)名字,就想起這個(gè)函數(shù)是針對(duì)哪個(gè)子系統(tǒng)的,實(shí)現(xiàn)了什么功能。

我認(rèn)為此時(shí)要看的就是LKD3,這本書(shū)算是泛泛而談,主要就是從概念,設(shè)計(jì),大的實(shí)現(xiàn)方法上描述各個(gè)子系統(tǒng),而對(duì)于具體的相關(guān)的函數(shù)實(shí)現(xiàn)的代碼講解很少涉及(對(duì)比于ULK3,此書(shū)主要就是關(guān)于具體函數(shù)代碼的具體實(shí)現(xiàn)的深入分析,當(dāng)然,你也可以看,但是過(guò)早看這本書(shū),會(huì)感覺(jué)很痛苦,很枯燥無(wú)味,基本上都是函數(shù)的實(shí)現(xiàn)),很少,但不是沒(méi)有,這就很好,滿足我們當(dāng)前的需求,還避免我們過(guò)早深入到實(shí)際的代碼中去。而且本書(shū)在一些重要的點(diǎn)上還給出了寫(xiě)程序時(shí)的注意事項(xiàng),算是指導(dǎo)性建議。主要的子系統(tǒng)包括:內(nèi)存管理,進(jìn)程管理和調(diào)度,系統(tǒng)調(diào)用,中斷和異常,內(nèi)核同步,時(shí)間和定時(shí)器管理,虛擬文件系統(tǒng),塊I/O層,設(shè)備和模塊。(這里的先后順序其實(shí)就是LKD3的目錄的順序)。

我學(xué)習(xí)的時(shí)候是三本書(shū)交叉著看的,先看LKD3,專于一個(gè)子系統(tǒng),主要就是了解設(shè)計(jì)的原理和思想,當(dāng)然也會(huì)碰到對(duì)一些主要函數(shù)的介紹,但大多就是該函數(shù)基于前面介紹的思想和原理完成了什么樣的功能,該書(shū)并沒(méi)有就函數(shù)本身的實(shí)現(xiàn)進(jìn)行深入剖析。然后再看ULK3和PLKA上看同樣的子系統(tǒng),但是并不仔細(xì)分析底層具體函數(shù)的代碼,只是粗略地、不求甚解地看,甚至不看。因?yàn)?,有些時(shí)候,在其中一本書(shū)的某個(gè)點(diǎn)上,卡殼了,不是很理解了,在另外的書(shū)上你可能就碰到對(duì)同一個(gè)問(wèn)題的不同角度的描述,說(shuō)不準(zhǔn)哪句話就能讓你豁然開(kāi)朗,如醍醐灌頂。我經(jīng)常碰到這種情況。

并不是說(shuō)學(xué)習(xí)過(guò)程中對(duì)一些函數(shù)體的實(shí)現(xiàn)完全就忽略掉,只要自己想徹底了解其代碼實(shí)現(xiàn),沒(méi)有誰(shuí)會(huì)阻止你。我是在反復(fù)閱讀過(guò)程中慢慢深入的。比如VFS中文件打開(kāi)需要對(duì)路徑進(jìn)行分析,需要考慮的細(xì)節(jié)不少(.././之類的),但是其代碼實(shí)現(xiàn)是很好理解的。再比如,CFS調(diào)度中根據(jù)shedule latency、隊(duì)列中進(jìn)程個(gè)數(shù)及其nice值(使用的是動(dòng)態(tài)優(yōu)先級(jí))計(jì)算出分配給進(jìn)程的時(shí)間片,沒(méi)理由不看的,這個(gè)太重要了,而且也很有意思。

ULK3也會(huì)有設(shè)計(jì)原理與思想之類的概括性介紹,基本上都位于某個(gè)主題的開(kāi)篇段落。但是更多的是對(duì)支持該原理和思想的主要函數(shù)實(shí)現(xiàn)的具體分析,同樣在首段,一句話綜述函數(shù)的功能,然后對(duì)函數(shù)的實(shí)現(xiàn)以1、2、3,或者a、b、c步驟的形式進(jìn)行講解。我只是有選擇性的看,有時(shí)候?qū)φ罩胹ource insight打開(kāi)的源碼,確認(rèn)一下代碼大體上確實(shí)是按書(shū)中所描述的步驟實(shí)現(xiàn)的,就當(dāng)是增加感性認(rèn)識(shí)。由于步驟中摻雜著各種針對(duì)不同實(shí)現(xiàn)目的安全性、有效性檢查,如果不理解就先跳過(guò)。這并不妨礙你對(duì)函數(shù)體功能實(shí)現(xiàn)的整體把握。

PLKA介于LKD3和ULK3之間。我覺(jué)得PLKA的作者(看照片,真一德國(guó)帥小伙,技術(shù)如此了得)肯定看過(guò)ULK,無(wú)論他的本意還是有意,總之PLKA還是跟ULK有所不同,對(duì)函數(shù)的仔細(xì)講解都做補(bǔ)充說(shuō)明,去掉函數(shù)體中邊邊角角的情況,比如一些特殊情況的處理,有效性檢查等,而不妨礙對(duì)整個(gè)函數(shù)體功能的理解,這些他都有所交代,做了聲明;而且,就像LKD3一樣,在某些點(diǎn)上也給出了指導(dǎo)性編程建議。作者們甚至對(duì)同一個(gè)主要函數(shù)的講解的著重點(diǎn)都不一樣。這樣的話,對(duì)我們學(xué)習(xí)的人而言,有助于加深理解。另外,我認(rèn)為很重要的一點(diǎn)就是PLKA針對(duì)的2.6.24的內(nèi)核版本,而ULK是2.6.11,LKD3是2.6.34。在某些方面PLKA比較接近現(xiàn)代的實(shí)現(xiàn)。其實(shí)作者們之所以分別選擇11或者24,都是因?yàn)樵诎姹景l(fā)行樹(shù)中,這兩個(gè)版本在某些方面都做了不小的變動(dòng),或者說(shuō)是具有標(biāo)志性的轉(zhuǎn)折點(diǎn)(這些信息大多是在書(shū)中的引言部分介紹的,具體的細(xì)節(jié)我想不起來(lái)了)。

Intel V3,針對(duì)X86的CPU,本書(shū)自然是系統(tǒng)編程的權(quán)威。內(nèi)核部分實(shí)現(xiàn)都可以在本書(shū)找到其根源。所以,在讀以上三本書(shū)某個(gè)子系統(tǒng)的時(shí)候,不要忘記可以在V3中相應(yīng)章節(jié)找到一些基礎(chǔ)性支撐信息。

在讀書(shū)過(guò)程中,會(huì)產(chǎn)生相當(dāng)多的疑問(wèn),這一點(diǎn)是確信無(wú)疑的。大到搞不明白一個(gè)設(shè)計(jì)思想,小到不理解某行代碼的用途。各個(gè)方面,各種疑問(wèn),你完全可以把不理解的地方都記錄下來(lái)(不過(guò),我并沒(méi)有這么做,沒(méi)有把疑問(wèn)全部記下來(lái),只標(biāo)記了很少一部分我認(rèn)為很關(guān)鍵的幾個(gè)問(wèn)題),專門(mén)寫(xiě)到一張紙上,不對(duì),一個(gè)本上,我確信會(huì)產(chǎn)生這么多的疑問(wèn),不然內(nèi)核相關(guān)的論壇早就可以關(guān)閉了。其實(shí),大部分的問(wèn)題(其中很多問(wèn)題都是你知道不知道有這么一回事的問(wèn)題)都可以迎刃而解,只要你肯回頭再看,書(shū)讀百遍,其義自現(xiàn)。多看幾遍,前前后后的聯(lián)系明白個(gè)七七八八是沒(méi)有問(wèn)題的。我也這么做了,針對(duì)某些子系統(tǒng)也看了好幾遍,切身體會(huì)。

當(dāng)你按順序?qū)W習(xí)這些子系統(tǒng)的時(shí)候,前面的章節(jié)很可能會(huì)引用后面的章節(jié),就像PLKA的作者說(shuō)的那樣,完全沒(méi)有向后引用是不可能的,他能做的只是盡量減少這種引用而又不損害你對(duì)當(dāng)前問(wèn)題的理解。不理解,沒(méi)關(guān)系,跳過(guò)就行了。后面的章節(jié)同樣會(huì)有向前章節(jié)的引用,不過(guò)這個(gè)問(wèn)題就簡(jiǎn)單一些了 ,你可以再回頭去看相應(yīng)的介紹,當(dāng)時(shí)你不太理解的東西,很可能這個(gè)時(shí)候就知道了它的設(shè)計(jì)的目的以及具體的應(yīng)用。不求甚解只是暫時(shí)的。比如說(shuō),內(nèi)核各個(gè)子系統(tǒng)之間的交互和引用在代碼中的體現(xiàn)就是實(shí)現(xiàn)函數(shù)穿插調(diào)用,比如你在內(nèi)存管理章節(jié)學(xué)習(xí)了的內(nèi)存分配和釋放的函數(shù),而你是了解內(nèi)存在先的,在學(xué)習(xí)驅(qū)動(dòng)或者模塊的時(shí)候就會(huì)碰到這些函數(shù)的調(diào)用,這樣也就比較容易接受,不至于太過(guò)茫然;再比如,你了解了系統(tǒng)時(shí)間和定時(shí)器的管理,再回頭看中斷和異常中bottom half的調(diào)度實(shí)現(xiàn),你對(duì)它的理解就會(huì)加深一層。

子系統(tǒng)進(jìn)行管理工作需要大量的數(shù)據(jù)結(jié)構(gòu)。子系統(tǒng)之間交互的一種方式就是各個(gè)子系統(tǒng)各自的主要數(shù)據(jù)結(jié)構(gòu)通過(guò)指針成員相互引用。學(xué)習(xí)過(guò)程中,參考書(shū)上在講解某個(gè)子系統(tǒng)的時(shí)候會(huì)對(duì)數(shù)據(jù)結(jié)構(gòu)中主要成員的用途解釋一下,但肯定不會(huì)覆蓋全部(成員比較多的情況,例如task_struct),對(duì)其它子系統(tǒng)基于某個(gè)功能實(shí)現(xiàn)的引用可能解釋了,也可能沒(méi)做解釋,還可能說(shuō)這個(gè)變量在何處會(huì)做進(jìn)一步說(shuō)明。所以,不要糾結(jié)于一個(gè)不理解的點(diǎn)上,暫且放過(guò),回頭還可以看的。之間的聯(lián)系可以在對(duì)各個(gè)子系統(tǒng)都有所了解之后再建立起來(lái)。其實(shí),我仍然在強(qiáng)調(diào)先理解概念和框架的重要性。

等我們完成了建立框架這一步,就可以選擇一個(gè)比較感興趣的子系統(tǒng),比如驅(qū)動(dòng)、網(wǎng)絡(luò),或者文件系統(tǒng)之類的。這個(gè)時(shí)候你再去深入了解底層代碼實(shí)現(xiàn),相較于一開(kāi)始就鉆研代碼,更容易一些,而且碰到了不解之處,或者忘記了某個(gè)方面的實(shí)現(xiàn),此時(shí)你完全可以找到相應(yīng)的子系統(tǒng),因?yàn)槟阒涝谀娜フ?,查漏補(bǔ)缺,不僅完成了對(duì)當(dāng)前函數(shù)的鉆研,而且可以回顧、溫習(xí)以前的內(nèi)容,融會(huì)貫通的時(shí)機(jī)就在這里了。

《深入理解linux虛擬內(nèi)存》(2.4內(nèi)核版本),LDD3,《深入理解linux網(wǎng)絡(luò)技術(shù)內(nèi)幕》,幾乎每一個(gè)子系統(tǒng)都需要一本書(shū)的容量去講解,所以說(shuō),剛開(kāi)始學(xué)習(xí)不宜對(duì)某個(gè)模塊太過(guò)深入,等對(duì)各個(gè)子系統(tǒng)都有所了解了,再有針對(duì)性的去學(xué)習(xí)一個(gè)特定的子系統(tǒng)。這時(shí)候?qū)ζ渌到y(tǒng)的援引都可以讓我們不再感到茫然、復(fù)雜,不知所云。

比如,LDD3中的以下所列章節(jié):構(gòu)造和運(yùn)行模塊,并發(fā)和競(jìng)態(tài),時(shí)間、延遲及延緩操作,分配內(nèi)存,中斷處理等,都屬于驅(qū)動(dòng)開(kāi)發(fā)的支撐性子系統(tǒng),雖說(shuō)本書(shū)對(duì)這些子系統(tǒng)都專門(mén)開(kāi)辟一個(gè)章節(jié)進(jìn)行講解,但是詳細(xì)程度怎么能比得上PLKA,ULK3,LKD3這三本書(shū),看完這三本書(shū),你會(huì)發(fā)現(xiàn)讀LDD3這些章節(jié)的時(shí)候簡(jiǎn)直跟喝白開(kāi)水一樣,太隨意了,因?yàn)長(zhǎng)DD3的講解比之LKD3更粗略。打好了基礎(chǔ),PCI、USB、TTY驅(qū)動(dòng),塊設(shè)備驅(qū)動(dòng),網(wǎng)卡驅(qū)動(dòng),需要了解和學(xué)習(xí)的東西就比較有針對(duì)性了。這些子系統(tǒng)就屬于通用子系統(tǒng),了解之后,基于這些子系統(tǒng)的子系統(tǒng)的開(kāi)發(fā)—驅(qū)動(dòng)(需進(jìn)一步針對(duì)硬件特性)和網(wǎng)絡(luò)(需進(jìn)一步理解各種協(xié)議)—相對(duì)而言,其學(xué)習(xí)難度大大降低,學(xué)習(xí)進(jìn)度大大加快,學(xué)習(xí)效率大大提升。說(shuō)著容易做來(lái)難。達(dá)到這樣一種效果的前提就是:必須得靜下心來(lái),認(rèn)真讀書(shū),要看得進(jìn)去,PLKA,ULK3厚得都跟磚頭塊兒一樣,令人望之生畏,如果沒(méi)有興趣,沒(méi)有熱情,沒(méi)有毅力,無(wú)論如何都是不行,因?yàn)樾枰獣r(shí)間,需要很長(zhǎng)時(shí)間。我并不是說(shuō)必須打好了基礎(chǔ)才可以進(jìn)行驅(qū)動(dòng)開(kāi)發(fā),只是說(shuō)打好了基礎(chǔ)的情況下進(jìn)行開(kāi)發(fā)會(huì)更輕松,更有效率,而且自己對(duì)內(nèi)核代碼的駕馭能力會(huì)更強(qiáng)大。這只是我個(gè)人見(jiàn)解,我自己的學(xué)習(xí)方式,僅供參考。

語(yǔ)言

PLKA是個(gè)德國(guó)人用德語(yǔ)寫(xiě)的,后來(lái)翻譯成英文,又從英文翻譯成中文,我在網(wǎng)上書(shū)店里沒(méi)有找到它的紙質(zhì)英文版,所以就買(mǎi)了中文版的。ULK3和LKD3都是英文版的。大牛們寫(xiě)的書(shū),遣詞造句真的是簡(jiǎn)潔,易懂,看原版對(duì)我們學(xué)習(xí)計(jì)算機(jī)編程的程序員來(lái)說(shuō)完全不成問(wèn)題,最好原汁原味。如果一本書(shū)確實(shí)翻譯地很好,我們當(dāng)然可以看中文版的,用母語(yǔ)進(jìn)行學(xué)習(xí),理解速度和學(xué)習(xí)進(jìn)度當(dāng)然是很快的,不作他想??从⑽牡臅r(shí)候不要腦子里想著把他翻譯成中文,沒(méi)必要。

API感想

“比起知道你所用技術(shù)的重要性,成為某一個(gè)特別領(lǐng)域的專家是不重要的。知道某一個(gè)具體API調(diào)用一點(diǎn)好處都沒(méi)有,當(dāng)你需要他的時(shí)候只要查詢下就好了?!边@句話源于我看到的一篇翻譯過(guò)來(lái)的博客。我想強(qiáng)調(diào)的就是,這句話針應(yīng)用型編程再合適不過(guò),但是內(nèi)核API就不完全如此。

內(nèi)核相當(dāng)復(fù)雜,學(xué)習(xí)起來(lái)很不容易,但是當(dāng)你學(xué)習(xí)到一定程度,你會(huì)發(fā)現(xiàn),如果自己打算寫(xiě)內(nèi)核代碼,到最后要關(guān)注的仍然是API接口,只不過(guò)這些API絕大部分是跨平臺(tái)的,滿足可移植性。內(nèi)核黑客基本上已經(jīng)標(biāo)準(zhǔn)化、文檔化了這些接口,你所要做的只是調(diào)用而已。當(dāng)然,在使用的時(shí)候,最好對(duì)可移植性這一話題在內(nèi)核中的編碼約定爛熟于心,這樣才會(huì)寫(xiě)出可移植性的代碼。就像應(yīng)用程序一樣,可以使用開(kāi)發(fā)商提供的動(dòng)態(tài)庫(kù)API,或者使用開(kāi)源API。同樣是調(diào)用API,不同點(diǎn)在于使用內(nèi)核API要比使用應(yīng)用API了解的東西要多出許多。

當(dāng)你了解了操作系統(tǒng)的實(shí)現(xiàn)—這些實(shí)現(xiàn)可都是對(duì)應(yīng)用程序的基礎(chǔ)性支撐啊—你再去寫(xiě)應(yīng)用程序的時(shí)候,應(yīng)用程序中用到的多線程,定時(shí)器,同步鎖機(jī)制等等等等,使用共享庫(kù)API的時(shí)候,聯(lián)系到操作系統(tǒng),從而把對(duì)該API的文檔描述同自己所了解到的這些方面在內(nèi)核中的相應(yīng)支撐性實(shí)現(xiàn)結(jié)合起來(lái)進(jìn)行考慮,這會(huì)指導(dǎo)你選擇使用哪一個(gè)API接口,選出效率最高的實(shí)現(xiàn)方式。對(duì)系統(tǒng)編程頗有了解的話,對(duì)應(yīng)用編程不無(wú)益處,甚至可以說(shuō)是大有好處。

設(shè)計(jì)實(shí)現(xiàn)的本質(zhì),知道還是理解

操作系統(tǒng)是介于底層硬件和應(yīng)用軟件之間的接口,其各個(gè)子系統(tǒng)的實(shí)現(xiàn)很大程度上依賴于硬件特性。書(shū)上介紹這些子系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)的時(shí)候,我們讀過(guò)了,也就知道了,如果再深入考慮一下,為什么整體架構(gòu)要按照這種方式組織,為什么局部函數(shù)要遵循這樣的步驟處理,知其然,知其所以然,如果你知道了某個(gè)功能的實(shí)現(xiàn)是因?yàn)?a target="_blank">芯片就是這么設(shè)計(jì)的,CPU就是這么做的,那么你的疑問(wèn)也就基本上到此為止了。再深究,就是芯片架構(gòu)方面的設(shè)計(jì)與實(shí)現(xiàn),對(duì)于程序員來(lái)講,無(wú)論是系統(tǒng)還是應(yīng)用程序員,足跡探究到這里,已經(jīng)解決了很多疑問(wèn),因?yàn)槲覀兊墓ぷ餍再|(zhì)偏軟,而這些東西實(shí)在是夠硬。

比如,ULK3中講解的中斷和異常的實(shí)現(xiàn),究其根源,那是因?yàn)镮ntel x86系列就是這么設(shè)計(jì)的,去看看Intel V3手冊(cè)中相應(yīng)章節(jié)介紹,都可以為ULK3中描述的代碼實(shí)現(xiàn)方式找到注解。還有時(shí)間和定時(shí)器管理,同樣可以在Intel V3 對(duì)APIC的介紹中獲取足夠的信息,操作系統(tǒng)就是依據(jù)這些硬件特性來(lái)實(shí)現(xiàn)軟件方法定義的。

又是那句話,不是理解不理解的問(wèn)題,而是知道不知道的問(wèn)題。有時(shí)候,知道了,就理解了。在整個(gè)學(xué)習(xí)過(guò)程中,知道,理解,知道,理解,知道……,交叉反復(fù)。為什么開(kāi)始和結(jié)尾都是知道,而理解只是中間步驟呢?世界上萬(wàn)事萬(wàn)物自有其規(guī)律,人類只是發(fā)現(xiàn)而已,實(shí)踐是第一位的,實(shí)踐就是知道的過(guò)程,實(shí)踐產(chǎn)生經(jīng)驗(yàn),經(jīng)驗(yàn)的總結(jié)就是理論,理論源于實(shí)踐,理論才需要理解。我們學(xué)習(xí)內(nèi)核,深入研究,搞來(lái)搞去,又回到了芯片上,芯片是物質(zhì)的,芯片的功用基于自然界中物質(zhì)本有的物理和電子特性。追本溯源,此之謂也。

動(dòng)手寫(xiě)代碼

紙上得來(lái)終覺(jué)淺,絕知此事要躬行。只看書(shū)是絕對(duì)不行的,一定要結(jié)合課本給出的編程建議自己敲代碼。剛開(kāi)始就以模塊形式測(cè)試好了,或者自己編譯一個(gè)開(kāi)發(fā)版本的內(nèi)核。一臺(tái)機(jī)器的話,使用UML方式調(diào)試,內(nèi)核控制路走到哪一步,單步調(diào)試看看程序執(zhí)行過(guò)程,比書(shū)上的講解更直觀明了。一定要?jiǎng)邮謱?shí)際操作。

參考書(shū)

LDD3 Linux Device Driver 3rd LKD3 Linux Kernel Development 3rd ULK3 Understanding the Linux Kernel 3rd PLKA Professional Linux Kernel Architecture UML User Mode Linux Intel V3 Intel? 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B & 3C): System Programming Guide

作者在寫(xiě)書(shū)的時(shí)候,都是以自己的理解組織內(nèi)容,從自己的觀點(diǎn)看待一個(gè)主題,關(guān)注點(diǎn)跟作者自身有很大的關(guān)系。出書(shū)的時(shí)間有先后,后來(lái)人針對(duì)同一個(gè)主題想要出書(shū)而又不落入窠臼,最好有自己的切入方式,從自己的角度講解相關(guān)問(wèn)題,這才值得出這本書(shū),千篇一律是個(gè)掉價(jià)的行為,書(shū)就不值錢(qián)了。

盡信書(shū)不如無(wú)書(shū)。 http://lwn.net/Articles/419855/ 此處是一篇關(guān)于LKD3的書(shū)評(píng),指出了其中的錯(cuò)誤,當(dāng)你讀完的時(shí)候,不妨去找找,看一下自己在其中所描述的地方有什么特別的印象。 http://lwn.net/Articles/161190/此處是一篇對(duì)ULK3的介紹,我認(rèn)為其中很關(guān)鍵的幾句話就可以給本書(shū)定位:

Many of the key control paths in the kernel are described, step by step;

一步一步地講述內(nèi)核控制路徑的實(shí)現(xiàn)。

The level of detail sometimes makes it hard to get a sense for the big picture, but it does help somebody trying to figure out how a particular function works.

對(duì)代碼講解的詳細(xì)程度有時(shí)候很難讓讀者把握住它的主旨大意,但是確實(shí)有助于讀者理解一個(gè)特定的函數(shù)到底是如何工作的。

Indeed, that is perhaps the key feature which differentiates this book. It is very much a “how it works” book, designed to help people understand the code.

事實(shí)上,這也正是本書(shū)與眾不同的地方。更像一個(gè)“如何工作”的書(shū),幫助讀者理解代碼實(shí)現(xiàn)。

It presents kernel functions and data structures, steps the reader through them, but does not, for example, emphasize the rules for using them. UTLK is a study guide, not a programming manual.

本書(shū)描述了內(nèi)核函數(shù)和數(shù)據(jù)結(jié)構(gòu),引導(dǎo)讀者穿行于其間,但是,并沒(méi)有著重強(qiáng)調(diào)使用它們的法則。UTLK是一本學(xué)習(xí)指南,而不是編程手冊(cè)。

這幾句話對(duì)本書(shū)的描述非常到位?;诖?,作為指導(dǎo)性原則,我們就可以很有效率地使用它了。

看一本技術(shù)書(shū)籍,書(shū)中的序言部分絕對(duì)是首先應(yīng)該翻閱的,其次就是目錄。我發(fā)現(xiàn)在閱讀過(guò)程中我會(huì)頻繁的查看目錄,甚至是喜歡看目錄。

結(jié)尾

興趣的力量是無(wú)窮的。興趣能帶來(lái)激情,如果工作可以和興趣結(jié)合到一起,工作起來(lái)才會(huì)有熱情,那么工作就不只是工作了,更是一種享受。

Linux,我的興趣,我的動(dòng)力,我的方向,我的未來(lái)!

來(lái)源網(wǎng)址:(轉(zhuǎn)載請(qǐng)保留)

blog.chinaunix.net/uid-24669930-id-4039377.html https://www.linuxrumen.com/rmxx/1406.html

責(zé)任編輯:xj

原文標(biāo)題:深度:關(guān)于Linux內(nèi)核最硬核的文章

文章出處:【微信公眾號(hào):嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1372

    瀏覽量

    40289
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11304

    瀏覽量

    209497

原文標(biāo)題:深度:關(guān)于Linux內(nèi)核最硬核的文章

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    飛凌嵌入式ElfBoard ELF 1板卡-Linux內(nèi)核移植之內(nèi)核簡(jiǎn)介

    學(xué)到本章節(jié),大家應(yīng)該對(duì)Linux操作系統(tǒng)都有了一定的了解,但可能還不知道我們拿到手的內(nèi)核源碼都經(jīng)歷了什么。linux有一個(gè)龐大的開(kāi)源社區(qū),每個(gè)人都可以向開(kāi)源社區(qū)提交代碼。由于linux
    發(fā)表于 12-13 09:03

    deepin社區(qū)亮相第19屆中國(guó)Linux內(nèi)核開(kāi)發(fā)者大會(huì)

    中國(guó) Linux 內(nèi)核開(kāi)發(fā)者大會(huì),作為中國(guó) Linux 內(nèi)核領(lǐng)域最具影響力的峰會(huì)之一,一直以來(lái)都備受矚目。
    的頭像 發(fā)表于 10-29 16:35 ?511次閱讀

    linux內(nèi)核中通用HID觸摸驅(qū)動(dòng)

    linux內(nèi)核中,為HID觸摸面板實(shí)現(xiàn)了一個(gè)通用的驅(qū)動(dòng)程序,位于/drivers/hid/hid-multitouch.c文件中。hid觸摸驅(qū)動(dòng)是以struct hid_driver實(shí)現(xiàn),首先定義一個(gè)描述hid觸摸驅(qū)動(dòng)的結(jié)構(gòu)mt_driver。
    的頭像 發(fā)表于 10-29 10:55 ?603次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>內(nèi)核</b>中通用HID觸摸驅(qū)動(dòng)

    詳解linux內(nèi)核的uevent機(jī)制

    linux內(nèi)核中,uevent機(jī)制是一種內(nèi)核和用戶空間通信的機(jī)制,用于通知用戶空間應(yīng)用程序各種硬件更改或其他事件,比如插入或移除硬件設(shè)備(如USB驅(qū)動(dòng)器或網(wǎng)絡(luò)接口)。uevent表示“用戶空間
    的頭像 發(fā)表于 09-29 17:01 ?686次閱讀

    linux驅(qū)動(dòng)程序如何加載進(jìn)內(nèi)核

    Linux系統(tǒng)中,驅(qū)動(dòng)程序是內(nèi)核與硬件設(shè)備之間的橋梁。它們?cè)试S內(nèi)核與硬件設(shè)備進(jìn)行通信,從而實(shí)現(xiàn)對(duì)硬件設(shè)備的控制和管理。 驅(qū)動(dòng)程序的編寫(xiě) 驅(qū)動(dòng)程序的編寫(xiě)是Linux驅(qū)動(dòng)開(kāi)發(fā)的基礎(chǔ)。在編
    的頭像 發(fā)表于 08-30 15:02 ?473次閱讀

    Linux內(nèi)核測(cè)試技術(shù)

    Linux 內(nèi)核Linux操作系統(tǒng)的核心部分,負(fù)責(zé)管理硬件資源和提供系統(tǒng)調(diào)用接口。隨著 Linux 內(nèi)核的不斷發(fā)展和更新,其復(fù)雜性和代碼規(guī)
    的頭像 發(fā)表于 08-13 13:42 ?493次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>測(cè)試技術(shù)

    Linux內(nèi)核中的頁(yè)面分配機(jī)制

    Linux內(nèi)核中是如何分配出頁(yè)面的,如果我們站在CPU的角度去看這個(gè)問(wèn)題,CPU能分配出來(lái)的頁(yè)面是以物理頁(yè)面為單位的。也就是我們計(jì)算機(jī)中常講的分頁(yè)機(jī)制。本文就看下Linux內(nèi)核是如何管
    的頭像 發(fā)表于 08-07 15:51 ?291次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>中的頁(yè)面分配機(jī)制

    歡創(chuàng)播報(bào) 華為宣布鴻蒙內(nèi)核已超越Linux內(nèi)核

    自誕生以來(lái)的最大一次升級(jí)換代。HarmonyOS NEXT不依賴傳統(tǒng)的Unix內(nèi)核Linux內(nèi)核,而是依靠自主的鴻蒙內(nèi)核。這就意味著,鴻蒙操作系統(tǒng)最終將去掉
    的頭像 發(fā)表于 06-27 11:30 ?841次閱讀

    QNX與Linux基礎(chǔ)差異對(duì)比

    對(duì)于QNX系統(tǒng)和Linux系統(tǒng)的內(nèi)核差異,我們拋開(kāi)宏內(nèi)核、微內(nèi)核之類的爭(zhēng)議不談。單純從開(kāi)發(fā)應(yīng)用的角度而言,QNX和Linux系統(tǒng)的差異到底有
    發(fā)表于 04-17 10:52 ?762次閱讀

    使用 PREEMPT_RT 在 Ubuntu 中構(gòu)建實(shí)時(shí) Linux 內(nèi)核

    盟通技術(shù)干貨構(gòu)建實(shí)時(shí)Linux內(nèi)核簡(jiǎn)介盟通技術(shù)干貨Motrotech如果需要在Linux中實(shí)現(xiàn)實(shí)時(shí)計(jì)算性能,進(jìn)而有效地將Linux轉(zhuǎn)變?yōu)镽TOS,那么大多數(shù)發(fā)行版都可以打上名為PREE
    的頭像 發(fā)表于 04-12 08:36 ?2458次閱讀
    使用 PREEMPT_RT 在 Ubuntu 中構(gòu)建實(shí)時(shí) <b class='flag-5'>Linux</b> <b class='flag-5'>內(nèi)核</b>

    C++在Linux內(nèi)核開(kāi)發(fā)中從爭(zhēng)議到成熟

    Linux 內(nèi)核郵件列表中一篇已有六年歷史的老帖近日再次引發(fā)激烈討論 —— 主題是建議將 Linux 內(nèi)核的開(kāi)發(fā)語(yǔ)言從 C 轉(zhuǎn)換為更現(xiàn)代的 C++。
    的頭像 發(fā)表于 01-31 14:11 ?632次閱讀
    C++在<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>開(kāi)發(fā)中從爭(zhēng)議到成熟

    Ubuntu 24.04 LTS選用Linux 6.8為默認(rèn)內(nèi)核

    關(guān)于Ubuntu 24.04 LTS使用何種內(nèi)核版本,一直備受關(guān)注。Canonical工程師Andrea Righi昨日宣布,Ubuntu 24.04將默認(rèn)搭載Linux 6.8內(nèi)核。
    的頭像 發(fā)表于 01-29 11:27 ?1118次閱讀

    linux內(nèi)核主要由哪幾個(gè)部分組成,作用是什么

    Linux內(nèi)核主要由以下幾個(gè)部分組成: 進(jìn)程管理:Linux內(nèi)核負(fù)責(zé)管理和調(diào)度系統(tǒng)中的進(jìn)程。它通過(guò)進(jìn)程調(diào)度算法來(lái)決定哪個(gè)進(jìn)程在什么時(shí)間運(yùn)行以及
    的頭像 發(fā)表于 01-22 14:34 ?2690次閱讀

    rk3399移植Linux內(nèi)核

    Mali-T864 GPU,以及豐富的外設(shè)接口,如USB、HDMI、以太網(wǎng)等。為了將Linux內(nèi)核移植到RK3399上,我們需要確保內(nèi)核支持這些硬
    的頭像 發(fā)表于 01-08 09:56 ?1149次閱讀

    RZ/G2L Linux系統(tǒng)如何添加新的內(nèi)核模塊

    RZ/G2L Linux系統(tǒng)的鏡像基于yocto構(gòu)建,本篇介紹如何添加新的內(nèi)核模塊。
    的頭像 發(fā)表于 01-04 12:19 ?1789次閱讀
    RZ/G2L <b class='flag-5'>Linux</b>系統(tǒng)如何添加新的<b class='flag-5'>內(nèi)核</b>模塊