本文就來揭祕一下到底一個驅動的接口函數是如何被調用的:
首先我們來反彙編讀驅動的程序:
跳轉到__libc_read,發現他把r7賦值給3,3是傳過去的參數,然後調用svc指令,進入內核態相應的入口:
接下來就已經進入內核態,入口函數中將存入r7中的3取出。
然後加載一張表,表名是sys_call_call,根據這個表中內容,斷定3到底是對應什麼操作:
這個表如下,可以看出表中第三項對應CALL(sys_read),也就是說傳進的參數3代表要執行sys_read:
Sys_read對應函數實現如下圖:
其中的vfs_read實現如下圖,他獲取了要讀的那個文件的file對象,然後調用file->f_op->read,這正是我們寫驅動的時候編寫的接口函數: