2015-04-24 5 views
2

Можно ли разделить ядро ​​Linux и использовать двойные значения? Когда я попытался:Отдел в ядре 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! 
+0

В конце я использовал функцию 'do_div()' для операций деления. – luminousmen

ответ

5

Для большинства процессоров, нет никакой поддержки с плавающей точкой в ​​ядре Linux. Причина заключается в том, чтобы избежать высокой стоимости сохранения регистров FPU.

+0

Даже если я буду использовать следующие команды: kernel_fpu_begin(); \t ... \t kernel_fpu_end()? – luminousmen

+0

@caps_lock для некоторых процессоров да, я не знаю вашего конкретного процессора. – ouah

2

Даже если ваша конкретная машина поддерживает плавающие точки, и даже если вы понимаете, как правильно использовать kernel_fpu_begin()...end(), код ядра по-прежнему не должен использовать код с плавающей точкой, и ваш код, вероятно, будет отклонен, если вы это сделаете.

Похоже, что ваш код, приведенный выше, просто измеряет простое соотношение, что-то вроде байтов, перемещенных со временем? Вам, конечно, не нужна плавающая точка для чего-то тривиального - просто выберите разумный масштабный коэффициент и сделайте это в фиксированной точке.

+0

Да, вы правы, я просто измеряю какое-то соотношение. Но для этого мне нужна операция деления даже в фиксированной точке. И когда я это делаю, я получил ошибку: «ВНИМАНИЕ:« __divdi3 »[/home/kir/netfilter/hello.ko] undefined! ' – luminousmen

+0

Это крошечный встроенный процессор без деления? Или, может быть, вы связываетесь с неправильной библиотекой? –

+0

Мой Makefile: OBJ-м: = hello.o KDIR: =/Библиотека/модули/$ (uname -r оболочки)/построить PWD: = $ (оболочки PWD) по умолчанию: \t $ (MAKE) - C $ (KDIR) SUBDIRS = $ (PWD) модули чистые: \t \t $ (MAKE) -C $ (KDIR) SUBDIRS = $ (PWD) чистой – luminousmen

1

Вам необходимо аккумулировать информацию и , чтобы получить результат (измерение) в конце с использованием целочисленного деления.

Таким образом, вы минимизируете ошибку до возможного минимума . Чем дольше вы измеряете меньшую ошибку приближения .