1. 程式人生 > >《深入Linux核心架構與底層原理》讀書筆記一——核心架構與核心資料結構知識

《深入Linux核心架構與底層原理》讀書筆記一——核心架構與核心資料結構知識

1、核心架構常見架構正規化:
  • Linux核心上下層通訊方式
  • 橫向系統和縱向系統
橫向系統如cgroup,proc,sys檔案系統,系統呼叫的組織,除錯系統,Core Dump,訊號,記憶體管理等;
縱向系統是指具體的功能模組,如USB功能,一個對USB檔案的操作要走完核心中的很多個層次,即檔案系統層、快取層、通用塊層、SCSI層、USB層等。Linux一般將這些層次劃分為3個大的層次,介面層、功能邏輯層和驅動層。
2、模組支援
  • 模組是Linux支援動態功能擴充套件的最主要機制。
  • 模組可以在程式設計時指定其可以接受的引數,這個引數是給使用者用的。在模組載入之後,使用者空間通過"echo -n ${value} > /sys/module/${modulename}/parameters/${parm}"就可以動態修改模組引數。
  • 模組機制存在的意義就是可以動態的載入和解除安裝。
  • 模組簽名,每個模組在編譯時都會從核心目錄中獲得版本號寫入編譯的模組,執行中的核心在插入新的模組時會檢測簽名是否一致,若不一致就不會載入。可以使用modinfo檢視模組簽名信息。模組簽名的內容有兩部分:版本號、雜湊簽名
  • 模組程式設計可使用的核心元件:workqueue,Linux下的工作佇列,可以將工作推後執行,對其進行睡眠、排程,系統有預設的workqueue核心執行緒,但也支援使用者自己定義workqueue;中斷系統和tasklet,中斷親合度可以用於應用運維工作中幫助鎖定應用效能。
3、特殊軟體機制
  • UIO,允許使用者端直接訪問裝置細節,是一個在使用者端實現核心驅動的機制。
  • VFIO,是軟體對硬體裝置記憶體暴露在使用者空間的支援,是對UIO的升級。使用者可以通過直接操作硬體的記憶體空間來操作硬體。
  • SysRq,類似於windows的Ctrl+Alt+Del組合鍵的效果,只要系統不是完全被鎖死的狀態,就會優先響應這個命令。
在Linux中可以控制SysRq的關閉和開啟,使用echo "1" > /proc/sys/kernel/sysrq開啟該機制。
在Linux中呼叫該系列命令的方式是“SysRq+命令”,SysRq在大部分鍵盤上一般是Print Screen按鍵的副功能,需要使用Alt鍵呼叫。
SysRq+b:立即重啟系統
SysRq+c:產生一個系統級的crash dump
SysRq+d:顯示當前使用中的所有鎖
SysRq+e:傳送SIGTERM給除init之外的全部程序
除以上之外還有十幾個類似命令
  • 其他機制,PADATA,namespace
4、核心資料結構之連結串列與雜湊表
  • 連結串列,具有彈性不動屬性,可以把離散時間到達的資料結構串起來,使其可以更容易地被索引,並且不需要移動之前的內容。
  • 核心雜湊表,是由連結串列群組成的,其每一個雜湊桶都是一個連結串列。
  • 雙向連結串列,其資料域一般包括prev、next與data,很容易做成一個環。
  • hlist,擁有隻有一個指標大小的頭部的雙向連結串列(只使用一個頭部,解決雜湊桶的空間利用率問題)。
  • ScatterList,在DMA支援分離的多塊記憶體同時的傳輸下所產生的一種軟體結構,其表示的是多塊分離的塊記憶體。Linux允許對ScatterList進行拼接或合併。
  • llist,一種不需要加鎖的list,這是核心出於提高處理效率而採用的一種無鎖操作所使用的資料結構。
5、其它資料結構
  • B+樹,Linux核心中實現了一個通用的B+樹,主要用於檔案系統中,當然也有一些檔案系統是自己實現的類似的B+樹。
  • radix tree樹,核心中使用該資料結構將指標與long整數鍵值進行關聯,例如IDR機制,並且具有很高的搜尋效率。
  • 位陣列bitmap,是以位為單位儲存值的方式,大部分檔案系統都用到了這一技術。如ext中使用inode點陣圖和資料塊點陣圖,用來表示對應序號的inode或者資料塊有沒有被使用。在raid系統中,如raid1的資料一致性保障,會通過檢查這樣的一份點陣圖,以發現兩份資料的不一致問題。
  • FIFO,命名管道,是核心提供給使用者空間的一個非常好用的工具,相當於一個跨程序的佇列,提供了原生的陰塞和配合檔案能力的工具。類似的能力也可以使用訊息佇列或UNIX domain socket來實現。FIFO檔案還有一個特性,它是一個檔案,即使沒人在讀取,也可以往檔案裡寫內容。
  • FIFO檔案在互動式shell中是非常有效的一種除錯工具,使用mkfifo命令建立fifo檔案。在阻塞模式下,一方保持cat該檔案,如果沒有資料就會一直阻塞在那裡;若有一方使用了echo等向其寫入了資料,cat就會立即執行讀取資料。
  • 在Linux中,FIFO管道並沒有專門的資料結構,而是通過將兩個file結構指向同一個臨時的VFS索引節點inode,而這個VFS索引節點又是指向一個物理頁面而實現的。在寫入FIFO檔案的時候最好不要使用檔案的快取功能,要一次性地完整寫入。
  • FIFO的使用並不容易,對於一個嚴肅的FIFO應用場景來說,需要滿足以下使用條件:
跨程序傳輸資料
資料的產生和資料的監聽不同步
資料只要被讀取了就會被刪除,第二次就不會被再次讀取
需要等待超時、永久阻塞、立即返回其中的某些或全部特性
需要運維繫統檢視資料流
沒有任何辦法提前判斷要讀的阻塞式的FIFO內是否有資料

相關推薦

Linux核心設計實現》讀書筆記(十八)- 核心除錯

核心除錯的難點在於它不能像使用者態程式除錯那樣打斷點,隨時暫停檢視各個變數的狀態。 也不能像使用者態程式那樣崩潰後迅速的重啟,恢復初始狀態。 使用者態程式和核心互動,使用者態程式的各種狀態,錯誤等可以由核心來捕獲並顯示。 而核心是直接和硬體互動的,核心出錯之後整個系統就無法正常運行了,所以要想熟練的

深入探索Android熱修復技術原理讀書筆記——第一章:熱修復技術介紹

第一章 熱修復技術介紹 1.1 什麼是熱修復 傳統開發流程: 重寫釋出版本代價太高 使用者下載安裝成本太高 bug修復不及時,使用者體驗差 有許多開發者找到了合適的解決辦法,比如: 經常變更的業務用H5獨立出來,但是增加

計算機網路組網配置技術—— 讀書筆記1、組網配置基礎知識

第一章組網與配置基礎知識 1.1計算機網路中的協議與層次 計算機網路協議是通訊雙方在通訊時彼此理解的規定和約定。有三個要素:語法,語義,時序同步。 計算機網路中實現網路服務的層次和協議構成計算機網路體系結構。 計算機網路的拓撲結構劃分:主要有匯流排型、星型、環型、樹型、全連

程式碼整潔之道 讀書筆記 - 第6章 物件和資料結構

資料結構、物件的反對稱性 物件(物件式程式碼)曝露行為,隱藏資料。便於新增新物件型別而無需修改既有行為,同時也難以在既有物件中新增新行為。 資料結構(過程式程式碼)曝露資料,沒有明顯的行為。便於向既有資料結構新增新行為,同時也難以向既有函式新增新資料結構。 在任何系統中,我們有時會希望能夠靈活地新增新資

深入Linux核心架構底層原理讀書筆記——核心架構核心資料結構知識

1、核心架構常見架構正規化:Linux核心上下層通訊方式橫向系統和縱向系統橫向系統如cgroup,proc,sys檔案系統,系統呼叫的組織,除錯系統,Core Dump,訊號,記憶體管理等;縱向系統是指具體的功能模組,如USB功能,一個對USB檔案的操作要走完核心中的很多個層

Linux核心設計實現》 讀書筆記

linux核心簡介 Linux系統的基礎是核心,C庫(庫函式裡會有些系統呼叫),工具集和系統的基本工具。 通常一個核心由負責響應中斷的中斷服務程式,負責管理多個程序從而分享處理器時間的排程程式,負責管理程序地址空間的記憶體管理程式,和網路、程序間通訊等系統服務程

Linux核心設計實現》讀書筆記(十三)- 虛擬檔案系統

虛擬檔案系統(VFS)是linux核心和具體I/O裝置之間的封裝的一層共通訪問介面,通過這層介面,linux核心可以以同一的方式訪問各種I/O裝置。 虛擬檔案系統本身是linux核心的一部分,是純軟體的東西,並不需要任何硬體的支援。 主要內容: 虛擬檔案系統的作用 虛擬檔案系統的4個主要物件

Linux核心設計實現》讀書筆記(十五)- 程序地址空間(kernel 2.6.32.60)

程序地址空間也就是每個程序所使用的記憶體,核心對程序地址空間的管理,也就是對使用者態程式的記憶體管理。 主要內容: 地址空間(mm_struct) 虛擬記憶體區域(VMA) 地址空間和頁表 1. 地址空間(mm_struct) 地址空間就是每個程序所能訪問的記憶體地址範圍。 這個地址

Linux核心設計實現》讀書筆記(十九)- 可移植性

linux核心的移植性非常好, 目前的核心也支援非常多的體系結構(有20多個). 但是剛開始時, linux也只支援 intel i386 架構, 從 v1.2版開始支援 Digital Alpha, Intel x86, MIPS和SPARC(雖然支援的還不是很完善). 從 v2.0版本開始加入了對 M

Linux核心設計實現》讀書筆記(十四)- 塊I/O層

最近太忙,居然過了2個月才更新第十四章。。。。 主要內容: 塊裝置簡介 核心訪問塊裝置的方法 核心I/O排程程式 1. 塊裝置簡介 I/O裝置主要有2類: 字元裝置:只能順序讀寫裝置中的內容,比如 串列埠裝置,鍵盤 塊裝置:能夠隨機讀寫裝置中的內容,比如 硬碟,U盤 字元

Linux核心設計實現》讀書筆記(十七)- 裝置模組

本章主要討論與linux的裝置驅動和裝置管理的相關的4個核心成分,裝置型別,模組,核心物件,sysfs。 主要內容: 裝置型別 核心模組 核心物件 sysfs 總結 1. 裝置型別 linux中主要由3種類型的裝置,分別是: 裝置型別 代表裝置

Linux核心設計實現》讀書筆記(二十)- 補丁, 開發和社群

linux最吸引我的地方之一就是它擁有一個高手雲集的社群, 還有就是如果能=為linux核心中貢獻程式碼, 一定是一件令人自豪的事情. 下面主要總結一些和貢獻程式碼相關的主要內容. 加入社群 編碼風格 提交補丁 總結 1. 加入社群 如果想為linux貢獻程式碼, 那麼加入linux

Linux核心設計實現》讀書筆記(十六)- 頁快取記憶體和頁回寫

好久沒有更新了。。。 主要內容: 快取簡介 頁快取記憶體 頁回寫 1. 快取簡介 在程式設計中,快取是很常見也很有效的一種提高程式效能的機制。 linux核心也不例外,為了提高I/O效能,也引入了快取機制,即將一部分磁碟上的資料快取到記憶體中。 1.1 原理 之所以通過快取能

深入linux裝置驅動程式核心機制(第九章) 讀書筆記

第9章 linux裝置驅動模型       本文歡迎轉載, 請標明出處        本文出處: http://blog.csdn.net/dyron 9.1 sysfs檔案系統          sysfs檔案系統可以取代ioctl的功能.     sysfs檔案系統

Linux核心設計實現》Linux核心原始碼情景分析》讀書筆記

第一章:核心簡介 處理器在任何指定時間點上的活動範圍: a,運行於核心空間,處於程序上下文,代表某個特定的程序執行; b,運行於核心空間,處於中斷上下文,於任何程序無關,處理某個特定的中斷; c,運行於使用者空間,執行使用者程序。 當一個程序在執行時,CPU的所有暫存器中的

深入理解Nginx 模組開發架構解析-陶輝 讀書筆記

前言 1. nginx是一個優秀的事件驅動框架,nginx非常適合開發在傳輸層以TCP對外提供服務的伺服器程式。基於nginx框架開發程式有5個優勢: * nginx將網路、磁碟及定時器等非同步事件的驅動都做了非常好的封裝,基於它開發將可以忽略這些事情處理的細節 * ng

《Spring技術內幕:深入解析Spring架構設計原理筆記之六(Spring事務處理的實現)

1.Spring與事務處理有了Spring事務管理的支援,只需要通過一些簡單的配置,應用就能完成複雜的事務處理工作,從而為使用者使用事務處理提供很大的方便。2.Spring事務處理的設計概覽Spring事務處理模組中的類層次結構在Spring事務處理中,可以通過設計一個Tra

Linux內核設計實現》讀書筆記(八)- 中斷下半部的處理

sym dmesg 重新編譯 warn dad style lsp 之前 res 在前一章也提到過,之所以中斷會分成上下兩部分,是由於中斷對時限的要求非常高,需要盡快的響應硬件。 主要內容: 中斷下半部處理 實現中斷下半部的機制 總結中斷下半部的實現 中斷實現

Linux內核設計實現》讀書筆記(十二)- 內存管理

enable vmalloc 緩沖 turn lean png border 編譯 不一致 內核的內存使用不像用戶空間那樣隨意,內核的內存出現錯誤時也只有靠自己來解決(用戶空間的內存錯誤可以拋給內核來解決)。 所有內核的內存管理必須要簡潔而且高效。 主要內容: 內

Linux內核設計實現》讀書筆記(十六)- 頁高速緩存和頁回寫

第一次 源碼 進行 lose 減少 文件緩存 掩碼 recycle 創建 主要內容: 緩存簡介 頁高速緩存 頁回寫 1. 緩存簡介 在編程中,緩存是很常見也很有效的一種提高程序性能的機制。 linux內核也不例外,為了提高I/O性能,也引入了緩存機