內(nèi)核模塊
Linux內(nèi)核模塊是一種可以動(dòng)態(tài)加載和卸載的軟件組件,用于擴(kuò)展Linux操作系統(tǒng)的功能。Linux內(nèi)核本身只包含了必要的核心功能,而內(nèi)核模塊則允許開發(fā)者在運(yùn)行時(shí)向內(nèi)核添加新的功能、驅(qū)動(dòng)程序或文件系統(tǒng)支持,而無需重新編譯整個(gè)內(nèi)核或重新啟動(dòng)系統(tǒng)。
內(nèi)核模塊是一段獨(dú)立的代碼,可以被編譯為共享目標(biāo)文件,并且遵循Linux內(nèi)核的特定接口和標(biāo)準(zhǔn)。它們可以通過加載器(如insmod或modprobe)動(dòng)態(tài)地插入到內(nèi)核中,并通過卸載器(如rmmod)從內(nèi)核中移除。一旦加載到內(nèi)核中,模塊可以訪問和修改內(nèi)核的數(shù)據(jù)結(jié)構(gòu)、函數(shù)和服務(wù),以提供額外的功能或驅(qū)動(dòng)支持。
內(nèi)核模塊在許多方面都非常有用。它們使得開發(fā)者可以通過加載適當(dāng)?shù)哪K來添加硬件設(shè)備的支持,如網(wǎng)卡、聲卡等。此外,內(nèi)核模塊還可以添加新的文件系統(tǒng)支持,以便訪問特定的文件系統(tǒng)類型。開發(fā)者還可以使用內(nèi)核模塊擴(kuò)展內(nèi)核的功能,添加新的系統(tǒng)調(diào)用、網(wǎng)絡(luò)協(xié)議或安全功能等。
使用內(nèi)核模塊的好處是可以減小內(nèi)核的大小,并允許系統(tǒng)僅加載需要的模塊,從而提高系統(tǒng)的性能和靈活性。內(nèi)核模塊也可以動(dòng)態(tài)加載和卸載,使得系統(tǒng)可以根據(jù)需要?jiǎng)討B(tài)地添加或刪除功能,而無需重新啟動(dòng)。
NFS掛載
bootargs啟動(dòng)參數(shù)設(shè)置
-
root=/dev/nfs #指定rootfs所在的設(shè)備是NFS,也就是從NFS啟動(dòng)
-
nfsroot=192.168.9.119:/nfs/rootfs #指定nfs rootfs的位置 (是在ip 是192.168.9.119的機(jī)器上 的/nfs/rootfs目錄下).
? 注意/nfs/rootfs必須和前面NFS服務(wù)配置文件設(shè)置一致(見環(huán)境安裝)
-
v3 #ubuntu 20.04,nfs版本的問題需在bootargs 里加v3
-
console=ttyS0,115200 #指定內(nèi)核啟動(dòng)后串口信息從串口0輸出,波特率115200
-
init=/linuxrc #指定第一個(gè)應(yīng)用程序
-
ip=192.168.9.9 #需設(shè)置為板子u-boot自己的IP(通過pri ipaddr查看)
-
ext4load mmc 1:1 0x84000000 /boot/Image //讀ext 文件系統(tǒng)中的 /boot/Image 到內(nèi)存 0x84000000
? //這個(gè)鏡像是燒錄在TF卡上的官方鏡像
? //fstype mmc 1:1 //查看emmc設(shè)備(flash) 1號(hào)設(shè)備的1號(hào)分區(qū)
-
ext4load mmc 1:1 83100000 /boot/tegra210-p3448-0002-p3449-0000-b00.dtb //和上面一個(gè)道理
-
booti 0x84000000 - 83100000 /*啟動(dòng)Image格式的內(nèi)核 booti,
引導(dǎo)ARM64 kernel image----Image; bootz,
引導(dǎo)ARM kernel image----zImage; bootm,
引導(dǎo)u-boot自定義的kernel image----uImage。文章來源:http://www.zghlxwxcb.cn/news/detail-462377.html
# setenv bootargs root=/dev/nfs rw nfsroot=192.168.9.119:/nfs/rootfs,v3 console=ttyS0,115200 init=/linuxrc ip=192.168.9.9
# setenv nfsboot ext4load mmc 1:1 0x84000000 /boot/Image \; ext4load mmc 1:1 83100000 /boot/tegra210-p3448-0002-p3449-0000-b00.dtb \; booti 0x84000000 - 83100000
# pri bootcmd /*備份原來的,方便恢復(fù)
bootcmd=run distro_bootcmd
*/
# set bootcmd run nfsboot
# saveenv
# run nfsboot //能nfs掛載成功
內(nèi)核三要素
- module_init(led_init); //模塊加載入口聲明
- module_exit(led_exit); //模塊卸載入口聲明
- MODULE_LICENSE(“GPL”); //模塊免費(fèi)開源聲明
//led.c
#include <linux/kernel.h>
#include <linux/module.h>
static int led_init(void)
{
printk("led init yhai 1\n");
return 0;
}
static void led_exit(void)
{
printk("led exit\n");
}
module_init(led_init); //模塊加載入口聲明
module_exit(led_exit); //模塊卸載入口聲明
MODULE_LICENSE("GPL"); //模塊免費(fèi)開源聲明
MODULE_AUTHOR("bbcen"); //模塊作者聲明(可選)
Makefile
- KERNELDIR ?= ~/linux 第二行這里的目錄要選一個(gè)已經(jīng)編譯過的內(nèi)核目錄
- obj-m := led.o 這里的.o文件名要和.c的文件名一樣
//Makefile
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= ~/linux
PWD := $(shell pwd)
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules* a.out
else
obj-m := led.o
endif
驗(yàn)證測(cè)試
SourceInsight編輯代碼,cp到nfs目錄編譯生成ko文件插入內(nèi)核文章來源地址http://www.zghlxwxcb.cn/news/detail-462377.html
- make的時(shí)候不要在共享文件夾,會(huì)報(bào)錯(cuò),可以直接復(fù)制到nfs共享目錄下編譯
$ make //編譯生成 模塊文件 led.ko
$ file led.ko //查看一下格式,看編譯的是 電腦的, 還是板子的(ARM)
# insmod led.ko /*加載模塊
提示: loading out-of-tree module taints kernel -> 提示內(nèi)核污染,出問題時(shí)你自己驅(qū)動(dòng)的問題,不是內(nèi)核的問題。方便內(nèi)核開放者排查
可添加 MODULE_INFO(intree, "Y"); 去除提示,但最好別這樣做
*/
# lsmod /*查看已加載模塊列表 -> 檢測(cè)是否已加載
等效于 cat /proc/modules
*/
# rmmod led //卸載模塊
# dmesg //查看內(nèi)核日志
到了這里,關(guān)于【嵌入式Linux內(nèi)核驅(qū)動(dòng)】?jī)?nèi)核模塊三要素與驗(yàn)證測(cè)試的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!