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