内核模块的内存使用情况

时间:2009-03-19 15:00:05

标签: linux memory memory-management kernel linux-device-driver

在尝试估计内核模块(通常是设备驱动程序)消耗的内存量时,我尝试使用 size 实用程序,该实用程序给出了.ko的静态内存区域的大小(。 bss,.data,.text等)。所以我希望这些值的总和与插入模块后 lsmod 命令给出的输出完全相等。

在init()函数中没有执行动态内存分配(kmalloc或vmalloc)以确保它不会导致差异。那么为什么会出现不匹配?

奇怪的是,大多数时候发现不匹配是一个固定的数量!!

命令输出列在下面

size chardev.ko

text    data     bss     dec     hex   filename
172     448    1024016 1024636  fa27c chardev.ko

lsmod的

Module  Size    Used by    Tainted: P
chardev 1025040 0 - Live   0xc009d000

3 个答案:

答案 0 :(得分:4)

你提到在init函数中没有进行任何分配,但这是否考虑了诸如register_chrdev(9)之类的调用,它在内部为设备实例分配内存?这是一个恒定差异的评论让我想知道这可能是原因。

答案 1 :(得分:1)

可能是模块使用的功能是否计入模块大小? 尝试

cat /proc/kallsyms | grep module_name

两个大小之间的差异是404.文本+数据+ 404 = 1024.可能这是某种粒度问题?我不知道内核中的大小是如何计算的......

但是,使用动态内存分配内核代码和数据。并且kmalloc使用预先分配的内存块,因此在分配代码和数据部分时很可能会有一些舍入。

尝试增加数据部分的大小,并查看lsmod报告的大小是否发生变化

答案 2 :(得分:0)

如果没有更多信息,我很想猜测它的调试开销。我说诱惑是因为我没有你的内核配置。