我的Linux内核学习笔记
在開始今天的內(nèi)容之前,其實(shí)有一些題外話可以和大家分享一下。自從工作以來,我個(gè)人一直都有一個(gè)觀點(diǎn)。那就是怎么樣利用簡(jiǎn)單的代碼來說明開發(fā)中的問題,或者是解釋軟件中的原理,這是一個(gè)很高的學(xué)問。有些道理看上去云里霧里說不清楚,其實(shí)都可以通過編寫代碼來驗(yàn)證的.os可以、cpu可以、cache可以、編譯器可以、網(wǎng)絡(luò)協(xié)議也可以,很多很多的內(nèi)容完全可以通過幾行代碼就可以表達(dá)得非常清楚,但是事實(shí)上我們并沒有這么做。
我想原因無非是這么幾條,
一來授業(yè)者對(duì)相關(guān)知識(shí)的學(xué)習(xí)也是停留在概念上而已;
二來我們的學(xué)習(xí)過于死板和教條、太關(guān)注知識(shí)、不求實(shí)踐;
三就是學(xué)習(xí)者自身缺少思考的能力、缺少自我反省的能力、對(duì)很多東西不求甚解。
而學(xué)習(xí)Linux內(nèi)核就能很好的幫助我們解決這些問題。
Linux內(nèi)核學(xué)習(xí)路線:
以網(wǎng)絡(luò)協(xié)議棧為例:
1、Linux內(nèi)核源代碼結(jié)構(gòu)
Linux 的內(nèi)核源代碼可以從 https://www.kernel.org/網(wǎng)站上下載,Linux-4.1.2以上的版本(含)。??其代碼目錄結(jié)構(gòu)如下:
Documentation:這個(gè)目錄下面沒有內(nèi)核的代碼,有一套有用的內(nèi)核文檔。其中文檔質(zhì)量良莠不齊,有很多內(nèi)核文檔的質(zhì)量很優(yōu)秀并且相當(dāng)完整,例如文件系統(tǒng);但是有的則完全沒有文檔,例如進(jìn)程調(diào)度。在這個(gè)目錄里不時(shí)可以發(fā)現(xiàn)有用的東西。
arch:此目錄下的所有子目錄的東西都是體系結(jié)構(gòu)特有的代碼。
drivers:內(nèi)核的驅(qū)動(dòng)程序代碼。此部分的代碼占內(nèi)核代碼的大部分,包括顯卡、網(wǎng)卡、PCI 等外圍設(shè)備的驅(qū)動(dòng)代碼。
fs:文件系統(tǒng)代碼。包含 ext2、ext3、ext4 等本地文件系統(tǒng),CD-ROM、isofs 等鏡像系統(tǒng),還有 NFS 等網(wǎng)絡(luò)文件系統(tǒng),以及 proc 等偽文件系統(tǒng)。
include:此目錄中包含了 Linux 內(nèi)核中的大部分頭(*.h)文件。
init:內(nèi)核初始化過程的代碼。
ipc:進(jìn)程間通信代碼。
kernel:這部分是 Linux 內(nèi)核中最重要的,包含了內(nèi)核中平臺(tái)無關(guān)的基本功能,主要包含進(jìn)程創(chuàng)建、銷毀和調(diào)度的代碼。
lib:此目錄中主要包含內(nèi)核中其他模塊使用的通用函數(shù)和內(nèi)核自解壓的函數(shù)。
mm:此目錄中的代碼實(shí)現(xiàn)了平臺(tái)無關(guān)的內(nèi)存管理代碼。
scripts:此目錄下是內(nèi)核配置時(shí)使用的腳本,當(dāng)使用 make menuconfig 或者 make xconfig 命令時(shí),會(huì)調(diào)用此部分代碼。
net:此目錄中包含 Linux 內(nèi)核的網(wǎng)絡(luò)協(xié)議棧的代碼。在子目錄 netfilter 下為 netfilter的實(shí)現(xiàn)代碼,netfilter 構(gòu)建了一個(gè)框架,允許在不重新編譯內(nèi)核的情況下,編寫可加載內(nèi)核,在指定的地方插入回調(diào)函數(shù),以用戶自己的方式處理網(wǎng)絡(luò)數(shù)據(jù)。子目錄 ipv4 和 ipv6 為 TCP/IP 協(xié)議棧的 IPv4 和 IPv6 的實(shí)現(xiàn),主要包含了 TCP、UDP、IP 協(xié)議的代碼,還有 ARP 協(xié)議、ICMP 協(xié)議、IGMP 協(xié)議、netfilter 的 TCP/IP 實(shí)現(xiàn)等代碼實(shí)現(xiàn),以及如 proc、ioctl 等控制相關(guān)的代碼。
組織代碼另一個(gè)表現(xiàn)形式就是映射到Linux代碼的3個(gè)內(nèi)核層:
2、內(nèi)核中網(wǎng)絡(luò)剖析流程
網(wǎng)絡(luò)協(xié)議棧是由若干個(gè)層組成的,網(wǎng)絡(luò)數(shù)據(jù)的流程主要是指在協(xié)議棧的各個(gè)層之間的傳遞。在前面章節(jié)中TCP 網(wǎng)絡(luò)編程的流程,一個(gè) TCP 服務(wù)器的流程按照建立 socket()函數(shù),綁定地址端口 bind()函數(shù),偵聽端口 listen()函數(shù),接收連接 accept()函數(shù),發(fā)送數(shù)據(jù)send()函數(shù),接收數(shù)據(jù) recv()函數(shù),關(guān)閉 socket()函數(shù)的順序來進(jìn)行。與此對(duì)應(yīng)內(nèi)核的處理過程也是按照此順序進(jìn)行的,網(wǎng)絡(luò)數(shù)據(jù)在內(nèi)核中的處理過程主要是在網(wǎng)卡和協(xié)議棧之間進(jìn)行:從網(wǎng)卡接收數(shù)據(jù),交給協(xié)議棧處理;協(xié)議棧將需要發(fā)送的數(shù)據(jù)通過網(wǎng)絡(luò)發(fā)出去。
如下圖所示,總結(jié)了各層間在網(wǎng)絡(luò)輸入輸出時(shí)的層間調(diào)用關(guān)系。由圖中可以看出,數(shù)據(jù)的流向主要有兩種。應(yīng)用層輸出數(shù)據(jù)時(shí),數(shù)據(jù)按照自上而下的順序,依次通過插口層、協(xié)議層和接口層;當(dāng)有數(shù)據(jù)到達(dá)的時(shí)候,自下而上依次通過接口層、協(xié)議層和插口層的方式,在內(nèi)核層傳遞。
應(yīng)用層 Socket 的初始化、綁定(bind)和銷毀是通過調(diào)用內(nèi)核層的 socket()函數(shù)進(jìn)行資源的申請(qǐng)和銷毀的。發(fā)送數(shù)據(jù)的時(shí)候,將數(shù)據(jù)由插口層傳遞給協(xié)議層,協(xié)議層在 UDP 層添加 UDP 的首部、TCP 層添加 TCP 的首部、IP 層添加 IP 的首部,接口層的網(wǎng)卡則添加以太網(wǎng)相關(guān)的信息后,通過網(wǎng)卡的發(fā)送程序發(fā)送到網(wǎng)絡(luò)上。????????
接收數(shù)據(jù)的過程是一個(gè)相反的過程,當(dāng)有數(shù)據(jù)到來的時(shí)候,網(wǎng)卡的中斷處理程序?qū)?shù)據(jù)從以太網(wǎng)網(wǎng)卡的 FIFO 對(duì)列中接收到內(nèi)核,傳遞給協(xié)議層,協(xié)議層在 IP 層剝離 IP 的首部、UDP 層剝離 UDP 的首部、TCP 層剝離 TCP 的首部后傳遞給插口層,插口層查詢 socket 的標(biāo)識(shí)后,將數(shù)據(jù)送給用戶層匹配的 socket。
如下圖所示為 Linux 內(nèi)核層的網(wǎng)絡(luò)協(xié)議棧的架構(gòu)視圖。最上面是用戶空間層,應(yīng)用層的程序位于此處。最底部是物理設(shè)備,例如以太網(wǎng)網(wǎng)卡等,提供網(wǎng)絡(luò)數(shù)據(jù)的連接、收發(fā)。中間是內(nèi)核層,即網(wǎng)絡(luò)協(xié)議棧子系統(tǒng)。流經(jīng)網(wǎng)絡(luò)棧內(nèi)部的是 socket 緩沖區(qū)(由結(jié)構(gòu) sk_buffs接連),它負(fù)責(zé)在源和匯點(diǎn)之間傳遞報(bào)文數(shù)據(jù)。
頂部(參見上圖所示)是系統(tǒng)調(diào)用接口,它為用戶空間的應(yīng)用程序提供了一種訪問內(nèi)核網(wǎng)絡(luò)子系統(tǒng)的接口。位于其下面的是一個(gè)協(xié)議無關(guān)層,它提供了一種通用方法來使用底層傳輸層協(xié)議。然后是實(shí)際協(xié)議,在 Linux 中包括內(nèi)嵌的協(xié)議 TCP、UDP,當(dāng)然還有 IP。然后是另外一個(gè)網(wǎng)絡(luò)設(shè)備協(xié)議無關(guān)層,提供了與各個(gè)設(shè)備驅(qū)動(dòng)程序通信的通用接口,最下面是設(shè)備驅(qū)動(dòng)程序本身。
? ? ? ? ? ? ?·····························
而這些內(nèi)核筆記就是我給大家推薦的《Linux內(nèi)核內(nèi)存管理》訓(xùn)練營(yíng)的隨堂筆記,對(duì)內(nèi)核的每一塊技術(shù)進(jìn)行抽絲剝繭的分析。
????學(xué)習(xí)三部曲
1.?掃描上圖????二維碼報(bào)名訓(xùn)練營(yíng);
2.詳情頁(yè)添加老師領(lǐng)取課前預(yù)習(xí)資料;
3.晚上八點(diǎn)準(zhǔn)時(shí)參與直播。
訓(xùn)練營(yíng)能解決我們Linux內(nèi)核學(xué)習(xí)中的哪些問題?
1.大塊內(nèi)核內(nèi)存怎么樣分配?
2.伙伴系統(tǒng)如何申請(qǐng)內(nèi)核內(nèi)存?
3.slab分配器如何申請(qǐng)內(nèi)核內(nèi)存的?
4.vmalloc()申請(qǐng)的內(nèi)存有什么特點(diǎn)?
5.用戶程序使用malloc()申請(qǐng)到的內(nèi)存空間在什么范圍?
6.TLB中緩存的是什么內(nèi)容?
7.虛擬內(nèi)存如何組織的?
8.缺頁(yè)機(jī)制是如何實(shí)現(xiàn)?
最后再提醒下,訓(xùn)練營(yíng)限時(shí)特惠!
今天到手價(jià)0.02,原價(jià)198
課程永久有效,優(yōu)惠就這兩天,抓緊!
訓(xùn)練營(yíng)課前預(yù)習(xí)資料包:
添加秋香小姐姐?立即領(lǐng)取
點(diǎn)擊“閱讀原文”課前預(yù)習(xí)資料提前領(lǐng)
總結(jié)
以上是生活随笔為你收集整理的我的Linux内核学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java xml转换xsd,将java类
- 下一篇: 内核抢占,让世界变得更美好 | Linu