2012-09-17 2 views
4

파일 시스템과 관련된 모든 시스템 호출을 가로 채고 대신 내 자신의 코드를 실행하는 데 관심이 있습니다. 예를 들어, creat, write, close, lseek, getcwd 등의 호출. execve와 같은 함수를 생성하여 생성 된 프로그램의 모든 파일 I/O를 호출 프로세스에서 관리하는 메모리 파일 시스템으로 캡처합니다. 이렇게하면 호출 프로그램은 파일 시스템 오버 헤드없이 출력을 검사 할 수 있습니다.파일 시스템에 대한 호출을 차단하는 방법

내 유스 케이스는 API 또는 라이브러리가없는 큰 수치 시뮬레이션 프로그램과 함께 작동합니다. 이러한 프로그램은 입력 및 출력 파일을 통해서만 통신합니다. 이러한 파일이 크면 I/O를 수행하기 위해 런타임의 상당 부분을 차지할 수 있습니다. 수퍼 사용자 권한이있는 일부 컴퓨터에서는 RAM에있는 파일 시스템 (예 : Linux의 경우 tmpfs)을 설정할 수 있지만 수퍼 사용자 권한이 없거나 특정 방식으로 구성된 컴퓨터가 불가능합니다 .

나는 LD_PRELOAD를 사용하여 libc의 함수 대신 사용자 정의 코드를 호출 할 수 있음을 이해합니다. 그러나 이는 동적으로 링크 된 프로그램에서만 작동하며 호출 프로그램 (메모리 파일 시스템에서 호스트하려는)과 호출 수신자간에 IPC를 수행하는 방법에 대한 질문에 대답하지 않습니다. 이 접근법에 대한 질문은 IPC를 최상으로 수행하는 방법입니다. 파이프, 유닉스 도메인 소켓 또는 일부 공유 메모리를 사용해야합니까?

나는 시스템 호출을 가로 채기위한 방법으로 ptrace를 살펴 보았습니다. 이것은 작동하는 것처럼 보이지만이 접근법에 대해 두 가지 질문이 있습니다. 먼저, 실제 시스템 호출이 발생하지 않도록하는 방법 (일부 예제에서 보았 듯이 시스템 호출에 대한 인수를 수정하는 것과 반대). 둘째, ptrace는 호출 수신자의 메모리 공간을 고성능으로 읽을 수 있습니까?

답변

2

LD_PRELOAD을 사용하면 수신자의 메모리 공간에서 요격 코드를 실행할 수 있습니다. 라이브러리 생성자 함수 (__attribute__((constructor)))를 사용하면 라이브러리를 처음 시작할 때 선택한 코드를 실행할 수 있습니다 (예 : 가상 파일 시스템을 초기화하고 초기화하십시오.

그러면 사전로드 된 라이브러리로 호출을 가로 채면 라이브러리의 기능이 대상 프로세스에서 실행되고 IPC가 필요하지 않은 구성된 파일 시스템에 액세스 할 수 있습니다.

호출 프로세스가 파일 시스템을 관리해야하는 경우 오버 헤드가 발생합니다. 자식 프로세스 (아마도 공유 메모리 영역)에서 파일 시스템의 중요한 부분을 매핑하는 것이 좋습니다. 대신 자식에서 청취자를 사용하여 부모로부터 파일 시스템 변경 사항을 관찰하십시오 (파일 시스템 작업에 적합한 잠금 기능 포함). 대역폭 요구 사항이 낮을 때 간단한 파이프로 변경 알림을 수행 할 수 있습니다.

또한 수정 된 Glibc를 제공하여 파일 시스템 액세스를 샌드 박싱하는 반 가상화 시스템 인 Plash을 확인하십시오.

+0

플래쉬는 더 이상 존재하지 않는 것 같습니다. – Gael

관련 문제