您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Ubuntu编译内核模块和系统日志示例分析
## 引言
在Linux系统开发与调试过程中,内核模块的编译和日志分析是开发者必须掌握的核心技能。本文将以Ubuntu系统为例,详细演示如何编译内核模块,并通过实际案例展示如何解读系统日志(特别是`dmesg`和`/var/log/syslog`中的相关内容)。
---
## 一、环境准备
### 1.1 系统要求
- Ubuntu 20.04/22.04 LTS(其他版本需调整部分命令)
- 已安装`build-essential`和内核头文件
- 根权限或sudo权限
### 1.2 安装必要工具
```bash
sudo apt update
sudo apt install build-essential linux-headers-$(uname -r)
创建文件hello_kernel.c
:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("YourName");
static int __init hello_init(void) {
printk(KERN_INFO "Hello Kernel Module: Initialized\n");
return 0;
}
static void __exit hello_exit(void) {
printk(KERN_INFO "Hello Kernel Module: Removed\n");
}
module_init(hello_init);
module_exit(hello_exit);
obj-m := hello_kernel.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
make
成功后会生成hello_kernel.ko
文件。
sudo insmod hello_kernel.ko
lsmod | grep hello_kernel
sudo rmmod hello_kernel
dmesg | tail -n 5
示例输出:
[ 1234.567890] Hello Kernel Module: Initialized
[ 1235.678901] Hello Kernel Module: Removed
grep "Hello Kernel" /var/log/syslog
典型输出:
Jun 10 14:25:01 ubuntu kernel: [ 1234.567890] Hello Kernel Module: Initialized
Jun 10 14:25:02 ubuntu kernel: [ 1235.678901] Hello Kernel Module: Removed
创建字符设备驱动模块char_dev.c
:
#include <linux/fs.h>
#include <linux/uaccess.h>
static int major_num;
static char msg[256] = {0};
static int dev_open(struct inode *inodep, struct file *filep) {
printk(KERN_INFO "Char device opened\n");
return 0;
}
// 其他必要函数(release, read, write等)
static struct file_operations fops = {
.open = dev_open,
// 其他操作...
};
sudo mknod /dev/char_dev c 250 0
dmesg | grep "Char device"
输出示例:
[ 2345.678901] Char device opened
错误现象:
insmod: ERROR: could not insert module: Invalid module format
解决方案:
make clean
make
如果日志未出现在/var/log/syslog
中,可能是打印级别过低:
printk(KERN_ALERT "This will always appear\n");
通过dmesg -n LEVEL
调整控制台日志级别:
sudo dmesg -n 7 # 7=DEBUG级别
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/dynamic_debug.h>
dynamic_pr_debug("Debug message with value %d\n", var);
journalctl -k --since "1 hour ago" | grep module_name
printk
高频输出rate-limited
打印:
printk_ratelimited(KERN_INFO "Rate-limited message\n");
通过本文的实践,读者可以掌握: 1. 内核模块的编译加载全流程 2. 系统日志的核心分析方法 3. 常见问题的解决思路
建议进一步通过strace
和perf
工具进行深度调试分析。
附录:完整代码示例和调试工具速查表见GitHub仓库 “`
注:实际运行时需注意: 1. 内核版本差异可能导致部分API变化 2. 生产环境需更完善的错误处理 3. 日志分析时注意时间戳同步问题
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。