如何在Linux系统中编译和加载程序?

Linux 编译与加载

Linux 内核模块是一种可以动态加载和卸载的代码片段,用于扩展内核功能或添加新的设备驱动程序,编译和加载这些模块是实现定制化功能的关键步骤。

如何在Linux系统中编译和加载程序?插图1
(图片来源网络,侵删)

编译生成模块

方法一:在任意目录下编译模块(推荐)

步骤 描述
步骤一 进入任意一个文件夹,将驱动代码放入该目录,helloworld.c。
步骤二 创建 Makefile,文件内容如下:
obj-m += helloworld.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
步骤三 运行 make 命令以生成模块文件 helloworld.ko。

方法二:在内核树目录下编译模块

步骤 描述
步骤一 进入内核树所在目录,如/lib/modules/5.11.22/build
步骤二 编辑 Makefile,在末尾添加:obj-$(CONFIG_HELLO_WORLD) += helloworld.o
步骤三 编辑 Kconfig 文件,在文末 endmenu 之前添加:config HELLO_WORLD
tristate "HELLO WORLD"
步骤四 生成 .config 文件:
cd ../..
make menuconfig
,然后在 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 编译与加载”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!

如何在Linux系统中编译和加载程序?插图3
(图片来源网络,侵删)

本文来源于互联网,如若侵权,请联系管理员删除,本文链接:https://www.9969.net/78819.html

小末小末
上一篇 2024年10月17日 15:54
下一篇 2024年10月17日 16:04

相关推荐