3
我一直在玩一種技術,透明地對內存映射數據進行數據轉換。這個想法基本上是爲了映射一個想要的文件,並創建一個讀/寫保護的第二個匿名區域。當用戶訪問匿名區域時,會捕獲生成的段錯誤,轉換數據並更改權限以允許繼續進行訪問。在系統調用中導致segfault返回到用戶信號處理程序?
它工作的很好,但有一點小問題。在沒有首先將數據傳遞給像write()這樣的系統調用的情況下傳遞指針將不會觸發segfault處理程序,而只是返回EFAULT,因爲未調用處理程序來修復權限。有什麼辦法可以讓系統調用在出現問題時使用用戶空間處理程序?
在linux-kernel郵件列表上曾經有一個[建議](https://lkml.org/lkml/1998/8/23/31)爲syscalls生成SIGSEGV來解決不一致問題。甚至有一個[示範補丁](https://lkml.org/lkml/1998/8/26/57)。但有些人反對它,因爲EFAULT是傳統的,有些程序可能實際上正在處理它,而將它們轉換爲使用信號處理程序將會很困難。那是14年前。也許是時候再試一次。 – 2012-07-27 19:09:30
也許一個補丁允許用戶進程啓用該行爲,同時保持默認返回EFAULT? – 2012-07-27 19:27:11
是的,如果它啓用了'prctl',他們可能會接受它。或者如果你不需要你的翻譯工作在任意內核上,你就可以破解你的內核。這個14歲的補丁可能不會輕鬆移植到新的內核上,而且它只是i386,但是它的體積很小,所以也許不會太難再做一次。 – 2012-07-27 19:33:08