2012-07-27 77 views
3

我一直在玩一種技術,透明地對內存映射數據進行數據轉換。這個想法基本上是爲了映射一個想要的文件,並創建一個讀/寫保護的第二個匿名區域。當用戶訪問匿名區域時,會捕獲生成的段錯誤,轉換數據並更改權限以允許繼續進行訪問。在系統調用中導致segfault返回到用戶信號處理程序?

它工作的很好,但有一點小問題。在沒有首先將數據傳遞給像write()這樣的系統調用的情況下傳遞指針將不會觸發segfault處理程序,而只是返回EFAULT,因爲未調用處理程序來修復權限。有什麼辦法可以讓系統調用在出現問題時使用用戶空間處理程序?

+2

在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

+0

也許一個補丁允許用戶進程啓用該行爲,同時保持默認返回EFAULT? – 2012-07-27 19:27:11

+0

是的,如果它啓用了'prctl',他們可能會接受它。或者如果你不需要你的翻譯工作在任意內核上,你就可以破解你的內核。這個14歲的補丁可能不會輕鬆移植到新的內核上,而且它只是i386,但是它的體積很小,所以也許不會太難再做一次。 – 2012-07-27 19:33:08

回答

3

不,沒有辦法讓系統調用如write在緩衝區錯誤時作出SIGSEGV。返回EFAULT是系統調用write(2)的語義的一部分。

如果您只關注libc.so,您可能會做LD_PRELOAD;您還可以使用ptrace來捕獲系統調用,以便與la strace

另請參閱this answer到您的一個非常類似的問題。

相關問題