2010-06-29 4 views
0

새 프로세스가 생성되면 주소 공간은 fork()를 사용하여 생성됩니다. 즉, 새 프로세스에 대해 새 프로세스 테이블 항목이 생성됩니다.이 항목은 상위 프로세스와 완전히 동일합니다. fork() 후 exec()가 호출됩니다. exec() 시스템 호출 중에 어떤 일이 발생합니까?VAS 로의 바이너리 메모리 매핑

"운영 체제 개념"이라는 책을 읽었습니다. 새 프로그램이 실행될 때 프로세스에 새로운 빈 VAS가 제공됩니다. 이는 fork() 중에 생성 된 페이지 테이블 항목이 삭제되거나 수정 될 수 있음을 의미합니까? 빈 VAS의 의미는 무엇입니까?

어떻게 VAS 로의 메모리 매핑이 수행됩니까? 로더는 VAS의 어떤 주소가 해당 이진 파일에 매핑되어야하는지 어떻게 알 수 있습니까?

나는 정말로 여기에서 혼란 스럽다.

+0

이것은 전적으로 운영 체제에 따라 다르며 –

+0

@Paul 네,하지만 거의 모든 최신 OS가 비슷한 일을합니다. – Spudd86

답변

1

exec를 호출하면 커널이 바이너리를로드하고 완전히 새로운 페이지 테이블 세트를 설정합니다 (이전 버전을 대체).

로더는 바이너리 자체에서의 바이너리를로드 할 주소를 얻을 수

(기본적으로 실제로 이진 코드/데이터 물건을로드 한 후, mmap()를 코드 아니라 헤더와 물건을 얻기 위해 read()을한다)

그래서 바이너리를보고 어떻게로드되어야 하는지를 알아 내고, mmap()은 다른 장소에 있어야하는 바이너리의 각 부분에 대해 맵을 수행 할 주소를 전달합니다 (즉, 코드 섹션과 데이터 섹션은 아마도 mmap()에 대한 두 가지 다른 호출 또한 .bss 섹션이/dev/zero에서 매핑됩니다.

OS와로드되는 바이너리 중 일부는 커널에 의해 직접적으로 또는 사용자 공간 로더에 의해 처리 될 수 있습니다 (유닉스 시스템에서는 로더가되고 공유 객체 로딩을 처리합니다)

+0

로더는 ELF 형식 바이너리의 헤더를 읽음으로써 바이너리 자체에서 VAS로 바이너리를 매핑하는 정보를 얻습니다. 바이너리 abc.exe를 사용하여 동시에 두 개의 프로세스가 있다고 가정하면 VAS가 바이너리에 따라 매핑되면 두 프로세스의 가상 주소 공간이 비슷하다는 것을 의미합니다. 그래? – Ashish

+0

가끔은 ... 모든 주소에서로드 할 수있는 위치 독립 코드가 있습니다 (공유 라이브러리는 항상 이와 유사합니다). 로더 작업의 다른 부분은 '재배치'를 처리하는 것입니다. 즉, 바이너리가로드 된 실제 주소와 일치하도록 특정 값을 변경하는 것입니다. 그러나 실행 파일은 종종 PIC가 아니므로 항상 동일한 가상 주소에로드됩니다. (하지만 주소 공간이 다른 이유는 동적 링커가 어떤 이유로 libc를 다른 지점 (예 : 주소 무작위 화)으로 말하면 여전히 다를 수 있습니다) – Spudd86

관련 문제