Linux内核标识符中前导和尾部下划线的含义是什么?

时间:2012-02-24 14:10:38

标签: c linux coding-style kernel

我一直在讨论像__KERNEL__这样的小公约。

在这种情况下,__是内核开发人员使用的命名约定,还是以这种方式命名宏的语法特定原因?

整个代码中有很多例子。

例如,某些函数和变量以___开头。

这是否有特定原因?

它似乎被广泛使用,我只需要澄清一下这些东西是否具有语法目的,还是只是一个命名约定。

此外,我看到很多用户声明的类型,例如uid_t。我再次假设这是一个命名约定,告诉读者它是用户定义的类型?

2 个答案:

答案 0 :(得分:4)

有几种情况:

  • 在面向公众的标题中,即libc将接管并放在/usr/include/linux下的任何内容,标准指定应定义哪些符号,并且系统特定的任何其他符号应以下划线和大写字母或两个字母开头下划线。这特别是__KERNEL__的原因,因为它用在内核和libc中都包含的头文件中,并且一些声明是不同的。
  • 在内部代码中,约定通常是符号__somethingsomething的主力,不包括某些管理,通常是锁定。这就是__d_lookup之类的原因。类似的系统调用约定是sys_something是系统调用入口点,它处理与内核之间的上下文切换,并调用do_something来完成实际工作。
  • _t后缀是typedef的标准库约定。例如。 size_tptrdiff_tfoff_t等。对于它的内部类型,内核代码遵循此约定。

答案 1 :(得分:0)

有几个__函数,例如__alloc_pages_nodemask()似乎也已导出。同样,__function也是静态的,静态内联的或全局的。顺便说一句,观察__alloc_pages_nodemask()仅从mm代码调用,在其他地方,此类功能可能意味着某些内核框架的“内部”。