11

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

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

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

命令输出如下所示

大小 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
4

3 回答 3

4

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

于 2009-03-24T14:43:41.363 回答
1

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

cat /proc/kallsyms | grep module_name

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

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

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

于 2009-03-19T15:37:31.683 回答
0

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

于 2009-03-20T06:08:50.043 回答