我正在编写一个与页表项一起使用的内核模块,以便实施新的页替换策略。我想获取特定进程拥有的页表条目的列表。到目前为止,我已经检索到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
时无法加载。
答案 0 :(得分:1)
walk_page_vma
不会导出,因此不能在可动态加载的模块中使用。
您必须通过修补内核来进行export修补程序(请注意,上游开发人员将拒绝此类更改)或将代码编译为“内置”。