Linux 编译与加载
Linux 内核模块是一种可以动态加载和卸载的代码片段,用于扩展内核功能或添加新的设备驱动程序,编译和加载这些模块是实现定制化功能的关键步骤。
(图片来源网络,侵删)
编译生成模块
方法一:在任意目录下编译模块(推荐)
步骤 | 描述 |
步骤一 | 进入任意一个文件夹,将驱动代码放入该目录,helloworld.c。 |
步骤二 | 创建 Makefile,文件内容如下:obj-m += helloworld.o |
步骤三 | 运行 make 命令以生成模块文件 helloworld.ko。 |
方法二:在内核树目录下编译模块
步骤 | 描述 |
步骤一 | 进入内核树所在目录,如/lib/modules/5.11.22/build 。 |
步骤二 | 编辑 Makefile,在末尾添加:obj-$(CONFIG_HELLO_WORLD) += helloworld.o 。 |
步骤三 | 编辑 Kconfig 文件,在文末 endmenu 之前添加:config HELLO_WORLD 。 |
步骤四 | 生成 .config 文件:cd ../.. ,然后在 Device Drivers -> Character drivers 下找到并选择 HELLO_WORLD。 |
步骤五 | 开始 make:make ,成功后会在相应目录下生成 helloworld.ko 文件。 |
模块的加载和使用
步骤 | 描述 |
步骤一 | 插入模块:使用insmod helloworld.ko 命令加载模块。 |
步骤二 | 查询模块的主编号:lsmod 命令查看已加载模块。 |
步骤三 | 创建系统节点:mknod /dev/helloworld c 0 。 |
使用实例
#include <linux/module.h> #include <linux/init.h> static int __init hello_init(void) { printk("Hello, I'm ready! "); return 0; } static void __exit hello_exit(void) { printk("I'll be leaving, bye! "); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL");
ifneq ($(KERNELRELEASE),) obj-m := hello.o else KDIR := /lib/modules/$(shell uname -r)/build all: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions endif
通过上述步骤和方法,可以在 Linux 系统中成功编译和加载内核模块,从而实现对系统的扩展和定制。
以上就是关于“linux 编译与加载”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!
(图片来源网络,侵删)
本文来源于互联网,如若侵权,请联系管理员删除,本文链接:https://www.9969.net/78819.html