如果你是因为GPT给的代码报错而点进来的,请见文末附录1
实验步骤:
前提条件
-
确保你的系统上安装了必要的内核头文件和编译工具:
sudo apt update sudo apt install build-essential linux-headers-$(uname -r)
-
创建一个目录来存放你的内核模块代码:
mkdir ~/my_kernel_module cd ~/my_kernel_module
编写内核模块代码
创建一个C文件 process_info.c
,并输入以下代码:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/seq_file.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/slab.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A module that prints process information.");
static int process_count = 0;
// Function to print process information
void print_process_info(void) {
struct task_struct *task;
// Iterate over all tasks
for_each_process(task) {
process_count++;
// Print process information
printk(KERN_INFO "PID: %d, State: %ld, Priority: %d, Static Priority: %d, Parent PID: %d, Permissions: %d\n",
task->pid,
task->__state,
task->prio,
task->static_prio,
task->real_parent->pid,
task->cred->uid.val);
}
printk(KERN_INFO "Total number of processes: %d\n", process_count);
}
static int __init process_info_init(void) {
printk(KERN_INFO "Loading Process Info Module...\n");
print_process_info(); // Call function to print process information
return 0; // Return 0 for successful loading
}
static void __exit process_info_exit(void) {
printk(KERN_INFO "Unloading Process Info Module...\n");
}
module_init(process_info_init); // Entry point function
module_exit(process_info_exit); // Exit point function
创建Makefile
在同一目录下创建一个 Makefile
文件,输入以下内容:
obj-m += process_info.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
编译内核模块
在命令行中运行以下命令来编译你的模块:
make
加载内核模块
加载内核模块并检查输出。
sudo insmod process_info.ko
使用 dmesg
命令查看输出信息:
dmesg | tail -n 20
卸载内核模块
在检查输出后,可以卸载模块:
sudo rmmod process_info
再次使用 dmesg
命令确认模块已被卸载。
附录1
请检查访问进程状态代码是否正确。
错误示例:“task->state”
正确示例:“task->__state”,state属性前有两个“_”下划线
许多LLM(GPT4、文心一言、KIMI等)会在这里犯错。
如果还是报错,请查看
“/usr/src/linux-headers-$(uname -r)/include/linux/sched.h”
文件,在当中查找task_struct结构体的定义
上图为ubuntu22.04LTS的定义。可以看到是“__state”,前面有两个下划线