如何在内核模块的相同偏移量中保留内存

时间:2018-01-14 16:09:02

标签: c linux memory linux-kernel

当我使用kmalloc()从我的内核模块保留内存时,我得到一个以0xffff(ffff9cf010feb000)开头的地址。 但该模块从0xffffffff(ffffffffc01a6000)开始。

我试图在新的保留虚拟内存地址中重新定位模块中的代码(ffffffffc01a6000)。 但我无法重新定位呼叫抵消,因为32位偏移量不足以从新区域(ffff9cf010feb000)引用到内核函数(0xffffffff ....)。

如何保留内存以便能够从新的虚拟地址进行呼叫? 或者我如何从新的虚拟地址呼叫到另一个虚拟地址?

触摸编译器的ASM代码将是一个艰难的方法。 并制作一些移动地址,rax;使用某些宏/函数调用* rax技巧可能是一个解决方案,但我不知道它是如何完成的。

谢谢!

1 个答案:

答案 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;
}