我正在花时间查看 Linux 内核源代码,发现了一个困惑的来源。在头文件/usr/src/linux-headers-3.2.0-4-common/include/linux/fs.h
中存在以下内容;
2183 static inline void unregister_chrdev(unsigned int major, const char *name)
2184 {
2185 __unregister_chrdev(major, 0, 256, name);
2186 }
除了 /proc/kallsyms
和 Module.symvers
之外,我找不到任何关于 __unregister_chrdev()
的定义。
foo@bar:/usr/src$ cat /proc/kallsyms | grep "__unregister_chrdev$"
ffffffff810fd400 T __unregister_chrdev
foo@bar:/usr/src$
foo@bar:/usr/src$ grep -R '__unregister_chrdev' *
linux-headers-3.2.0-4-amd64/Module.symvers:0x6bc3fbc0 __unregister_chrdev vmlinux EXPORT_SYMBOL
linux-headers-3.2.0-4-common/include/linux/fs.h:extern void __unregister_chrdev(unsigned int major, unsigned int baseminor,
linux-headers-3.2.0-4-common/include/linux/fs.h: __unregister_chrdev(major, 0, 256, name);
foo@bar:/usr/src$
据我了解,内联函数会将自身的调用替换为函数中定义的内容,但在这种情况下,自身的内容是对新函数的调用。这是否意味着我可以以某种方式直接调用 __unregister_chrdev(major, 0, 256, name)
而无需更改任何重要内容?这里发生了什么?
请您参考如下方法:
内部函数的名称或其原型(prototype)可能会更改。
你应该总是调用外部的。
优化的构建会将其视为宏并有效地调用内部函数。