是否有可能在linux内核中分割并使用double值? 当我尝试:
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()
,内核代码仍然不应该使用浮点代码,如果你这样做,你的代码可能会被拒绝。
看来你上面的代码只是测量一个简单的比例,就像字节随着时间的推移? 你当然不需要浮点的东西琐碎 – 只要选择一个合理的比例因子,并在固定点。
您只需要累积信息并使用整数除法在最后生成结果(测量)。
这样可以将错误降到最低。 您测量的时间越长,近似误差越小。