2010-08-05 173 views
2

我正在查找有關在內核模塊中實現某些CPU擴展的信息。我發現了一些相關的東西:http://www.mirrors.docunext.com/lxr/http/source/arch/mips/kernel/unaligned.c實際上,它是唯一可以找到的唯一源代碼,它甚至接近。在內核模塊中實現CPU擴展

基本上,我有一定的CPU擴展,這是我需要擁有大部分的指令集的一個年齡稍大的CPU上運行內置的二進制只有共享對象,而不是花哨的新東西。是的,我知道它會比較慢,但是比用SIGILL碰撞要好。

+0

您的鏈接已損壞... – luke 2010-08-05 23:34:26

+0

Shazbot!修正了謝謝。 – joe 2010-08-06 00:37:31

+0

我認爲你的問題可能有點過分。你已經有了基本的想法 - 攔截最終導致SIGILL的陷阱,而是檢查用戶進程狀態並模擬它試圖執行的指令。 (我認爲你不能從一個模塊中完成它 - 它可能必須被編譯進去,除非你爲模塊添加一些墊片來連接)。那麼真正的問題是什麼? – caf 2010-08-06 02:26:54

回答

1

那麼,在閱讀內核源代碼之後,好像已經有了對此的小支持。我真的看不到它實際使用了多少,但是存在一個鏈接列表來存儲各種模擬指令。如果我能夠真正實現這一目標,我可能會將其更改爲內核頭提供的樹。

如果我理解內核模塊右側,有看起來並不像會有支持可插拔仿真的問題。

1

我不認爲你可以使用內核模塊解決這個問題。我認爲你需要在允許缺少指令的虛擬機中運行它(我會嘗試使用XEN)或重新編譯該對象,以便它不使用它們。

+0

我認爲@joe的意思就像舊FP處理器上使用的FP模擬技巧一樣。我不確定任何人現在正在對此進行研究。 – 2010-08-05 23:41:08

+0

外部FP單元實際上是大圖的第二部分。但是當我來的時候,我會搞砸的。下面是一個x86示例(目標CPU是ARM):如果CPU不支持SSE2,當它遇到ADDPD指令時,內核會拋出(或其他類似過濾器,以較快者爲準)內部SIGILL爲自己捕獲(內核模塊等),然後調用實現ADDPD的特定函數。它不一定是一個內核模塊,它可能是內核框架必須寫入,這很好。 – joe 2010-08-06 00:01:37

2

我認爲你可以在userland中做到這一點。安裝處理器SIGILLsigaction()並指定SA_SIGINFOsiginfo_t中的字段si_code允許區分SIGILL的幾個原因。例如,當信號來自kill()時,試圖模擬指令是沒有意義的。處理程序的第三個參數指向發生故障時包含CPU上下文的結構(請參閱文檔)。您可能會修改此信息並從信號處理程序返回,這些更改會生效;如果這不起作用,請嘗試setcontext()

顯然,這將是一個有點不是內核做效率較低,但更清潔,更安全。

2

你可以做到這一點,但它有點痛苦。需要攔截無效的操作碼,因此您需要修改現有的非法指令處理程序,或者包裝處理程序,該處理程序很髒並且很複雜。

如果你想避免任何內核MODS的,但做一個純粹的內核,包裹的異常的方法可能是做到這一點的唯一途徑。如果你可以修改內核,補丁處理程序更好。