瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工藝,搭載一顆四核Cortex-A55處理器和Mali G52 2EE 圖形處理器。RK3568 支持4K 解碼和 1080P 編碼,支持SATA/PCIE/USB3.0 外圍接口。RK3568內置獨立NPU,可用于輕量級人工智能應用。RK3568 支持安卓 11 和 linux 系統,主要面向物聯網網關、NVR 存儲、工控平板、工業檢測、工控盒、卡拉 OK、云終端、車載中控等行業。
?
【公眾號】迅為電子
【粉絲群】824412014(加群獲取驅動文檔+例程)
【視頻觀看】嵌入式學習之Linux驅動(驅動基礎進階篇_全新升級)_基于RK3568
【購買鏈接】迅為RK3568開發板瑞芯微Linux安卓鴻蒙ARM核心板人工智能AI主板
進階8 內核運行ko文件總結
8.1 內核運行ko流程分析
當我們使用系統調用時,內核會執行SYSCALL_DEFINE3宏定義的函數,如
SYSCALL_DEFINE3(finit_module, int, fd, const char __user *, uargs, int, flags)或SYSCALL_DEFINE3(init_module, void __user *, umod, unsigned long, len, const char __user *, uargs)。這些函數最終都會調用load_module函數,而在load_module函數中,會通過do_one_initcall(mod->init)來執行驅動程序的入口函數。
do_one_initcall函數的作用是執行一個初始化調用函數,并檢查執行過程中是否存在搶占不平衡或中斷被禁用的情況。如果存在錯誤信息,會打印警告信息。最后,返回初始化調用函數的返回值。這個函數通常在內核初始化過程中使用,用于執行各個模塊的初始化函數。
為什么mod->init就是驅動的入口函數呢?
打開include/linux/module.h文件,找到以下代碼,如下圖所示:
圖8-1
上述代碼是用于定義模塊的初始化函數和清理函數的宏定義。通過使用module_init宏和module_exit宏,開發人員可以指定模塊的入口函數和清理函數。這些宏定義了一些內聯函數和與之關聯的特殊命名的函數,以及一些屬性和別名,用于在編譯時進行檢查并將用戶定義的函數與特定的模塊函數關聯起來。
在上圖的代碼中,int init_module(void) __copy(initfn) __attribute__((alias(#initfn)));:定義一個名為init_module的函數,用于作為模塊的入口函數。__copy(initfn)表示復制用戶定義的初始化函數,__attribute__((alias(#initfn)))表示將init_module函數與用戶定義的初始化函數initfn關聯起來。將init_module作為函數initfn的別名。init_module是驅動加載函數的統一別名,當我們編譯ko文件的時候,會生成一個.mod.c 的文件。
8.2 內核加載ko文件總結
本篇內容講解的知識點比較零散,為了更好的總結學習,我們畫了以下流程圖。
圖 8-2
總結一下,要加載內核模塊,通常需要使用insmod命令或類似工具觸發系統調用,然后在內核中執行相應的系統調用函數(如sys_finit_module或sys_init_module)來加載模塊。在加載過程中,會調用load_module函數,進而執行模塊的初始化函數。這些過程構成了加載內核模塊的流程。
-
內核
+關注
關注
3文章
1372瀏覽量
40276 -
驅動
+關注
關注
12文章
1838瀏覽量
85262 -
RK3568
+關注
關注
4文章
514瀏覽量
5034
發布評論請先 登錄
相關推薦
評論