Linux ko内存

insmod插入ko时,提升申请内存失败。这是因为MODULES的空间分配不够大。Linux有一个专门的内核模块映射空间,是专门给ko插入时用的。地址范围是MODULES_VADDR~MODULES_END-1

然而MODULES_VADDR是可以配置的,该宏定位的位置为内核代码下的arch/arm/include/asm/memory.h,不同内核路径可能不一样。MODULES_VADDR定义的是:

#define MODULES_VADDR          (PAGE_OFFSET - SZ_16M)

一开始的时候,我直接修改为

#define MODULES_VADDR          (PAGE_OFFSET - SZ_32M)

编译后运行,发现有错误。具体错误未深入研究。后面修改为

#define MODULES_VADDR          (PAGE_OFFSET - SZ_16M - 8*1024*1024)

相当于在原来的基础上面,增加了8M的空间,然后ko正常加载。当然,如果ko越来越多,越来越大的话,估计还是不够。

基于上面的修改,还需修改同文件下的TASK_SIZE,原本是:

#define TASK_SIZE              (UL(CONFIG_PAGE_OFFSET) - UL(SZ_16M))

修改为:

#define TASK_SIZE              (UL(CONFIG_PAGE_OFFSET) - UL(SZ_16M) - 8*1024*1024)

不然编译直接报错。

在汇编语言中,直接访问Linux物理内存可以通过"特权级"实现。特权级可以理解为权限级别,越高的特权级别可以访问更多的硬件资源,包括物理内存。 首先,我们需要编写一个内核模块来获取linux物理内存的基址。内核模块是在操作系统内核中加载和运行的代码。内核模块可以使用特权级别访问物理内存。 假设我们定义了一个内核模块,并命名为"phys_mem_mod"。我们可以在模块中使用以下代码来获取物理内存的基址: ``` #include <linux/module.h> #include <linux/kernel.h> void* base_addr; int init_module(void) { base_addr = phys_to_virt(0); //通过物理地址0获取基址 printk(KERN_INFO "Physical memory base address: %p\n", base_addr); return 0; } void cleanup_module(void) { printk("Unloading phys_mem_mod module.\n"); } MODULE_LICENSE("GPL"); ``` 在代码中,我们使用了phys_to_virt()函数将物理内存地址0转换为虚拟地址,并将其存储在base_addr变量中。通过打印base_addr变量,我们可以得到物理内存的基址。 在编写完内核模块代码后,将其编译为ko文件并加载到Linux内核中。加载后,内核模块将输出物理内存的基址。 此外,为了直接访问物理内存,我们还需要在内核模块中使用特殊的指令来读取或写入特定的物理内存地址。具体的操作将根据实际需求而定,并需要注意特权级别的限制。 总之,通过编写内核模块并使用特权级别,我们可以实现在汇编语言中直接访问Linux物理内存。请记住,在进行这样的操作时,需要仔细考虑安全性和操作系统的稳定性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值