페이지 오류가 발생하면 Unix는 오류 주소가 스왑 공간에 있는지 어떻게 확인합니까?

페이지 오류가 발생하면 Unix는 오류 주소가 스왑 공간에 있는지 어떻게 확인합니까?

프로세스의 가상 주소에서 페이지 오류가 발생하면 Linux/Unix 운영 체제는 해당 페이지(해당 가상 주소의)가 이전에 메모리에 존재하여 디스크로 교체되고 교체되었는지(즉, 페이지가 현재 메모리에 존재하는지) 어떻게 확인합니까? 스왑 공간)) 또는 페이지가 이전에 메모리에 로드된 적이 없습니까(즉, 페이지가 스왑 공간에 존재하지 않습니까)?

답변1

먼저 하드웨어 수준에서 무슨 일이 일어나고 있는지 살펴봐야 합니다. 페이지 폴트가 발생한 경우메모리 관리 유닛가상 주소를 역참조하려고 시도했지만 해당 주소에 대한 잘못된 설명이 발견되었습니다. 이런 일이 발생하면 프로세서는 트랩을 수행합니다. 즉, 커널 모드로 전환하고 미리 정의된 주소(트랩 벡터)로 점프한 다음 일부 레지스터를 채워 페이지 오류가 발생했음을 나타내고 커널이 무엇을 결정할 수 있을 만큼 충분한 정보를 제공합니다. 일어난. 어떤 주소가 요청되었는지, 어떤 명령으로 오류가 발생했는지, 어떤 작업에서 발생했는지. 여기서는 일반적인 아이디어를 제시했으며 세부 사항은 프로세서 아키텍처에 따라 다릅니다.

트랩 처리기 코드는 레지스터와 메모리를 검사하여 오류의 성격(다른 유형의 예외에 대해 동일한 처리기가 호출될 수 있음), 요청된 주소 및 이전에 활성화된 프로세스를 확인하는 커널의 일부입니다. 그런 다음 해당 주소의 해당 프로세스에서 매핑되어야 하는 내용을 나타내는 일부 데이터 구조를 찾습니다. 여기서도 데이터 구조의 특성은 프로세서 아키텍처와 Unix 변형 간에 다릅니다. 일부 프로세서 아키텍처에는 MMU가 스왑 섹터 번호를 저장하기 위해 해석하지 않는 잘못된 설명자에 충분한 비트가 있습니다. 이 경우 커널은 다른 데이터 구조를 참조할 필요가 없습니다. 그렇지 않은 경우 커널은 프로세스에 연결된 데이터 구조를 참조하고 해당 메모리 맵을 설명합니다.

동일한 메커니즘으로 다음과 같은 다른 사항도 결정할 수 있습니다.

  • 메모리 매핑된 파일의 경우 파일에서 페이지를 로드해야 합니다.
  • 메모리가 매핑되었지만 작업이 승인되지 않았습니다. 예를 들어 읽기 전용 메모리에 쓰려고 했습니다. 이 경우 커널은 프로세스의 SIGSEGV 신호(있는 경우)로 제어를 전환하도록 준비합니다. 그렇지 않으면 프로세스가 종료됩니다.
  • CPU 읽기 전용으로 표시되었지만 쓰기 중 복사로 표시된 페이지에 쓰려고 했습니다. 이 경우 커널은 페이지를 복사합니다.

커널이 프로세스에 필요한 내용이 포함된 페이지를 RAM에서 가져오면 이를 반영하기 위해 프로세스의 메모리 맵을 업데이트합니다. 그런 다음 커널은 컨텍스트 전환과 마찬가지로 프로세스에 제어권을 다시 전송하지만 프로세스에 의해 실행된 명령 직후에 제어권을 반환하는 대신 해당 명령 이전에 제어권을 반환하여 이번에는 성공적으로 잘못된 명령을 실행합니다.

답변2

운영 체제의 하위 수준 페이지 오류 처리기(CPU 트랩 테이블에 나열됨)는 CPU에서 오류 주소를 획득하고 이를 사용하여 프로세스 주소 공간 설명 테이블의 항목을 확인합니다. 이 테이블에는 각각 기본 주소와 크기가 포함된 세그먼트 설명자 목록이 포함되어 있습니다. 주소가 목록에 없는 경우. 운영 체제는 SIGSEGV(segmentati violati)를 보냅니다.

주소를 찾을 수 있는 경우 잘못된 주소를 포함하는 주소 범위를 담당하는 세그먼트 테이블 항목에는 관련 세그먼트 드라이버의 드라이버 기능에 대한 포인터도 포함됩니다.

세그먼트 드라이버는 VMEM 작업을 백그라운드 메모리로 관리합니다. 주소가 스왑 공간과 연결된 경우 담당 드라이버의 이름은 입니다 anon.

기본적으로 모든 파일 시스템 데이터 I/O 작업은 mmap()을 통해 처리되므로 각 파일 시스템마다 하나씩 많은 세그먼트 드라이버가 있습니다.

관련 정보