当我使用kmalloc()从我的内核模块保留内存时,我得到一个以0xffff(ffff9cf010feb000)开头的地址。 但该模块从0xffffffff(ffffffffc01a6000)开始。
我试图在新的保留虚拟内存地址中重新定位模块中的代码(ffffffffc01a6000)。 但我无法重新定位呼叫抵消,因为32位偏移量不足以从新区域(ffff9cf010feb000)引用到内核函数(0xffffffff ....)。
如何保留内存以便能够从新的虚拟地址进行呼叫? 或者我如何从新的虚拟地址呼叫到另一个虚拟地址?
触摸编译器的ASM代码将是一个艰难的方法。 并制作一些移动地址,rax;使用某些宏/函数调用* rax技巧可能是一个解决方案,但我不知道它是如何完成的。
谢谢!
答案 0 :(得分:1)
我在linux-source / arch / x86 / kernel / module.c中找到了一种方法:
void *module_alloc(unsigned long size)
{
void *p;
if (PAGE_ALIGN(size) > MODULES_LEN)
return NULL;
p = __vmalloc_node_range(size, MODULE_ALIGN,
MODULES_VADDR + get_module_load_offset(),
MODULES_END, GFP_KERNEL,
PAGE_KERNEL_EXEC, 0, NUMA_NO_NODE,
__builtin_return_address(0));
if (p && (kasan_module_alloc(p, size) < 0)) {
vfree(p);
return NULL;
}
return p;
}