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