2

我正在尝试实现一个内核模块,它可以访问用户进程的 task_struct,其进程 ID 对我来说是已知的。我正在使用find_get_pidpid_task获取流程的task_struct:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/pid.h>
#include <linux/pid_namespace.h>

int init_module( void )
{
//Declaring the variables
    int p_id = 6980;    //6980 is the process ID of my user process
    struct pid *pid_struct;
    struct task_struct *task;

// Trying to access the variables of the p_id
    pid_struct = find_get_pid(p_id);
    task = pid_task(pid_struct, PIDTYPE_PID);

//Printing the info from the task_struct
    printk( KERN_INFO "*** [%d]\n",task->pid);
    return 0;
}

void cleanup_module( void )
{
  return;
}

它正在成功编译,我得到 *.ko 文件,但是当我试图将它插入内核时,它给了我一个错误:
insmod: error inserting 'main.ko': -1 Unknown symbol in module
Dmesg 给我以下输出:
main: Unknown symbol find_get_pid (err 0)
我不知道如何继续,它会如果有人可以帮助我,将不胜感激。

4

2 回答 2

2

仔细检查您要使用的函数被调用。

还要记住,大部分“核心内核”(可能包括frob_task_by_pid_hard及其同类)都是 GPL 专用的,所以除非您将模块的许可证声明为 GPL,否则您将无处可去。也请填写模块上的其他样板数据:至少 MODULE_AUTHOR、MODULE_DESCRIPTION、MODULE_LICENSE。

于 2013-04-05T20:01:12.287 回答
1

加载内核模块时可能还有另一个失败的原因,例如它显示错误为“insmod :ERROR: .ko operation not allowed”。您的内核正在使用最新 PC 上的安全启动选项启动,必须​​禁用该选项以避免加载/插入内核模块失败。这可以通过使用以下命令来完成。 sudo apt install mokutil sudo mokutil --disable-validation 或者您可以搜索如何为您的特定操作系统禁用安全启动选项。

于 2019-09-30T06:21:58.373 回答