2

음. 나는 virtual address spaces에서 사용 된 memory mapped file의 개념과 꽤 혼동 스럽다.가상 주소 공간에 메모리 매핑 된 파일 사용

다음 링크에서 나는 봤습니다.

http://en.wikipedia.org/wiki/Virtual_address_space

은 내가 섹션을 발견

  Then the application's executable file is mapped into the Virtual Address Space. 
      Addresses in the process VAS are mapped to bytes in the exe file. 
      The OS manages the mapping: 

        0           4GB 
     VAS  |---vvvvvvv------------------------------------| 
     mapping  |-----| 
     file bytes  app.exe 

     The v's are values from bytes in the mapped file. 

이 메모리 매핑 된 파일의 마지막 문에 혼란 특정 가상 주소 공간 (의 특정 과정과 관련이있어 이제 어떻게 위 섹션)?

특정 프로세스에 해당하는 메모리 맵 파일을 생성하기위한 코드를 명시 적으로 포함해야하는 이유는 무엇입니까?

+0

실행중인 실행 코드가 메모리 매핑을 사용하여 메모리에로드되는 방법을 설명합니다. – Barmar

답변

3

이해해야 할 첫 번째 사실은 실제 주소와 가상 주소의 차이입니다. 프로그램이 특정 (가상) 메모리 주소에 데이터를 쓰면 쓰기 주소가 RAM 칩의 실제 주소로 변환됩니다. 특정 가상 주소에 대해 실제 주소가 프로그래밍되어 있지 않으면 일반적으로 액세스 위반 또는 세그먼트 화 오류가 발생합니다.

메모리 관리 장치 (MMU)가 실행되면 CPU 실행 예외가 발생하여 커널 오류 처리기로 점프합니다. 액세스 위반의 경우 프로세스가 종료됩니다.

커널은 다른 영리한 것들을 할 수 있습니다. 프로세스가 유휴 상태이면 프로세스에서 사용하는 실제 메모리 중 일부를 스왑 파일로 복사하고 (mmu에서 항목을 제거 할 수 있습니다.) 해당 주소에 액세스하면 CPU 예외가 프로그램을 중단하지 않습니다. 대신 커널은 먼저 프로세스를 일시 중단합니다. 그런 다음 스왑 파일의 데이터를 다시 메모리에 복사하고 MMU를 재 프로그래밍합니다. 커널은 프로세스를 재개 할 것이고 프로세스는 언제나 존재했던 것처럼 메모리에 접근 할 것입니다. 프로세스가 걱정되는 한 특별한 일은 없었습니다. 이 프로세스는 수요 페이징으로 알려져 있습니다.

파일이 mmap 일 때 커널은 실제로 요청 페이징을 수행하지만 스왑 파일이 아닌 읽기 전용 파일에서 수행합니다. 과정은 완전히 동일합니다. CPU 액세스 예외로 인해 파일의 데이터가 정상 메모리로 액세스하는 RAM으로 읽혀집니다. 파일을 닫으면 메모리가 할당 취소 된 파일에 다시 기록됩니다. 가장 큰 장점은 포인터를 사용하여 파일의 데이터를 사용하는 것입니다.

희망 하시겠습니까?