2011-11-11 4 views
7

프로세스 B가 프로세스 A의 이미지에 프로세스 A의 이미지에 일부 데이터를 기록하면 (보통의 write() 시스템 호출로)? 프로세스 A가 실행중인 프로세스가 손상되지 않습니까?리눅스에서 실행중인 프로세스 '이미지에 쓰기

저는 Linux를 처음 사용합니다. 필자가 이해하는 한, 유닉스는 역사적으로 윈도우처럼 필수 파일 잠금을 강요하지 않는다. 그래서 글쓰기가 가능합니다.

웹 검색 결과가 없습니다. 이 질문을 리눅스 경험이 많은 동료들에게 물어 보면, 프로세스 A는 그 이미지가 전적으로 메모리에 있다고 대답합니다.

그럼에도 불구하고, 내가 읽은 바에 따르면, 커널은 낮은 메모리 조건이 강조되면 메모리에서 이미지 파일로 쉽게 되돌릴 수 있습니다. 따라서 디스크에있는 동안 일부 페이지는 다른 작성자 프로세스에 의해 손상 될 수 있습니다. 이후 RAM으로 다시 스왑하고 실행할 수 있습니다.

+0

확인에 내 대답을 참조하십시오 http://stackoverflow.com/questions/4453781/what-happens-when-you-overwrite-a-memory-mapped-executable – Antoine

답변

2

다른 프로세스의 /proc/1234/mem에 대한 프로세스 작성을 생각하고 있습니까? pid_t 1234입니까?

다른 프로세스의 ELF 실행 파일을 작성하는 프로세스를 생각하고 있습니까?

두 시나리오 모두 매우 드문 경우가 많으며 (다른 Posix에는 이러한 사항이 없음),이 경우 어떤 일이 일어날 지 모릅니다. 그러나 최소한 허가 기계는 어떤 것을 보호해야합니다.

또한 ETXTBSY 오류를 참조하십시오.

(strace -f /usr/bin/gcc hello.c -o hello 같이) 실제로 대부분의 컴파일이 된 실행 파일에 쓰기하지 않도록 컴파일러와 링커는 실행 파일을 쓰기 위해 그것을 -ing open 전에 실행 파일을 제거에서 : 그래서에

870 stat("hello", {st_mode=S_IFREG|0755, st_size=6096, ...}) = 0 
870 unlink("hello")     = 0 
870 open("hello", O_RDWR|O_CREAT|O_TRUNC|O_CLOEXEC, 0777) = 17 
870 fstat(17, {st_mode=S_IFREG|0755, st_size=0, ...}) = 0 

실행 파일에 쓰면 열심히 노력해야합니다. 물론, 그렇게하면, 장난스러운 충돌이 발생할 수 있습니다.

+0

I 두 번째 시나리오를 의미합니다. –

+0

ETXTBSY가 가장 큰 실마리입니다. 내 경험에 따르면 실행중인 실행 파일의 일부를 덮어 쓰려고하면 ETXTBSY 오류가 발생합니다.파일의 내용을 덮어 쓰는 것은 posix 시스템에서 파일을 제거하고 동일한 파일 이름으로 새 파일을 만드는 것과 매우 다릅니다. – nos

+0

앙투안 (Antoine)과 연결된 질문에 세부적인 논의가 있습니다. 나는 ETXTBSY가 더 이상 발생하지 않는다고 생각한다. (아마도 정적으로 링크 된 실행 파일을 제외하고). –

1

페이지를 "이미지 파일로"바꿀 수 있음을 나타내는 내용을 읽었습니까?

시스템의 메모리가 부족하면 페이지가 실행 파일과 다른 디스크의 스왑 파티션으로 스왑됩니다. 실행 파일에 쓰기는 다음에 파일을 실행할 때까지 적용되지 않습니다.

어떻게 든 스왑 파일의 정확한 페이지에 쓸 수 있었다면 (데이터를 디스크에 언제 어디에 기록했는지 정확하게 알아야하기 때문에) 어려울 수 있습니다. 그렇게했다면 개체 코드를 수정할 수 있습니다. 실행 파일을 손상 시키거나 실행 중에 프로그램을 변경하는 영리한 방법을 제안 하시겠습니까?

+0

나는 개체 코드 손상의 바람직하지 않은 가능성에 관심이 있습니다. 나는 커널이 실행 가능한 이미지를 위해 스왑 파티션을 사용한다는 것에 의심의 여지가있다. 내가 그것에 관해 생각할 수있는 한 그것은 너무 낭비적일 것이다. 커널은 보통 mmap과 비슷한 방식으로 이미지를 매핑합니다. –

+0

깨끗한 페이지는 전혀 스왑 아웃되지 않습니다. 다시 페이지가 다시 필요할 경우 매핑 된 파일에서 다시로드하기 만하면 삭제됩니다. – caf

관련 문제