LINUX实验:编写一个内核模块,用于打印进程描述符task_struct中的如下字段:当前系统中每个进程的进程标识号、进程状态、进程的优先级、进程静态优先级、父进程的进程号、进程权限位的默认设置 等

如果你是因为GPT给的代码报错而点进来的,请见文末附录1

实验步骤:

前提条件
  1. 确保你的系统上安装了必要的内核头文件和编译工具:

    sudo apt update
    sudo apt install build-essential linux-headers-$(uname -r)
    
  2. 创建一个目录来存放你的内核模块代码:

    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”,前面有两个下划线

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值