LINUX.ORG.RU

операции с плавающей точкой в ядре 2.6.Х


0

0

Доброе время суток.

При написании модулей к 2.4 можно было использовать тип float и
операции с ним, например, деление. А при добавлении модуля к 2.6,
в котором используются операции с floating point числами получается
следующее:
  # insmod ./test.ko
  insmod: error inserting './test.ko': -1 Unknown symbol in module

в syslog сыпется следующее:
  kernel: test: Unknown symbol __floatsidf
  kernel: test: Unknown symbol __adddf3
  kernel: test: Unknown symbol __truncdfsf2

сам модуль собирается без ошибок. Часть кода, вызывающая ошибку:
  /* .... */
  float ftest;  // само объявление ошибок не вызывает
  int i = 2;  // тоже самое, если i имеет тип float
  ftest = 1.112 *1.2 /2.3 + i; // ругается именно на ОПЕРАЦИИ c float
  /* строка ftest = 1.112 *1.2 /2.3 *1.2222; ошибок не вызывает */
  /* .... */

В исходных кодах ядра (в каталоге linux/drivers) в комментариях можно
встретить фразу:
linux/drivers/media/video/msp3400.h:
  ...
  Remember -- no floats in kernel mode
  ...

Вопрос:
1. Действительно-ли никак нельзя использовать операции с floating
point числами в ядре 2.6?
2. Если да, то какие есть альтернативы? Имеется ввиду
стандартные/классические замены. 
3. Если возможно, дайте плз ссылку на документацию, в которой
рассматривается данный вопрос.

ps: в интернете не особо много написано по этой теме...
anonymous

> 1. Действительно-ли никак нельзя использовать операции с floating point числами в ядре 2.6?

AFAIK, операции с плавающей точкой в ядре были запрещены всегда. Если они работали на 2.4 - это случайность.

> какие есть альтернативы?

Обычный совет - "вынесите вычисления в userspace". Хотя зависит от того, что ты пытаешься делать.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

в идеале надо из kernel-space передавать в user-space float значения, причем очень желательно уметь обрабатывать их в kernel-space

anonymous
()

В ядре плавающая точка не нужна. Зачем тебе там её вычислять?

anonymous
()
Ответ на: комментарий от anonymous

> надо из kernel-space передавать в user-space float значения, причем очень желательно уметь обрабатывать их в kernel-space

Ответ слишком расплывчатый

tailgunner ★★★★★
()

Проблемы при использовании floating point в ядре Linux возникают по простой причине, ради оптимизации сохранение/загрузка состояния математического сопроцессора не происходит при переходе из user space <-> kernel space и обратно,

соотвественно чтобы у вас все заработало, надо:
а)что контекст не переключится во время вашей работы,
preempt_disable и т.д.
б)сохранить состояние сопроцессора
в)посчитать все что нунжно
г)востановить все как было

а функции __floatsidf и т.д. можно найти в gcc/glibc для соотвествующей платформы и включить например в свой модуль.

fghj ★★★★★
()

> 2. Если да, то какие есть альтернативы? Имеется ввиду стандартные/классические замены.

fixed point

mv ★★★★★
()
Ответ на: комментарий от fghj

>а функции __floatsidf и т.д. можно найти в gcc/glibc для соотвествующей платформы и включить например в свой модуль.

проект по добавлению gcc/glibc в область ядра уже запущен?

denisko
()
Ответ на: комментарий от fghj

> Проблемы при использовании floating point в ядре Linux возникают по простой причине, ради оптимизации сохранение/загрузка состояния математического сопроцессора не происходит при переходе из user space <-> kernel space и обратно,

только тогда непонятно, почему под 2.4 все работало и работало нормально? Драйвер постоянно опрашивал устройства и работал с float, а пользовательский процесс забирал данные с драйвера (в виде flot-ов).

anonymous
()

вам поможет math-emu /usr/src/linux/include/math-emu

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.