为什么linux内核包含仅由__前缀区分的函数对?

Linux调度程序分叉操作使用两个函数sched_fork()__sched_fork()__sched_fork()__sched_fork()调用。 在内核的其他几个地方使用具有双下划线(专用于系统保留名称)的类似代码约定。 当一个函数可以被使用时,如何定义这样的两个函数会有所帮助? 为什么使用这个惯例?

如果您搜索源代码,您将看到__sched_fork()init_idle()__sched_fork()中调用。 我认为这是定义两个函数的主要原因。

我也看到了具有不同实现的函数对(有和没有__ )。 例如, __hrtick_start()hrtick_start() 。 但是,它们的用法稍有不同:第一个应该从hardirqs中调用。

当下划线的版本做功能的核心工作,没有下划线的版本在调用它之前做额外的测试时,其他对可以分开。 这样,如果所有的条件都被检查过了,程序员可以调用下划线的版本。

历史上,模式是使__function成为执行操作的“胆量”的函数,具有绝对最小的参数检查。 另一方面,no___函数将对参数有效性或其他一些额外的成本操作进行一些检查。 然而,有时候,这只是一个分为“中间”和“其余”的模块化。