Это связано с этим вопросом.
Я не эксперт по драйверам устройств Linux или модулям ядра, но я читал «Драйверы устройств Linux» [O'Reilly] Rubini & Corbet и ряд онлайн-источников, но я не смог найти что-нибудь по этому конкретному вопросу еще.
Когда ядру или модулю драйвера разрешено использовать регистры с плавающей запятой?
Если да, то кто отвечает за сохранение и восстановление их содержимого?
(Предполагается архитектура x86-64)
Если я правильно понимаю, всякий раз, когда KM работает, он использует аппаратный контекст (или аппаратный поток или набор регистров — как бы вы это ни называли), который был вытеснен из какого-то потока приложения. Если вы напишете свой KM на c, компилятор правильно обеспечит правильное сохранение и восстановление регистров общего назначения (так же, как в приложении), но это не происходит автоматически с регистрами с плавающей запятой. Если на то пошло, многие KM даже не могут предположить, что процессор имеет какие-либо возможности с плавающей запятой.
Правильно ли я предполагаю, что KM, который хочет использовать числа с плавающей запятой, должен тщательно сохранять и восстанавливать состояние с плавающей запятой? Существуют ли стандартные функции ядра для этого?
Прописаны ли где-нибудь правила кодирования для этого?
Различаются ли они для SMP-не SMP-драйверов?
Отличаются ли они для старых ядер без вытеснения и новых ядер с вытеснением?