塊設備
字符設備
網絡設備linux
一般縮寫爲blkdev,它是可尋址的,尋址以塊爲單位,塊大小隨設備不一樣而不一樣;塊設備一般支持重定位操做,也就是對數據的隨機訪問。
塊設備是經過稱爲「塊設備節點」的特殊文件來訪問的,井且一般被掛載爲文件系統。性能優化
一般縮寫爲cdev,它是不可尋址的,僅提供數據的流式訪問,就是一個個字符,或者一個個字節。
字符設備的例子有鍵盤、鼠標、打印機,還有大部分僞設備。字符設備是經過稱爲「字符設備節點」的特殊文件來訪問的。與塊設備不一樣,應用程序經過直接訪問設備節點與字符設備交互。網絡
最多見的類型有時也以以太網設備稱呼,它提供了對網絡〈例如Internet)的訪問,這是經過-個物理適配器和一種特定的協議進行的
網絡設備打破了Unix的「全部東西都是文件」的設計原則,它不是經過設備節點來訪問,而是經過套接字API這樣的特殊接口來訪問。dom
大部分設備驅動是表示物理設備的,但並非全部設備驅動都表示物理設備。有些設備驅動是虛擬的,僅提供訪問內核功能而已。咱們稱爲「僞設備」。模塊化
常見的如:函數
內核隨機數發生器(經過/dev/random和/dev/urandom 訪問)
空設備(經過/dev/null 訪問)
零設備(經過/dev/zero 訪問)
滿設備(經過/dev/full 訪問)
內存設備(經過/dev/mem 訪問)工具
Linux 內核是模塊化組成的,它容許內核在運行時動態地向其中插入或從中刪除代碼。這些代碼(包括相關的子例程、數據、函數人口和函數出口)被一併組合在一個單獨的二進制鏡像中,即所謂的可裝載內核模塊中,或簡稱爲模塊。
支持模塊的好處是基本內核鏡像能夠儘量地小,由於可選的功能和驅動程序能夠利用模塊形式再提供。模塊容許咱們方便地刪除和從新載入內核代碼,也方便了調試工做。並且當熱插拔新設備時,可經過命令載入新的驅動程序。
模塊的全部初始化函數必須符合形式:int my _ init (void);
退出函數必須符合形式:void my_exit (void);性能
安裝編譯的模塊: make modules_install優化
產生依賴關係信息,並且在每次啓動時更新。
產生內核依賴關係的信息,root用戶可運行命令:depmod
只爲新模塊生成依賴信息,不生成全部的依賴關係,root用戶可運行命令:depmod -A
模塊依賴關係信息存放在/lib/modules/version/modules.dep文件中。編碼
載入,root用戶可運行命令:insmod module .ko
在內核via modprobe中插入模塊,root用戶可運行命令:zmodprobe module[module parameters] (參數 module 指定了須要載入的模塊各稱)。
從內核中卸載模塊,root用戶可運行命令:modprobe -r modules
1.kobject:
設備模型的核心部分。其中struct kobject 結構體表示,定義於頭文件<linux/k,ρ1lij四t.b>中。一般是嵌入其餘結構中的。
2.ktype:
kobject 對象被關聯到一種特殊的類型:ktype。由kobj_type 結構體表示,定義於頭文件<linux/kobject.h>中。爲了描述一族kobject 所具備的廣泛特性。
3.kset:
在Linux 內核中,只有少數一些的ktype,卻有多個kset。由kset 結構體表示,定義於頭文件<linux/kobject.h>中:
4.kobject、ktype、kset關係:
kobject,讓那些包含它的結構具備了kobject 的特性。ktype 定義了一些kobject 相關的默認特性。kset 提供了兩個功能:第一,其中嵌入的kobj創做爲kobject 組的基類。第二, kset 將相關的kobject 集合在一塊兒。
5.管理和操做kobject:
kobject 經過函數koject_init 進行初始化,該函數定義在文件<linux/kobject.h>中:void kobject_init(struct kobject kobj, struct kobj_type ktype);第一個參數就是須要初始化的kobject 對象;調用初始化函數前, kobject 必須清空;未被清空,調用memset() 便可:memset(kobj, 0, sizeof (*kobj ) );應該調用kobject_createO 建立koject。
6.計數:
kobject的主要功能:提供了一個統一的引用計數系統。初始化後,kobject的引用計數設置爲1;引用計數不爲零,該對象就會繼續保留在內存中。引用計數跌到零時,對象可被撤銷,相關內存也被釋放。koject 的引用計數是經過kref結構體實現,該結構體定義在頭文件<linux/kref.h>中。
有些操做系統在設計時把可移植性做爲頭等大事之一,儘量減小涉及與機器相關的代碼。彙編代碼少之又少,這樣作就是利用代碼性能優化能力換取代碼的可移植性。Minix,NetBSD和許多研究用的系統就是這種高度可移植的操做系統。
還有一些操做系統徹底不顧及可移植性,盡最大可能追求代碼的性能表現,儘量多的使用匯編代碼,這樣就是利用代碼的可移植性換取代碼的性能優化能力。這樣的系統比可移植的系統更難維護。DOS和Windows95就是這樣的操做系統。
ANSIC標準規定,一個char的長度必定是1字節;儘管沒有規定int類型的長度是32位,但在Linux當前支持的體系結構中,它都是32位的。short類型也相似,在當前全部支持的體系結構中,雖然沒有明文規定,可是它都是16位的。絕對不該該假定指針和long的長度,在linux當前支持的體系結構中,它們能夠在32位和64位中變化。對於不一樣的體系結構long的長度不一樣,決不該該假設sizeof(int)=sizeof(long)。相似的,也不要假設指針和int長度相等。
要想寫出移植性好、簡潔、合適的內核代碼,要注意如下兩點:
1.編碼儘可能選取最大公因子:假定任何事情均可能發生,任何潛在的約束均可能存在。編碼儘可能選取最小公約數:不要假定給定的內核特性是可用的,僅僅須要最小的體系結構功能。
2.編寫可移植性的代碼須要考慮不少問題:字長、數據類型、填充、對齊、字節次序、符號、字節順序、頁大小以及處理器的加載/存儲排序等。對於絕大多數的內核開發者來講,可能主要考慮的問題就是保證正確使用數據類型。
本章重點介紹了Linux編碼風格: