在lib/div64.c 中提供了除法操作
static inline u64 div_u64(u64 dividend, u32 divisor); //无符号除法操作:除数是无符号64bit,被除数是无符号32
static inline s64 div_s64(s64 dividend, s32 divisor);//有符号除法操作:除数是有符号64bit,被除数是有符号32
static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder);//无符号除法操作:除数是无符号64bit,被除数是无符号32,remainder为余数
static inline s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder);//有符号除法操作:除数是有符号64bit,被除数是有符号32,remainder为余数
还有一个do_div,主要用于无符号32除以无符号32
u64 suspend
do_div(suspend, 100);
if (sbuf.f_bavail <= suspend) {
acct->active = 0;
pr_info("Process accounting paused\n");
}
例如这里就表示suspend=suspend/100.
#if BITS_PER_LONG == 64
# define do_div(n,base) ({ \
uint32_t __base = (base); \
uint32_t __rem; \
__rem = ((uint64_t)(n)) % __base; \
(n) = ((uint64_t)(n)) / __base; \
__rem; \
})
#endif
从do_div的实现看结果是保存在n中的。
static inline u64 div_u64(u64 dividend, u32 divisor); //无符号除法操作:除数是无符号64bit,被除数是无符号32
static inline s64 div_s64(s64 dividend, s32 divisor);//有符号除法操作:除数是有符号64bit,被除数是有符号32
static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder);//无符号除法操作:除数是无符号64bit,被除数是无符号32,remainder为余数
static inline s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder);//有符号除法操作:除数是有符号64bit,被除数是有符号32,remainder为余数
还有一个do_div,主要用于无符号32除以无符号32
u64 suspend
do_div(suspend, 100);
if (sbuf.f_bavail <= suspend) {
acct->active = 0;
pr_info("Process accounting paused\n");
}
例如这里就表示suspend=suspend/100.
#if BITS_PER_LONG == 64
# define do_div(n,base) ({ \
uint32_t __base = (base); \
uint32_t __rem; \
__rem = ((uint64_t)(n)) % __base; \
(n) = ((uint64_t)(n)) / __base; \
__rem; \
})
#endif
从do_div的实现看结果是保存在n中的。