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

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

Во время компиляции printk(KERN_DEBUG "error = %f " ,floatvalue) Я получаю сообщение об ошибке:

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

2 ответа

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

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

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

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

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

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

Другие вопросы по тегам