gpt4 book ai didi

c - 为什么 Linux 内核使用 do_div 而不是/?

转载 作者:太空宇宙 更新时间:2023-11-04 06:16:21 26 4
gpt4 key购买 nike

对于64位除法,使用/do_div有什么区别?只是为了提高性能?它是否依赖于架构?

The source code is here.

最佳答案

此模块中此宏和函数的目的是优化。内核代码中的注释非常清楚:

/*
* do_div() is NOT a C function. It wants to return
* two values (the quotient and the remainder), but
* since that doesn't work very well in C, what it
* does is:
*
* - modifies the 64-bit dividend _in_place_
* - returns the 32-bit remainder
*
* This ends up being the most efficient "calling
* convention" on x86.
*/

该宏在内核中用于通过单个除法在单个步骤中计算商和余数,而不是标准 C 中的 2 个运算,可能会产生 2 个除法操作码。

事实上,Intel x86 CPU 可以使用一条指令计算整数除法的商和余数。宏使用内联汇编来利用这一点,而 C 编译器可能不会使用 / 优化 2 个单独的计算。和 %成一个单一的操作码。

在编写这段代码时,大多数编译器都没有,而且除法操作码的开销非常大,所以 Linus 决定使用一个特殊的函数来优化这个计算。

请注意,C 标准为此目的提供了一组函数(在 <stdlib.h> 中声明):

div_t div(int numer, int denom);
ldiv_t ldiv(long int numer, long int denom);
lldiv_t lldiv(long long int numer, long long int denom);

Linux 内核针对的系统可能没有符合标准的编译器,并且肯定早于其中一些标准添加,因此它有自己的这些函数版本作为宏,并且在同一模块中有一些其他版本。

关于c - 为什么 Linux 内核使用 do_div 而不是/?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45099231/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com