c - 尽管 lowfree 大小约为 523MB,kmalloc 仍失败

标签 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 中失败?

最佳答案

kmalloc() 函数返回物理上连续的内存,该内存也是虚拟连续的。

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

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

看一下这个示例,其中 kmalloc 在 ~4MB 处失败。 Kmalloc fails ~4MB

更多详情请参阅:KMALLOC size allocation

关于c - 尽管 lowfree 大小约为 523MB,kmalloc 仍失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27419063/

相关文章:

c - 优化乘法和加法

c - 取消引用和组件选择之间的区别

c - 如果我不关闭 C 中的文件

c - 有没有办法优化代码并将总和项数从 4 提高到 K 个?

linux - 设置 ssh 连接 2 PC 并使用 MPI

linux - 运行 Linux 内核模块 (Hello World)

windows - "bcdedit/dbgsettings NET HOSTIP:123.123.123.123 PORT:50123"无效

Linux whiptail 或带有菜单和输入的对话框

Linux (Bash) - 使用 Acrobat Reader 中带有可编辑字段的表单创建 PDF

python - 适用于 Windows 10 的 Anaconda (Python 2.7) 出现内核错误。Spyder IDE 控制台错误