驅動呼叫過程
剛接觸到linux下驅動程式設計,一般都是照著模式寫**,或是修改一下已有原始碼,對驅動的呼叫過程並不是很熟悉。在網上不斷的**,算是有點明白了,現在我就說下自己的了解。
我們載入驅動模組後都會做乙個工作,就是通過mknod在/dev資料夾下建立乙個裝置檔案
如mknod /dev/$ c $major 0
$major 為主裝置號,0次裝置號
這個裝置號(特指主裝置號)的主要作用,就是宣告裝置所使用的驅動程式。驅動程式和裝置號是一一對應的,當你開啟乙個裝置檔案時,作業系統就已經知道這個裝置所對應的驅動程式是哪乙個了。
當你執行indmod命令時,這個函式可以完成三件大事:
第一,申請主裝置號(major),或者指定,或者動態分配;
第二,在核心中註冊裝置的名字("device ");
第三,指定fops方法(&bao_fops)。
其中所指定的fops方法就是我們對裝置進行操作的方法(例如read,write,seek,dir,open,release等),如何實現這些方法,是編寫裝置驅動程式大部分工作量所在。
以下是對write的整個呼叫流程舉例:
1,insmod驅動程式。驅動程式申請裝置名和主裝置號,這些可以在/proc/devieces中獲得。
2,從/proc/devices中獲得主裝置號,並使用mknod命令建立裝置節點檔案。這是通過主裝置號將裝置節點檔案和裝置驅動程式聯絡在一起。裝置節點檔案中的file屬性中指明了驅動程式中fops方法實現的函式指標。
3,使用者程式使用open開啟裝置節點檔案,這時作業系統核心知道該驅動程式工作了,就呼叫fops方法中的open函式進行相應的工作。open方法一般返回的是檔案標示符,實際上並不是直接對它進行操作的,而是有作業系統的系統呼叫在背後工作。
4,當使用者使用write函式操作裝置檔案時,作業系統呼叫sys_write函 數,該函式首先通過檔案標示符得到裝置節點檔案對應的inode指標和flip指標。inode指標中有裝置號資訊,能夠告訴作業系統應該使用哪乙個裝置 驅動程式,flip指標中有fops資訊,可以告訴作業系統相應的fops方法函式在那裡可以找到。
5,然後這時sys_write才會呼叫驅動程式中的write方法來對裝置進行寫的操作。
其中1-3都是在使用者空間進行的,4-5是在核心空間進行的。使用者的write函式和作業系統的write函式通過系統呼叫sys_write聯絡在了一起。
從以上可以看到使用者所使用的函式怎麼在驅動中得以實現。
驅動介面函式呼叫過程
首先我們來反彙編讀驅動的程式 跳轉到 libc read 發現他把 r7賦值給3,3是傳過去的引數,然後呼叫 svc指令,進入核心態相應的入口 接下來就已經進入核心態,入口函式中將存入r7中的3 取出。然後載入一張表,表名是sys call call,根據這個表中內容,斷定 3到底是對應什麼操作 這...
字元裝置驅動Open呼叫過程
使用open函式開啟裝置檔案,到底做了些什麼工作?下圖中列出了open函式執行的大致過程。裝置檔案通常在開機啟動時自動建立的,不過,我們仍然可以使用命令mknod來建立乙個新的裝置檔案,命令的基本語法如下 mknod裝置名 裝置型別 主裝置號 次裝置號 當我們使用上述命令,建立了乙個字元裝置檔案時,...
probe呼叫過程
這幾天搞ti的vpfe,裡面裝置的註冊使用platform,平台裝置註冊方式來註冊的。一直都知道 cpp view plain copy print 112 struct device driver 裡的probe函式,但是不知道是何時被呼叫的。經過跟蹤 在module init vpfe init...