瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工藝,搭載一顆四核Cortex-A55處理器和Mali G52 2EE 圖形處理器。RK3568 支持4K 解碼和 1080P 編碼,支持SATA/PCIE/USB3.0 外圍接口。RK3568內置獨立NPU,可用于輕量級人工智能應用。RK3568 支持安卓 11 和 linux 系統,主要面向物聯網網關、NVR 存儲、工控平板、工業檢測、工控盒、卡拉 OK、云終端、車載中控等行業。
迅為RK3568開發板:
?
進階5 自定義實現insmod命令實驗
5.1 實驗程序的編寫
在本章節將會實現第二種方法實現insmod命令。
5.1.1 驅動程序編寫
本實驗對應的網盤路徑為:iTOP-RK3568開發板【底板V1.7版本】\03_【iTOP-RK3568開發板】指南教程\02_Linux驅動配套資料\04_Linux驅動例程\52_module02\01_module。
編寫完成的helloworld.c代碼如下所示。
#include
#include
static int __init helloworld_init(void) //驅動入口函數
{
dump_stack();
return 0;
}
static void __exit helloworld_exit(void) //驅動出口函數
{
printk(KERN_EMERG "helloworld_exit\r\n");
}
module_init(helloworld_init); //注冊入口函數
module_exit(helloworld_exit); //注冊出口函數
MODULE_LICENSE("GPL v2"); //同意 GPL 開源協議
MODULE_AUTHOR("topeet"); //作者信息
該驅動程序就是最簡單的helloworld驅動程序,只是在第6行添加了dump_stack()函數,用來在內核中輸出當前調用堆棧信息,在這里使用該函數的目的是驗證在app中的init_module系統調用是否生效。
5.1.2 編寫測試 APP
本應用程序對應的網盤路徑為:iTOP-RK3568開發板【底板V1.7版本】\03_【iTOP-RK3568開發板】指南教程\02_Linux驅動配套資料\04_Linux驅動例程\52_module02\02_app。
編寫完成的應用程序app.c代碼如下所示:
#include
#include
#include
#include
#include
#include
#include
#define init_module(mod, len, opts) syscall(__NR_init_module, mod, len, opts)
int main(int argc, char **argv)
{
int fd; // 文件描述符
int ret; // 返回值
struct stat statbuf; // 存儲文件信息的結構體
size_t image_size; // 文件大小
char *image; // 文件內容緩沖區
fd = open(argv[1], O_RDONLY | __O_CLOEXEC); // 以只讀方式打開文件
if (fd < 0)
{
printf("open error \n"); // 打開文件失敗
return -1;
}
fstat(fd, &statbuf); // 獲取文件信息
image_size = statbuf.st_size; // 獲取文件大小
image = malloc(image_size); // 為文件內容分配內存空間
read(fd, image, image_size); // 讀取文件內容到緩沖區
ret = init_module(image, image_size, ""); // 調用系統調用初始化內核模塊
if (ret < 0)
{
printf("error \n"); // 內核模塊初始化失敗
}
else
{
printf("ok \n"); // 內核模塊初始化成功
}
free(image); // 釋放內存空間
return ret; // 返回結果
}
該應用程序的重點在30行,使用init_module系統調用加載模塊到內核。
5.2運行測試
5.2.1 編譯驅動程序
在上一小節中的helloworld.c代碼同一目錄下創建 Makefile 文件,Makefile 文件內容如下所示:
export ARCH=arm64#設置平臺架構
export CROSS_COMPILE=aarch64-linux-gnu-#交叉編譯器前綴
obj-m += helloworld.o #此處要和你的驅動源文件同名
KDIR :=/home/topeet/Linux/linux_sdk/kernel #這里是你的內核目錄
PWD ?= $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules #make操作
clean:
make -C $(KDIR) M=$(PWD) clean #make clean操作
對于Makefile的內容注釋已在上圖添加,保存退出之后,來到存放helloworld.c和Makefile文件目錄下,如下圖(圖5-1)所示:
然后使用命令“make”進行驅動的編譯,編譯完成:
編譯完生成platform_led.ko目標文件:
至此驅動模塊就編譯成功了。
5.2.2 編譯應用程序
下面進行應用程序編譯,因為測試APP是要在開發板上運行的,所以需要aarch64-linux-gnu-gcc來編譯,輸入以下命令,編譯完成以后會生成一個app的可執行程序,如下圖(圖141-4)所示:
aarch64-linux-gnu-gcc myinsmod.c
下面進行驅動程序的測試。
5.2.3運行測試
本次測試要使用上面編譯的helloworld.ko驅動文件和a.out可執行文件,所以需要先將兩個要用到的文件拷貝到開發板上。
開發板啟動之后,使用以下命令加載helloworld.ko驅動,如下圖所示:
./a.out helloworld.ko
dump_stack函數會打印調用的一系列函數,這些函數的具體調用已經在進階第一章講解過了,這里的重點為紅色框中的倒數第二行,調用了init_module函數加載了helloworld驅動。
然后繼續使用以下命令查看驅動的加載情況,打印如下圖(141-6)所示:
lsmod
可以看到helloworld驅動成功加載上了,最后可以使用以下命令進行驅動的卸載,
rmmod
至此,內核是如何運行KO文件的_insmod實驗就完成了。
-
處理器
+關注
關注
68文章
19259瀏覽量
229652 -
芯片
+關注
關注
455文章
50714瀏覽量
423139 -
驅動
+關注
關注
12文章
1838瀏覽量
85262 -
RK3568
+關注
關注
4文章
514瀏覽量
5034
發布評論請先 登錄
相關推薦
評論