linux 内核中的除法
Division in linux kernel
是否可以在 linux 内核中划分并使用双精度值?
当我尝试时:
typedef struct{
...
long long int sbe;
...
} connection;
hook_func(){
connection* found
...
uint32_t time_misec ..
uint32_t bytes_diff ..
...
double be = bytes_diff / time_misec;
found->sbe = be / 2 + found->sbe / 2;
...
}
我遇到错误:
WARNING: "__fixunsdfsi" [/home/kir/netfilter/hello.ko] undefined!
WARNING: "__adddf3" [/home/kir/netfilter/hello.ko] undefined!
WARNING: "__floatdidf" [/home/kir/netfilter/hello.ko] undefined!
WARNING: "__muldf3" [/home/kir/netfilter/hello.ko] undefined!
WARNING: "__floatunsidf" [/home/kir/netfilter/hello.ko] undefined!
对于大多数 CPU,Linux 内核中没有浮点支持。原因是为了避免节省FPU寄存器的高成本。
即使您的特定机器支持浮点,即使您了解如何正确使用 kernel_fpu_begin()...end()
,内核代码仍然不应使用浮点代码,如果您这样做,您的代码可能会被拒绝。
你上面的代码似乎只是测量一个简单的比率,比如字节随时间移动?对于那些微不足道的事情,您当然不需要浮点数——只需选择一个合理的比例因子并以定点数进行。
你只需要积累信息和
最后产生结果(测量)
使用整数除法。
这样你就可以将错误最小化到可能的范围内
最低限度。你测量的时间越长越小
近似误差。
是否可以在 linux 内核中划分并使用双精度值? 当我尝试时:
typedef struct{
...
long long int sbe;
...
} connection;
hook_func(){
connection* found
...
uint32_t time_misec ..
uint32_t bytes_diff ..
...
double be = bytes_diff / time_misec;
found->sbe = be / 2 + found->sbe / 2;
...
}
我遇到错误:
WARNING: "__fixunsdfsi" [/home/kir/netfilter/hello.ko] undefined!
WARNING: "__adddf3" [/home/kir/netfilter/hello.ko] undefined!
WARNING: "__floatdidf" [/home/kir/netfilter/hello.ko] undefined!
WARNING: "__muldf3" [/home/kir/netfilter/hello.ko] undefined!
WARNING: "__floatunsidf" [/home/kir/netfilter/hello.ko] undefined!
对于大多数 CPU,Linux 内核中没有浮点支持。原因是为了避免节省FPU寄存器的高成本。
即使您的特定机器支持浮点,即使您了解如何正确使用 kernel_fpu_begin()...end()
,内核代码仍然不应使用浮点代码,如果您这样做,您的代码可能会被拒绝。
你上面的代码似乎只是测量一个简单的比率,比如字节随时间移动?对于那些微不足道的事情,您当然不需要浮点数——只需选择一个合理的比例因子并以定点数进行。
你只需要积累信息和 最后产生结果(测量) 使用整数除法。
这样你就可以将错误最小化到可能的范围内 最低限度。你测量的时间越长越小 近似误差。