无法将内核提供的功能链接到我的用户定义的内核模块

时间:2018-07-10 13:45:06

标签: linux-kernel kernel-module

我正在编写一个与页表项一起使用的内核模块,以便实施新的页替换策略。我想获取特定进程拥有的页表条目的列表。到目前为止,我已经检索到vma结构的链表,该链表基本上包含有关进程拥有的页面的信息。有一个名为walk_page_vma的函数,它使用指向vma的指针并返回页表,该函数已在mm/pagewalk.c中定义,并在linux/mm.h中声明。因此,我在代码中包含了linux/mm.h

    process_pid = -1;
    struct task_struct* task_list;
    size_t process_counter = 0;
    for_each_process(task_list) {
        if (strcmp(task_list->comm, process_name) == 0){
            process_pid = task_list->pid;

            pr_info("found %s pid = %d \n", process_name, process_pid);
            struct vm_area_struct *mmap = task_list->mm->mmap;
            while(mmap != NULL){
                struct mm_walk walk;
                int res = walk_page_vma(mmap, &walk);
                if (res == 0) {
                    printk("walked successfully\n");
                } else {
                    printk("failed to walk!\n");
                }
                mmap = mmap->vm_next;
            }
            // break;
        }
            // pr_info("== %s [%d]\n", task_list->comm, task_list->pid);
            ++process_counter;
    }

    if (process_pid){
       // pr_info("found %s pid = %d \n", process_name, process_pid);
    } else {
        pr_info("couldn't find %s pid. exiting! \n", process_name);
    }
    // printk(KERN_INFO "== Number of process: %zu\n", process_counter);

在建筑时,它会发出警告说

WARNING: "walk_page_vma" [/home/myusername/Projects/ProjectModule/my_module.ko] undefined!

,并且在调用insmode时无法加载。

1 个答案:

答案 0 :(得分:1)

walk_page_vma不会导出,因此不能在可动态加载的模块中使用。 您必须通过修补内核来进行export修补程序(请注意,上游开发人员将拒绝此类更改)或将代码编译为“内置”。