linux内核启用64位除法,linux arm 64位除法

在linux 内核中  arm 架构 进行 64位除法 必须使用do_div, 否则会出现如下错误

Unknown symbol __aeabi_ldivmod (err 0)

当然对于编译如下形式的程序,不会出现错误:

long long a = 0x888ffffffff;

int b = 0x10;

a = a / b;

printk("a = %lld", a);

原因是编译器在编译阶段 就可以算出a的值来, 因此不会将 64位的除法 等到 程序在 arm 中运行才去计算。但是,如果是这样就会出错:

do_sth(int b)

{

long long a = 0x888ffffffff

a = a / b;

printk("a = %lld", a); //注意,a必须要使用(作为lvalue)才能看到错误,否则编译器会直接忽略a

}

注意,上述情况仅仅会发生在内核编程中(驱动),对于应用层编程, 可以随便用long long型的除法,上述问题同样出现在double等类型的除法运算中。

如果在驱动编程中要进行64位除法操作,需按照下面方法:

使用asm/div64.h中宏do_div

#include

unsigned long long x, result;

unsigned long y, mod;

mod = do_div(x,y);

result = x;

64 bit division 结果保存在x中;余数保存在返回结果中;被除数不能也是64位的。