2012-07-27 2 views
3

저는 메모리 매핑 된 데이터에 대해 투명하게 데이터 변환을 수행하는 기술을 사용 해왔다. 아이디어는 기본적으로 원하는 파일을 메모리 맵핑하고 읽기/쓰기가 보호 된 두 번째 익명 영역을 작성하는 것입니다. 사용자가 익명 영역에 액세스하면 결과 segfault가 catch되고 데이터가 변환되며 액세스가 진행되도록 사용 권한이 변경됩니다.시스템 호출에서 segfault가 사용자 신호 처리기로 돌아 가기 시작 했습니까?

위대한 작품이지만 약간의 장애가 있습니다. write()와 같은 시스템 호출에 데이터를 먼저 건드리지 않고 포인터를 전달하면 segfault 핸들러가 트리거되지 않고 대신 핸들러가 호출되어 권한을 수정하지 않으므로 EFAULT 만 반환됩니다. 문제가있을 때 시스템 호출이 사용자 공간 처리기를 사용하게하는 방법이 있습니까?

+2

Linux 커널 메일 링리스트에 [suggestion] (https://lkml.org/lkml/1998/8/23/31) 한 번 불일치를 고치기 위해 syscalls 용 SIGSEGV를 생성했습니다. 데모 패치도있었습니다 (https://lkml.org/lkml/1998/8/26/57). 그러나 일부 사람들은 EFAULT가 전통적이며 일부 프로그램이 실제로 그것을 처리하고 있기 때문에 대신 신호 처리기를 사용하도록 변환하는 것이 어려울 수 있기 때문에 반대하는 사람들이 있습니다. 그것은 14 년 전이었다. 어쩌면 다시 시도 할 시간입니다. –

+0

아마 사용자 프로세스가 EFAULT를 반환하도록 기본값을 유지하면서 해당 동작을 활성화 할 수있게 해주는 패치일까요? –

+0

네, 만약'prctl'으로 활성화했다면 받아 들일 수 있습니다. 또는 임의의 커널에서 작업 할 번역사가 필요하지 않은 경우에는 해킹 할 수 있습니다. 그 14 세의 패치는 아마 새로운 커널에 쉽게 포팅되지 않을 것이고, 어쨌든 오직 i386이 될 것이지만, 작아서 다시 할 수 없을 수도 있습니다. –

답변

3

아니오 버퍼가 잘못되었을 때 write과 같은 syscall을 만들려면 SIGSEGV을 만들 수 없습니다. return EFAULTwrite(2) syscall의 의미 체계의 일부입니다.

LD_PRELOAD 경우에만 해당되는 경우 libc.so; ptrace을 사용하여 strace의 syscalls를 잡을 수도 있습니다.

this answer도 매우 비슷한 질문을 참조하십시오.