Linux核心設計與實現第十周讀書筆記

2022-09-01 06:39:09 字數 3143 閱讀 9434

關於裝置驅動與裝置管理,我們討論四種核心成分。

在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組...

第十周總結

這周一開始說的是要考試,但是最後又說等通知,所以就有時間複習了,要是真的這周考試那就涼涼了。之前學的有的忘了,有的是根本都不會,反正都得從頭開始看。這周講課的時候我看了看講課表,嗯,下下個星期就到我了。下個星期又要考試,所以說還是考試重要,講課先放到一邊,等考試過了再說,畢竟考的那兩門都挺難的。不過...