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

C 如何在内核模块的相同偏移量中保留内存,c,linux,memory,linux-kernel,C,Linux,Memory,Linux Kernel,当我使用kmalloc()从内核模块中保留内存时,我得到一个以0xffff(ffff9cf010feb000)开头的地址。 但模块从0xFFFFFF(FFFFFFFF C01A6000)开始 我试图将模块(FFFFFFC01A6000)中的代码重新定位到一个新的保留虚拟内存地址中。 但我无法重新定位调用偏移量,因为32位偏移量不足以从新区域(ffff9cf010feb000)引用到内核函数(0xffffffff…) 如何保留内存以便能够从新的虚拟地址调用? 或者如何从新虚拟地址呼叫其他虚拟地址

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

我试图将模块(FFFFFFC01A6000)中的代码重新定位到一个新的保留虚拟内存地址中。 但我无法重新定位调用偏移量,因为32位偏移量不足以从新区域(ffff9cf010feb000)引用到内核函数(0xffffffff…)

如何保留内存以便能够从新的虚拟地址调用? 或者如何从新虚拟地址呼叫其他虚拟地址

触摸编译器的ASM代码将是一种困难的方式。 制作一些mov地址,rax;用一些宏/函数调用*rax技巧可能是一个解决方案,但我不知道具体怎么做


谢谢

我在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;
}
void*模块分配(无符号长尺寸)
{
void*p;
如果(页面对齐(大小)>模块对齐)
返回NULL;
p=_uvmalloc_node_range(大小、模块对齐、,
模块\u VADDR+获取\u模块\u加载\u偏移(),
模块端,GFP内核,
PAGE_KERNEL_EXEC,0,NUMA_NO_节点,
__内置返回地址(0);
if(p&(kasan_模块_alloc(p,size)<0)){
vfree(p);
返回NULL;
}
返回p;
}