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