最近在 driver 里面实现一个新的功能时,发现平台 APP 部分出现一些异常状况,界面显示异常,wifi 相关的应用不停的打印 error 信息,讲道理我实现的新功能只是在系统启动的时候启用,怎么会影响到 user space 部分。相关 log 信息如下:
vmap allocation for size xxx failed: use vmalloc=<size> to increase size.
vmalloc: allocation failure: xxx bytes
insmod: page allocation failure: order:0, mode:0xd0
CPU: 3 PID: 851 Comm: insmod Tainted: P
...
...
insmod: error inserting 'xxx/xxx.ko': -l Cannot allocate memory
...
不提解决过程,直接讲原因和解法。
原因:
目前系统的 driver 都编译成 .ko 文件来 insmod,因为实现的功能里面需要读取大量的数据,导致编译出来的 .ko 增加了近 2MB,原先加载所有的 .ko 大概需要 12.5 MB,现在变成 14.5 MB, modules 这块虚拟内存大小为 14 MB,默认为 16 MB,但是有 2 MB用来做 pkmap了,因此空间不够,wifi 模块挂载失败,可能还踩到 userspace。
解法:
在 memory.h 里面修改 MODULES_VADDR ,使得 modules 空间增加 2 M,问题解决。
内存管理部分的知识参考如下链接:
https://blog.csdn.net/hongzg1982/article/details/54880539