Printk для плавающих значений внутри ядра

Есть ли способ регистрировать / печатать плавающие значения внутри ядра. Зависит ли это от FPU, на котором работает ядро?

При компиляции printk(KERN_DEBUG "error = %f " ,floatvalue) получаю ошибку:

неопределенная ссылка на __aeabi_f2d


person Raulp    schedule 29.10.2013    source источник


Ответы (2)


Использование любой арифметики с плавающей запятой внутри ядра Linux является ошибкой.

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

Если процессор, на котором вы работаете, имеет FPU, ситуация еще хуже — поскольку ядро ​​переключает контексты между задачами, ему необходимо сохранять контекст (набор регистров) каждой задачи. Время, необходимое для переключения контекста, зависит от того, сколько контекста необходимо сохранить. В качестве оптимизации ядро ​​​​сохраняет и восстанавливает контекст FPU только тогда, когда оно планирует вход и выход задачи, которая использовала PFU, но не тогда, когда системный вызов или прерывание вызвали переключение контекста в ядро, и та же задача остается текущей. задача.

Это означает, что если вы пишете код, который использует FPU внутри ядра, вы потенциально испортили состояние FPU текущей задачи пользовательского пространства.

person gby    schedule 29.10.2013

Раньше я так думал. Но на самом деле иногда поддерживается число с плавающей запятой . Это зависит от архитектуры процессора и версии ядра. Например, ответ Линуса. Я не говорю, что вы должны использовать FP, но это возможно. Возможно, он появился в ядре около 2.6.32, см. lxr.free-electrons.

Раульп, твоя ошибка с неопределенной ссылкой выглядит так, как будто она пытается использовать подпрограмму библиотеки. Это не сработает, Линус указывает на встроенный gcc. Я не слишком хорошо знаком, но, возможно, увижу это или это.

person Joe Kul    schedule 29.10.2013
comment
К чему относится выражение «Я так думал»? Если это относится к другому ответу, вы должны знать, что ответы отображаются не по порядку. StackOverflow не является дискуссионным сайтом, а вопросы не дискуссионными ветками. Пишите самостоятельные ответы. Если вы хотите прокомментировать существующий вопрос, используйте соответствующую функцию (возможно, после достижения репутации, позволяющей ее использовать). - person Pascal Cuoq; 02.11.2013