2009-01-10 59 views
11

這與 this question有關。我不是Linux設備驅動程序或內核模塊的專家,但我一直在閱讀Rubini的「Linux設備驅動程序」[O'Reilly] & Corbet和一些在線資源,但我沒有能夠在這個特定問題上找到任何東西。在Linux設備驅動程序中使用浮點的編碼約定是什麼?

什麼時候允許內核或驅動程序模塊使用浮點寄存器?
如果是這樣,誰負責保存和恢復其內容?
(假設x86-64架構)

如果我理解正確,每當KM運行時,它使用的是硬件方面(或硬件線程或註冊設置 - 無論你怎麼稱呼它)已經被搶佔從一些應用程序線程。如果你用c編寫你的KM,編譯器將正確地確保通用寄存器被正確地保存和恢復(很像在應用程序中),但這不會在浮點寄存器中自動發生。就此而言,許多KM甚至無法假定處理器具有任何浮點功能。

我在猜測一個想要使用浮點的知識管理必須謹慎地保存並恢復浮點狀態嗎?有沒有標準的內核函數來做到這一點?

這是什麼編碼規範拼寫出來的任何地方?
它們對於SMP非SMP驅動程序是不同的嗎?
對於較早的非搶佔式內核和較新的搶佔式內核,它們有何不同?

回答

8

簡答:如果此用途被kernel_fpu_begin()/kernel_fpu_end()包圍,則內核代碼可以使用浮點。這些函數處理保存和恢復fpu上下文。此外,他們呼籲preempt_disable()/preempt_enable(),這意味着在這些函數之間的代碼中沒有睡眠,頁面錯誤等。谷歌功能名稱瞭解更多信息。

如果我理解正確,每當 KM運行時,它使用的是硬件 上下文(或硬件線程或 寄存器組 - 無論你想 稱呼它)已經從 一些搶佔應用線程。

不,內核模塊也可以在用戶上下文中運行(例如,當用戶空間調用KM提供的設備上的系統調用時)。但它與浮動問題沒有關係。

如果你寫你的知識在C中, 編譯器會正確地確保 通用寄存器 妥善保存和恢復(就像 在一個應用程序),但也不至於 自動發生與 浮點寄存器。

這不是因爲編譯器,而是因爲內核上下文切換代碼。

10

Linus's answer提供這個很清楚的報價爲指針,使用方法:

換句話說:規則是,你真的不應該在內核中使用FP。

相關問題