Linux内核探秘读书笔记
(Linux內核探秘(高劍林著 )讀書筆記)
Linux 文件系統探秘
一 文件系統基本概念
1.1 VFS
? ? Linux內核通過虛擬文件系統(VFS)管理文件系統。
? ? 對每個具體文件系統的訪問要通過VFS定義的接口來實現。
? ?VFS定義了幾個重要的結構,dentry, inode, super_block,通過這些結構將一個真實的硬盤文件系統抽象到內存,通過管理這幾個對象就可以完成對文件系統的一些操作。
1.2 超級塊super_block
? ? 超級塊代表了整個文件系統本身。
? ? 文件系統內所有的inode也都要鏈接到超級塊的鏈表頭。
? ? 超級塊是對應文件系統自身的控制塊結構。
? ? 超級塊結構給出了文件系統的全局信息:文件系統的塊大小,文件系統中最大文件的尺寸,指向file_system_type結構的指針,魔術數字,指向文件系統根dentry的指針,
? ? 超級塊對象還定義了一些鏈表頭,用來鏈接文件系統內的重要成員:s_inodes指向文件系統內所有的inode, s_dirty指向所有dirty的inode對象,s_bdev指向文件系統存在的塊設備指針;
? ? 超級塊結構包含一些函數指針,super_operations提供了最重要的超級塊操作。
1.3 目錄項dentry
? ? 在VFS里,目錄本身也是一個文件;每個文件都有一個dentry,這個dentry鏈接到上級目錄的dentry。層層鏈接,形成一顆dentry樹。
? ? 為了加快對dentry的查找,內核使用了hash表來緩存dentry,稱為dentry cache。
? ? dentry結構的成員:d_inode指向一個inode結構;d_subdirs是子項的鏈表頭;d_child是dentry自身的鏈表頭;d_parent指向父dentry結構;d_hash; d_name保存文件或目錄的名字;d_mounted用來指示dentry是否是一個掛載點。
1.4 索引節點inode
? ? inode代表一個文件。
? ? dentry和inode代表一個文件?事實基本如此。
1.5 文件
? ? 文件對象的作用是描述進程和文件交互的關系。硬盤上并在存在一個文件結構;進程打開一個文件,內核就動態創建一個文件對象。
設備的概念和總體架構
一 設備的配置表
? ? 以PCI設備為準說明。
? ? PCI設備本身就包含一個配置表。
? ? 配置表包含設備制造商填充的廠商信息、設備屬性等通用配置信息。設備廠商還應該提供設備的控制寄存器信息。設備還可能配備了內存。
? ? 設備本身有一些配置信息,如設備ID、制造商ID等。
? ? 設備寄存器基址,可以將其看作一個地址,對這個地址寫指令就可以控制設備。
? ? PCI總線規范定義的PCI設備配置空間總長度為256字節,配置信息按一定的順序和大小依次存放。配置空間的前64字節稱為配置頭。配置頭的主要功能是用來識別設備、定義主機訪問PCI卡的方式。其余192字節稱為本地配置空間,主要定義卡上局部總線的特性、本地空間基地址及范圍等。
為設備服務的特殊文件系統sysfs
kobject結構
? ? sysfs創建目錄時,傳遞的參數就是一個kobject結構。可以認為kobject代表sysfs文件系統的一個目錄。
1 kobject和kset的關系
? ? kset結構里封裝了一個kobject結構,同時包括一個鏈表頭,屬于這個kset的所有kobject都要鏈接到kset的鏈表頭。
2 總線的注冊
? ? 總線的注冊使用platform_bus_init函數。
? ? bus_register的作用是把總線對象注冊到內核。
? ? bus對象內含兩個kset,一個是devices,另一個是drivers。
serio總線
? ? 驅動之間可以嵌套。一種類型的總線可以架構在另一種類型的總線之上。
一 總線適配器
? ? 網卡、聲卡、顯卡、SCSI卡等設備很多都是以PCI卡的形式出現,并插入計算機的PCI插槽。聲卡顯卡加載驅動后,就可以直接讀寫操作。SCSI卡本身又可以連接
SCSI硬盤,因此加載SCSI卡的PCI驅動后,必須進行SCSI總線掃描,發現SCSI硬盤設備,才能正確地讀寫硬盤。這里,SCSI卡就擔任了總線橋的任務,它提供了總線
之間的協議轉換和互操作。像SCSI卡這樣的設備,稱為主機總線適配器(HBA),它一方面是PCI設備,另一方面它又管理SCSI總線的設備。
二 向serio總線注冊設備
? ? serio總線建筑在platform總線之上,它們分工合作,共同提供了完整的驅動功能。
? ? 從架構的角度看,serio總線這種總線嵌套使用模式類似于總線適配器的模式。
1 注冊端口登記事件
? ? serio_register_port函數的作用是注冊serio總線。
? ? serio_register_port函數的輸入參數serio設置了端口類型。
? ? serio_queue_event函數首先遍歷內核的serio_event_list鏈表。同一個端口只能注冊一次。然后創建一個serio_event結構,設置這個serio_event結構的類型為端口注冊,喚醒處理這個事件的任務。
2 遍歷總線的驅動
? ? serio_add_port函數的關鍵部分是device_add函數。
? ? serio總線的match函數定義在serio.c文件。serio_bus_match函數在設備注冊時多次調用,它的輸入參數是serio總線上注冊的每一個驅動,需要逐個檢查端口設備serio和驅動的匹配情況。
3 注冊input設備
? ? 調用input_register_device注冊input設備。
三 虛擬鍵盤驅動
PCI總線
一 深入理解PCI總線
? ? 當PCI總線掃描到PCI設備后,已經為設備設置了DMA信息、中斷信息和I/O端口、I/O內存信息。
1.1 PCI設備工作原理
? ? PCI設備具有自己的設備配置信息,也具備I/O端口和I/O內存,這些端口和內存構成一個獨立的地址空間,就是PCI總線地址空間。
? ? CPU要通過主橋才能訪問PCI地址空間,PCI設備也要通過主橋才能訪問主存。
? ? 主橋可以直接產生一條PCI總線,這條總線也是主橋管理的第一條總線,也是0號PCI總線。在內核代碼中,會直接使用這條0號總線。
? ? 從該總線還可以擴展出一系列的PCI總線,稱為PCI橋,以主橋為根節點,這些橋和設備形成了一顆PCI樹。
? ? 一條PCI總線上,最多只能掛載256個PCI設備。
1.2 PCI總線域
? ? PCI設備具有一個8 bit的總線號,一個5bit的設備編號以及一個3bit的功能編號。
? ? 一個主橋下最多擁有256個總線,對大型系統而言這是不夠的,為此Linux引入PCI域的概念。
1.3 PCI資源管理
? ? 為了管理PCI設備的I/O端口和I/O內存,內核定義了一個resource結構。
總結
以上是生活随笔為你收集整理的Linux内核探秘读书笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 各种DIV布局单元
- 下一篇: 用表格布局2个链接6个图片