[代码实例][Linux内核][模块]helloworld程序

源文件


/*
 * hello.c
 */
#include <linux/init.h>
#include <linux/module.h>

static int hello_init(void)
{
    printk(KERN_ALERT "hello, world\n");
    return 0;
}

static void hello_exit(void)
{
    printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("Dual BSD/GPL");

Makefile文件


ifneq ($(KERNELRELEASE),)
    obj-m := hello.o
else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)
default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
### 创建和调试 Linux 内核模块 `hello` 示例 #### 编写内核模块代码 以下是创建一个简单的名为 `hello` 的内核模块示例代码: ```c // 文件名: hello.c #include <linux/module.h> /* 所有模块都需要 */ #include <linux/kernel.h> /* KERN_INFO 宏定义 */ #include <linux/init.h> /* module_init 和 module_exit 声明 */ static int __init hello_init(void) { printk(KERN_INFO "Hello, world!\n"); return 0; // 非零返回表示初始化失败,模块无法加载 } static void __exit hello_exit(void) { printk(KERN_INFO "Goodbye, world!\n"); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL"); // 设置许可证为 GPL 或其他许可类型 MODULE_AUTHOR("Your Name"); // 模块作者 MODULE_DESCRIPTION("A simple Hello World kernel module."); // 描述 MODULE_VERSION("1.0"); // 版本号 ``` 此代码实现了一个基本功能,在模块加载时打印 “Hello, world!”,在卸载时打印 “Goodbye, world!” --- #### 编译内核模块 为了编译上述模块,需要提供一个 Makefile 文件。以下是一个适用于大多数系统的简单 Makefile: ```makefile # Makefile obj-m += hello.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) all: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: rm -rf *.o *.ko *.mod.* .*.cmd *.order *.symvers ``` 执行以下命令即可完成编译过程: ```bash make ``` 成功编译后会生成一个名为 `hello.ko` 的文件。 --- #### 加载内核模块 使用以下命令将模块加载到当前运行中的内核中: ```bash sudo insmod ./hello.ko ``` 这一步骤基于引用的内容[^1],其中指定了加载路径以及方法。 可以通过查看 `/var/log/syslog` 或者直接读取内核日志来验证消息是否被正确记录: ```bash dmesg | tail ``` --- #### 卸载内核模块 当不再需要该模块时,可以将其从内存中移除: ```bash sudo rmmod hello ``` 随后再次检查内核日志确认退出信息已记录: ```bash dmesg | tail ``` 这一操作遵循了标准流程[^3],即通过 `rmmod` 工具安全地卸载指定模块。 --- #### 调试内核模块 对于更复杂的场景,可能需要用到 GDB 进行调试。具体步骤如下: 1. **启用调试支持**:确保内核配置启用了调试选项(如 CONFIG_DEBUG_KERNEL)。 2. **设置断点并启动调试器**:利用 QEMU 或虚拟机环境配合 GDB 对目标模块进行深入分析。 例如,如果希望附加到正在运行的内核上,则需先获取其 PID 并连接至远程调试端口。 --- ### 总结 以上介绍了如何构建、部署及维护一个基础版的 Linux 内核模块实例——`hello`。整个过程中涉及到了源码撰写、Makefile 构建脚本设计、实际安装测试环节等多个方面[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值