華清遠見嵌入式學院
講師。在講授linux初級驅動的時候,我發現困惑很多同學的是不真正理解從應用層到我們自己所寫的驅動層的呼叫過程,所以寫此文章來大概描述。
首先我們知道,在我們目前的linux系統中,我們大概共約300左右個系統呼叫,其中syscall_table.s列出了所有的系統呼叫表。
.long sys_open /* 5 */
-----------------------------
檢視sys_open() 函式,我們看到裡面所完成的工作為:
1、檢視開啟的是否是大檔案,如果是的話,置大檔案標誌位:o_largefile
2、做do_sys_open()函式呼叫。
3、檢查2的呼叫返回值ret是否有效。
-----------------------------
-----------------------------
檢視do_sys_open()函式所完成的工作為:
呼叫getname() ,getname函式主要功能是在使用檔名之前將其拷貝到核心資料區,正常結束時返回核心分配的空間首位址,出錯時返回錯誤**。
取得系統中可用的檔案描述符fd。
呼叫do_filp_open()函式,此函式使用了乙個資料結構nameidata來描述與檔案相關的檔案操作。
struct nameidata intent; // 專用資料
};-----------------------------
-----------------------------
struct file *do_filp_open(const char * filename, int flags, int mode)
-----------------------------
-----------------------------
我們下面來看這個比較關鍵的函式:nameidata_to_filp():
struct file *(struct nameidata *nd, int flags)
821
-----------------------------
-----------------------------
關鍵函式:__dentry_open():
static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt,
int flags, struct file *f,
int (*open)(struct inode *, struct file *))
-----------------------------
-----------------------------
在函式chrdev_open中(/fs/char_dev.v):
int chrdev_open(struct inode * inode, struct file * filp)
-----------------------------
到此,系統通過file->f_op 就與我們在裝置驅動裡面的定義的相關操作聯絡起來了,我們之前在寫驅動實現的功能操作就被系統通過應用層的open 一步一步的呼叫到我們自己的open跟相關其他的操作了。
從使用者態的open到核心驅動實現流程
從使用者態的open到核心驅動實現流程 在講授linux初級驅動的時候,我發現困惑很多同學的是不真正理解從應用層到我們自己所寫的驅動層的呼叫過程,所以寫此文章來大概描述。首先我們知道,在我們目前的linux系統中,我們大概共約300左右個系統呼叫,其中syscall table.s列出了所有的系統呼...
從使用者態切換到核心態
在linux系統中,每個系統呼叫被賦予乙個系統呼叫號。這樣通過這個系統呼叫號就可以關聯系統呼叫。當使用者空間執行的程序執行乙個系統呼叫的時候,這個系統呼叫號就告訴核心需要呼叫哪個。核心記錄了系統調表中所有已註冊過的系統呼叫的列表,這個表為每乙個有效的系統呼叫指定了唯一的系統呼叫號。使用者空間程式無法...
學習筆記 使用者態到核心態的轉化原理
態勢的識別 那麼計算機是如何知道現在正在運轉的程式是核心態程式呢?核心態與使用者態的實現 核心態是特權態,而使用者態是普通態。1 使用者態切換到核心態的3種方式 1 系統呼叫 2 異常 3 外圍裝置的中斷 2 切換操作 1 從當前程序的描述符中提取其核心棧的ss0及esp0資訊。2 使用ss0和es...