kmalloc失败,尽管lowfree大约是523MB

时间:2014-12-11 09:13:06

标签: c linux kernel

我目前正在开发一个嵌入式开发板 我已经将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中失败?

1 个答案:

答案 0 :(得分:4)

kmalloc()函数返回物理上连续的内存,它几乎是连续的。

分配物理上连续的内存有一个缺点:由于碎片,通常很难找到物理上连续的内存块,尤其是对于大型分配。

分配几乎连续的内存具有更大的成功机会。如果您不需要物理上连续的内存,请使用vmalloc()

看看这个例子,其中kmalloc在~4MB时失败了。 Kmalloc fails ~4MB

有关详细信息,请参阅:KMALLOC size allocation