it-roy-ru.com

Использование плавающей запятой в ядре Linux

Я читаю "Разработка ядра Linux" Роберта Лава и натолкнулся на следующий отрывок:

Нет (простое) использование плавающей запятой

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

В отличие от пользовательского пространства, ядро ​​не может позволить себе плавную поддержку с плавающей запятой, поскольку оно не может легко перехватить себя. Использование плавающей запятой внутри ядра требует ручного сохранения и восстановления регистров с плавающей запятой, среди прочих возможных рутинных операций. Краткий ответ: Не делайте этого! За исключением редких случаев, в ядре нет операций с плавающей запятой.

Я никогда не слышал об этих "целочисленных" и "плавающих" режимах. Что именно они и зачем они нужны? Существует ли это различие в основных аппаратных архитектурах (таких как x86) или оно характерно для более экзотических сред? Что именно влечет за собой переход от целочисленного к режиму с плавающей запятой, как с точки зрения процесса, так и ядра?

72
NPE

Потому что ...

  • многие программы не используют с плавающей запятой или не используют ее на любом отрезке времени; и
  • сохранение регистров FPU и других состояний FPU требует времени; , следовательно,

... ядро ​​ОС может просто отключить FPU. Presto, нет состояния для сохранения и восстановления и, следовательно, более быстрое переключение контекста. (Это то, что означало режим , это просто означало, что FPU был включен.)

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

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

Между прочим, я полагаю, что объяснение книги о причине, по которой ядра (а не только Linux) избегают операций с FPU, ... не совсем точно.1

Ядро может заманивать себя в ловушку и делает это для многих вещей. (Таймеры, сбои страниц, прерывания устройства и т.д.). Настоящая причина в том, что ядру не особенно нужна операция FPU, а также она должна работать на архитектуры без FPU вообще. Следовательно, он просто избегает сложности и времени выполнения, необходимых для управления собственным контекстом FPU, не делая операций, для которых всегда существуют другие программные решения.

Интересно отметить, как часто нужно сохранять состояние FPU, если ядро ​​хотело использовать FP ... каждый системный вызов, каждое прерывание, каждое переключение между потоками ядра. Даже если бы была необходимость в случайном ядре FP,2 вероятно, было бы быстрее сделать это в программном обеспечении.


1. То есть совершенно неправильно.
2. Я знаю несколько случаев, когда программное обеспечение ядра содержит реализацию арифметики с плавающей запятой . Некоторые архитектуры реализуют традиционные операции FPU в аппаратном обеспечении, но оставляют некоторые сложные IEEE FP операции с программным обеспечением. (Подумайте: денормальная арифметика.) Когда случается какой-то нечетный случай с IEEE-углом, они ловятся на программное обеспечение, которое содержит педантически правильную эмуляцию операций, которые могут быть захвачены.
73
DigitalRoss

В некоторых разработках ядра регистры с плавающей точкой не сохраняются, когда задача "ядро" или "система" выключена. (Это связано с тем, что регистры FP имеют большой размер и занимают время и пространство для сохранения.) Поэтому, если вы попытаетесь использовать FP, значения будут случайным образом "пускаться".

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

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

15
Hot Licks