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