c - 如何在内核模块中使用 do_mmap()
问题描述
我想在内核模块中使用 do_mmap() 。根据这个问题,这应该是可能的。
这是一个最小的非工作示例:
hp_km.c:
#include <linux/module.h>
#include <linux/mm.h>
MODULE_LICENSE("GPL");
static int __init hp_km_init(void) {
do_mmap(0, 0, 0, 0, 0, 0, 0, 0, 0);
return 0;
}
static void __exit hp_km_exit(void) {
}
module_init(hp_km_init);
module_exit(hp_km_exit);
Makefile:
obj-m += hp_km.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
结果WARNING: "do_mmap" [...] undefined!
我需要改变什么hp_km.c
或Makefile
使这项工作?
解决方案
除了重建内核,还可以使用kallsyms_lookup_name来查找符号对应的地址
如下所示:
#include <linux/module.h>
#include <linux/mm.h>
#include <linux/kallsyms.h>
MODULE_LICENSE("GPL");
unsigned long (*orig_do_mmap)(struct file *file, unsigned long addr,
unsigned long len, unsigned long prot,
unsigned long flags, vm_flags_t vm_flags,
unsigned long pgoff, unsigned long *populate,
struct list_head *uf);
static int __init hp_km_init(void)
{
orig_do_mmap = (void*)kallsyms_lookup_name("do_mmap");
if (orig_do_mmap == NULL)
return -EINVAL;
orig_do_mmap(0, 0, 0, 0, 0, 0, 0, 0, 0);
return 0;
}
static void __exit hp_km_exit(void)
{
}
module_init(hp_km_init);
module_exit(hp_km_exit);
推荐阅读
- c# - ASP.NET核心webapi中的Tryvalidatemodel在单元测试中抛出空引用异常
- ios - 如何在 Swift 中使用 Alamofire 时将 JSON 响应存储到缓存中
- unix - shell中的命令在“-”之后获取第二个数值
- web2py - 301将带有斜杠的网址重定向到不带斜杠的网址web2py
- kotlin - 奇怪的 Kotlin 零安全行为
- javascript - Highcharts 在可拖动的折线图上重绘和排序数据
- angular - 如何使用 ng2-file-upload 显示以前上传的文件
- c# - 使用 char[] 属性创建对象的实例
- angular - 如何在角度4中制作多个子组件和路线
- java - 使用 Apache Camel 调用 Rest API