Как отключить модуль с плавающей запятой (FPU)? - PullRequest
5 голосов
/ 26 мая 2011

Я хочу отключить инструкции FPU / MMX / SSE в системе x86, и я реализую обработчик для исключения Device-Not-Available.Я сослался на страницу управления регистрацией вики ;Кажется, я должен установить некоторые флаги в регистре cr0.Как установить эти флаги в cr0 и сделать эту работу во время загрузки?

1 Ответ

6 голосов
/ 26 мая 2011

Код ядра Linux для управления состоянием FPU можно найти в arch / x86 / kernel / traps.c , do_device_not_available().По умолчанию ядро ​​Linux отключает FPU для всех процессов и включает его при первом доступе.Это позволяет ядру уменьшить издержки переключения контекста для процессов, которые не используют FPU.Однако это также означает, что однократной установки TS при запуске недостаточно;Вы должны изменить код ядра Linux, который управляет флагом TS, чтобы поддерживать это состояние.

Добавив раннюю проверку к do_device_not_available() для флага отключения и подняв сигнал или предприняв некоторые другие действия, вы можете отключить доступв ФПУ.Обратите внимание, что если вы делаете это после того, как процесс впервые использует FPU на этом конкретном CPU, FPU может оставаться пригодным для использования в течение некоторого времени, пока регистры FPU не будут переключены по контексту, и FPU не будет отключен.Если вы хотите избежать этого, вам придется явно отключить FPU с помощью stts().

. Обратите внимание, что в Linux ABI предполагается, что у вас есть FPU (либо эмулируемый FPU, либо аппаратный FPU - если у вас естьни ядро ​​не загрузится), это может вызвать непредвиденное поведение в приложениях.Кроме того, любой внутренний код ядра, использующий FPU (не уверен, есть ли он), также может сломаться.Реализуйте это на свой страх и риск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...