【问题标题】:How to reserve memory in the same offset of the kernel module如何在内核模块的相同偏移量中保留内存
【发布时间】:2018-06-23 09:44:38
【问题描述】:

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

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

如何保留内存以便能够从新的虚拟地址调用? 或者如何从新的虚拟地址调用另一个虚拟地址?

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

谢谢!

【问题讨论】:

    标签: c linux memory linux-kernel


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-28
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 2020-03-16
      • 2010-10-14
      • 1970-01-01
      相关资源
      最近更新 更多