Printk за плаващи стойности в ядрото

Има ли начин да регистрирате/отпечатате плаващите стойности вътре в ядрото. Зависи ли от FPU, на който работи ядрото?

Докато компилирам printk(KERN_DEBUG "error = %f " ,floatvalue), получавам грешката:

недефинирана препратка към __aeabi_f2d


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


Отговори (2)


Използването на всякакъв вид аритметика с плаваща запетая в ядрото на Linux е грешка.

Ако процесорът, на който работите, няма FPU, тогава няма какво да извърши изчислението, което се опитвате да направите (софтуерните FPU се управляват от ядрото и не работят вътре в него).

Ако процесорът, на който работите, има FPU, ситуацията е още по-лоша - тъй като ядрото превключва контексти между задачи, то трябва да запази контекста (набора от регистри) на всяка задача. Времето, необходимо за превключване на conetxt, зависи от това колко контекст трябва да бъде запазен. Като оптимизация, ядрото запазва и възстановява контекста на FPU само когато планира влизане и излизане от задача, която използва PFU, но не и когато системно повикване или прекъсване е задействало превключването на контекста в ядрото и същата задача остава текуща задача.

Това означава, че ако пишете код, който използва FPU вътре в ядрото, вие потенциално сте повредили състоянието на FPU на изпълняваната в момента задача на потребителското пространство.

person gby    schedule 29.10.2013

Мислех така. Но всъщност понякога се поддържа плаваща запетая. Зависи от архитектурата на процесора и версията на ядрото. Например отговорът на Линус. Не казвам, че трябва да използвате FP, но е възможно. Може да е влязло в ядрото около 2.6.32, вижте lxr.free-electrons.

Raulp, твоята недефинирана референтна грешка изглежда, че се опитва да използва lib рутина. Това няма да работи, Линус посочва gcc in-line. Не съм много запознат, но може би ще видя това или това.

person Joe Kul    schedule 29.10.2013
comment
Какво означава „преди си мислех така“? Ако се отнася за друг отговор, трябва да знаете, че отговорите се показват в неправилен ред. StackOverflow не е дискусионен сайт и въпросите не са дискусионни теми. Напишете самостоятелни отговори. Ако искате да коментирате съществуващ въпрос, използвайте съответната функция (може би след като сте достигнали репутацията, която позволява използването й). - person Pascal Cuoq; 02.11.2013