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)
不然编译直接报错。