我目前正在开发一款嵌入式开发板。
我已经移植了 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 中失败?
最佳答案
kmalloc() 函数返回物理上连续的内存,该内存也是虚拟连续的。
分配物理上连续的内存有一个缺点:由于碎片,通常很难找到物理上连续的内存块,特别是对于大型分配。
分配实际上连续的内存有更大的成功机会。如果不需要物理上连续的内存,请使用vmalloc()
看一下这个示例,其中 kmalloc 在 ~4MB 处失败。 Kmalloc fails ~4MB
更多详情请参阅:KMALLOC size allocation
关于c - 尽管 lowfree 大小约为 523MB,kmalloc 仍失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27419063/