Подтвердить что ты не робот

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

Я читаю Robert Love "Linux Kernel Development", и я наткнулся на следующий отрывок:

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

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

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

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

4b9b3361

Ответ 1

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

  • многие программы не используют с плавающей запятой или не используют ее на любом данном временном фрагменте; и
  • сохранение регистров 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, они попадают в программное обеспечение, которое содержит педантическую правильную эмуляцию операционных систем, которые могут ловушки.

Ответ 2

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

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

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