我目前正在开发一个嵌入式开发板 我已经将3.0.31内核移植到我的个人补丁上。
当我尝试插入模块时,无法使用 kmalloc()
分配4MB内存。
以下是在开发板上执行的 $ cat /proc/meminfo
命令的输出。
MemTotal: 899252 kB
MemFree: 524136 kB
Buffers: 3540 kB
Cached: 20124 kB
SwapCached: 0 kB
Active: 37308 kB
Inactive: 21008 kB
Active(anon): 34852 kB
Inactive(anon): 160 kB
Active(file): 2456 kB
Inactive(file): 20848 kB
Unevictable: 0 kB
Mlocked: 0 kB
HighTotal: 31744 kB
HighFree: 308 kB
LowTotal: 867508 kB
LowFree: 523828 kB <--------
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 33232 kB
Mapped: 6336 kB
Shmem: 360 kB
Slab: 64652 kB
SReclaimable: 2972 kB
SUnreclaim: 61680 kB
KernelStack: 1528 kB
PageTables: 1884 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 449624 kB
Committed_AS: 532552 kB
VmallocTotal: 122880 kB
VmallocUsed: 38440 kB
VmallocChunk: 70436 kB
根据我的理解,LowFree参数表示内核空间中的空闲内存,在这种情况下约为523MB。
内核空间有很多可用空间,那么为什么模块在4MB的kmalloc中失败?
答案 0 :(得分:4)
kmalloc()函数返回物理上连续的内存,它几乎是连续的。
分配物理上连续的内存有一个缺点:由于碎片,通常很难找到物理上连续的内存块,尤其是对于大型分配。
分配几乎连续的内存具有更大的成功机会。如果您不需要物理上连续的内存,请使用vmalloc()
看看这个例子,其中kmalloc在~4MB时失败了。 Kmalloc fails ~4MB
有关详细信息,请参阅:KMALLOC size allocation