Linux下應(yīng)用程序調(diào)用驅(qū)動程序流程
- Linux下進行驅(qū)動開發(fā),完全將驅(qū)動程序與應(yīng)用程序隔開,中間通過C標準庫函數(shù)以及系統(tǒng)調(diào)用完成驅(qū)動層和應(yīng)用層的數(shù)據(jù)交換。
- 驅(qū)動加載成功以后會在“/dev”目錄下生成一個相應(yīng)的文件,應(yīng)用程序通過對“/dev/xxx” (xxx 是具體的驅(qū)動文件名字) 的文件進行相應(yīng)的操作即可實現(xiàn)對硬件的操作。
- 用戶空間不能直接對內(nèi)核進行操作,因此必須使用一個叫做 “系統(tǒng)調(diào)用”的方法 來實現(xiàn)從用戶空間“陷入” 到內(nèi)核空間,這樣才能實現(xiàn)對底層驅(qū)動的操作
- 每一個系統(tǒng)調(diào)用,在驅(qū)動中都有與之對應(yīng)的一個驅(qū)動函數(shù),在 Linux 內(nèi)核文件 include/linux/fs.h 中有個叫做 file_operations 的結(jié)構(gòu)體,此結(jié)構(gòu)體就是 Linux 內(nèi)核驅(qū)動操作函數(shù)集合。
文章來源:http://www.zghlxwxcb.cn/news/detail-574072.html
大致流程
文章來源地址http://www.zghlxwxcb.cn/news/detail-574072.html
- 加載一個驅(qū)動模塊,產(chǎn)生一個設(shè)備文件,有唯一對應(yīng)的inode結(jié)構(gòu)體
- 應(yīng)用層調(diào)用open函數(shù)打開設(shè)備文件,對于上層open調(diào)用到內(nèi)核時會發(fā)生一次軟中斷,從用戶空間進入到內(nèi)核空間。
- open會調(diào)用到sys_open(內(nèi)核函數(shù)),sys_open根據(jù)文件的地址,找到設(shè)備文件對應(yīng)的struct inode結(jié)構(gòu)體描述的信息,可以知道接下來要操作的設(shè)備類型(字符設(shè)備還是塊設(shè)備),還會分配一個struct file結(jié)構(gòu)體。
- 根據(jù)struct inode結(jié)構(gòu)體里面記錄的主設(shè)備號和次設(shè)備號,在驅(qū)動鏈表(管理所有設(shè)備的驅(qū)動)里面,根據(jù)找到字符設(shè)備驅(qū)動
- 每個字符設(shè)備都有一個struct cdev結(jié)構(gòu)體。此結(jié)構(gòu)體描述了字符設(shè)備所有信息,其中最重要的一項就是字符設(shè)備的操作函數(shù)接口
- 找到struct cdev結(jié)構(gòu)體后,linux內(nèi)核就會將struct cdev結(jié)構(gòu)體所在的內(nèi)存空間首地址記錄在struct inode結(jié)構(gòu)體i_cdev成員中,將struct cdev結(jié)構(gòu)體中的記錄的函數(shù)操作接口地址記錄在struct file結(jié)構(gòu)體的f_ops成員中。
- 執(zhí)行xxx_open驅(qū)動函數(shù)。
知識補充
- 在Linux文件系統(tǒng)中,每個文件都用一個struct inode結(jié)構(gòu)體來描述,這個結(jié)構(gòu)體記錄了這個文件的所有信息,例如文件類型,訪問權(quán)限等。
- 在linux操作系統(tǒng)中,每個驅(qū)動程序在應(yīng)用層的/dev目錄或者其他如/sys目錄下都會有一個文件與之對應(yīng)。
- 在linux操作系統(tǒng)中, 每個驅(qū)動程序都有一個設(shè)備號
- 在linux操作系統(tǒng)中,每打開一次文件,Linux操作系統(tǒng)會在VFS層分配一個struct file結(jié)構(gòu)體來描述打開的文件。
到了這里,關(guān)于Linux驅(qū)動開發(fā)—最詳細應(yīng)用程序調(diào)用驅(qū)動程序解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!