在尝试估计内核模块(通常是设备驱动程序)消耗的内存量时,我尝试使用 size 实用程序,该实用程序给出了.ko的静态内存区域的大小(。 bss,.data,.text等)。所以我希望这些值的总和与插入模块后 lsmod 命令给出的输出完全相等。
在init()函数中没有执行动态内存分配(kmalloc或vmalloc)以确保它不会导致差异。那么为什么会出现不匹配?
奇怪的是,大多数时候发现不匹配是一个固定的数量!!
命令输出列在下面
text data bss dec hex filename
172 448 1024016 1024636 fa27c chardev.ko
Module Size Used by Tainted: P
chardev 1025040 0 - Live 0xc009d000
答案 0 :(得分:4)
你提到在init函数中没有进行任何分配,但这是否考虑了诸如register_chrdev(9)之类的调用,它在内部为设备实例分配内存?这是一个恒定差异的评论让我想知道这可能是原因。
答案 1 :(得分:1)
可能是模块使用的功能是否计入模块大小? 尝试
cat /proc/kallsyms | grep module_name
两个大小之间的差异是404.文本+数据+ 404 = 1024.可能这是某种粒度问题?我不知道内核中的大小是如何计算的......
但是,使用动态内存分配内核代码和数据。并且kmalloc使用预先分配的内存块,因此在分配代码和数据部分时很可能会有一些舍入。
尝试增加数据部分的大小,并查看lsmod报告的大小是否发生变化
答案 2 :(得分:0)
如果没有更多信息,我很想猜测它的调试开销。我说诱惑是因为我没有你的内核配置。