gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:37 25 4
gpt4 key购买 nike

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

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

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

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

谢谢!

最佳答案

我在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;
}

关于c - 如何在内核模块的相同偏移量中预留内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48251504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com