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