2010-08-18 74 views
4

主題: PPC彙編語言 - Linux的Loadble內核模塊如何在運行時在PPC Linux上掛接syscall表?

詳細信息:如何訪問本地TOC區(R2)在系統調用表掛鉤內核調用時?

我已經爲Linux編寫了一個可加載的內核模塊,它使用syscall表鉤子在將調用傳遞給原始處理程序之前攔截系統調用並記錄有關它們的信息。這是安全產品的一部分。我的模塊運行良好,運行在各種各樣的Linux內核版本和發行版上的生產代碼,32位和64位內核都運行在x86硬件上。

我試圖移植此代碼在Linux上運行PPC處理器並遇到一些問題。使用Linux內核源代碼,很容易看到系統調用表在PPC上的實現方式。我可以用我自己編譯的處理程序中的函數地址替換表中的條目,沒有問題。

但是,這是我遇到的問題。 PPC ABI使用稱爲目錄(TOC)地址的東西存儲在CPU的R2寄存器中,並且希望通過使用該寄存器中包含的地址(TOC地址)的偏移量來尋址模塊的全局數據和本地數據。這在正常情況下工作正常,因爲編譯器知道在進行調用之前將模塊的TOC地址加載到寄存器中(或者它已經存在,因爲通常您的函數是由您自己的代碼調用的),因此進行函數調用。但是,當我將我自己的函數的地址(從我的加載的內核模塊運行時)放到系統調用表中時,內核會調用我的處理程序,其中的R2值不是我編譯的C代碼所期望的值,所以我的代碼無法訪問其數據而得到控制權。

有沒有人知道任何示例代碼顯示如何處理這種情況?我無法重新編譯內核。這應該是運行時系統調用表鉤子的一個直接例子,但我還沒有弄明白,或者找到任何特定於PPC的示例。

的想法包括:

手動編碼彙編語言存根保存R2值,與本地TOC地址加載寄存器,執行我的代碼,然後調用恢復原來的處理程序之前的舊值。我沒有深入的PPC組裝經驗來做到這一點,我也不確定它會工作。

一些神奇的gcc選項,會生成我的代碼而不使用TOC。有一個記錄的gcc選項"-mno-toc",不適用於我的PPC6 Linux。看起來它可能只是系統V.4和嵌入式PowerPC的一個選項。

任何幫助,非常感謝!

謝謝!

+0

恐怕我對解決方案沒有任何建議,但您確實知道內核開發人員一直很難修改syscall表?這不是他們想用內部API支持的東西。 – stsquad 2010-08-20 07:46:02

回答

0

您需要一個存根(stub)才能加載r2。內核源代碼中有一些例子。

1

Linux有一個通用的syscall審計基礎架構,可以在powerpc上運行,並且您可以從用戶空間進行訪問。你有沒有考慮過使用它而不是編寫一個內核模塊?