關於裝置驅動與裝置管理,我們討論四種核心成分。
在linux以及所有unix系統中,裝置被分為以下三種型別:
並不是所有裝置驅動都表示物理裝置。有些裝置驅動是虛擬的,僅提供訪問核心功能而已。我們成為「偽裝置」。
支援模組的好處是基本核心映象可以盡可能地小,因為可選的功能和驅動程式可以利用模組形式再提供。模組允許我們方便地刪除和重新載入核心**,也方便了除錯工作。
moudle_license()
巨集用於指定模組的版權。
moudle_author()
巨集和moudle_description()
巨集指定了**作者和模組的簡要描述,它們完全是用作資訊記錄目的。
下面的構建命令用來安裝編譯的模組到合適的目錄下:make moudles_install
,通常需要以root許可權執行。
與rmmod命令不同,modprobe
也會解除安裝給定模組所依賴的相關模組,但其前提是這些相關模組沒有被使用。
如果你建立了乙個新子目錄,而且也希望kconfig檔案存在於該目錄中的話,那麼你必須在乙個已存在的kconfig檔案中將它引入。你需要加入下面一行指令:source "drivers/char/fishing/kconfig"
定義乙個模組引數可通過巨集module_param()
完成:module_param(name,type,perm);
引數name既是使用者可見的引數名,也是你模組中存放模組引數的變數名。引數type則存放了引數的型別。最後乙個引數perm指定了模組在sysfs檔案系統下對應檔案的許可權。
在核心中,匯出核心函式需要使用特殊的指令:export_symbol()
和export_symbol_gpl()
。
匯出的核心函式可以被模組呼叫。匯出的核心符號表被看作匯出的核心介面,甚至稱為核心api。
裝置模型的核心部分是kobject(kernel object)
。kobject
提供了諸如引用計數、名稱和父指標等字段,可以建立物件的層次結構。
name指標指向kobject的名稱。
parent指標指向kobject的父物件。
kref提供引用計數,ktype和kset結構體對kobject物件進行描述和分類。
struct kobject ;
struct kobj_type ;
ktype是為了描述kobject所具有的普遍特性。
release指標指向在kobject引用計數減至0時要被呼叫的析構函式。該函式負責釋放所有kobject使用的記憶體和其他相關清理工作。
sysfs_ops
變數指向sysfs_ops
結構體。該結構體描述了sysfs檔案讀寫時的特性。
default_attrs
指向乙個attribute結構體陣列。這些結構體定義了該kobject相關的預設屬性。
kset是kobject物件的集合體。kset可把kobject集中到乙個集合中,而ktype描述相關型別kobject所共有的特性。區別:具有相同ktype的kobject可以被分組到不同的kset。就是說在linux核心中只有少數一些的ktype,卻有多個kset。
struct kset ;
list連線kset中所有的kobject物件,list_lock
是保護這個鍊錶元素的自旋鎖,kobj指向的kobject物件代表了該集合的基類。uevent_ops
指向乙個結構體用於處理集合中kobject物件的熱插拔操作。
kobject本身的意義不大,通常情況下需要被嵌入到其他資料結構中,讓那些包含它的結構具有了kobject的特性。
kobject的主要功能之一就是為我們提供了乙個統一的引用計數系統。
struct kref;
其中唯一的字段是用來存放引用計數的原子變數。那麼為什麼採用結構體?這是為了便於進行型別檢測。
sys檔案系統是乙個處於記憶體中的虛擬檔案系統,它為我們提供了kobject物件層次結構的檢視。
想要把kobject匯入sysfs,需要用到函式kobject_add ()
:int kobject_add(struct kobject *kobj,struct kobject *parent,const char *fmt, ...);
kobject在sysfs中的位置取決於kobject在物件層次結構中的位置。
從sysfs中刪除乙個kobject對應檔案目錄,需要使用函式kobject_del()
:void kobject_del(struct kobject *kobj);
預設的檔案集合是通過kobject和kset中的ktype欄位提供的。因此所有具有相同型別的kobject在它們對應的sysfs目錄下都擁有相同的預設檔案集合。這些屬性負責將核心資料對映成sysfs中的檔案。
核心為能在預設集合之上,再新增新屬性而提供了sysfs_create_file()
介面:int sysfs_cerate_file(struct kobject *kobj,const struct attribute *attr);
除了新增檔案外,還有可能需要建立符號連線。在sysfs中建立乙個符號連線相當簡單:int sysfs_create_link(struct kobject *kobj,struct kobject *target,char *name);
刪除乙個屬性需通過函式sysfs_remove_file()
:void sysfs_remove_file(struct kobject *kobj,const struct attribute *attr);
由sysfs_creat_link()
建立的符號連線可通過函式sysfs_remove_link()
刪除:void sysfs_remove_link(struct kobject *kobj,char *name);
演算法設計與分析》第十周作業
標籤 空格分隔 課堂作業 姓名 李 學號 16340114 題目 word break 給定乙個無分隔符的字串和乙個字典,問是否能將字串分解成字典中含有的詞。給定位置i,定義該下標 可分解 的含義為 從0到該下標的子字串 不包括i 是可以被分解的。要判斷乙個位置i是否可分解,就要判斷上乙個可分解的位...
第十周周小結
2.本次工作任務 本週老師沒有明確的給每個團隊留這週的作業,因為每個團隊的專案進入到了開發階段,老師只是要求每個團隊每天必須有要有明確的任務,提交量和團隊內部每日例會總結上傳到碼雲倉庫,助教每天每天進入倉庫檢視,他們專案倉庫的提交結果並進行點評和打分。我負責的團隊 web5組,web8組,web9組...
第十周總結
這周一開始說的是要考試,但是最後又說等通知,所以就有時間複習了,要是真的這周考試那就涼涼了。之前學的有的忘了,有的是根本都不會,反正都得從頭開始看。這周講課的時候我看了看講課表,嗯,下下個星期就到我了。下個星期又要考試,所以說還是考試重要,講課先放到一邊,等考試過了再說,畢竟考的那兩門都挺難的。不過...