페이지 폴트 후에는 어떻게 되나요?

페이지 폴트 후에는 어떻게 되나요?

Linux 시스템에서 페이지 폴트가 발생하면 인터럽트 핸들러는 페이지 폴트가 발생한 이유를 찾아야 합니다. 하지만 어떻게?

  • 특별한 번호가 있나요? 그렇다면 이 숫자는 어디에 기록되어 있나요?
  • 예외를 발생시키기 전에 페이지 폴트의 원인을 알 수 있습니까?
    예를 들어.
    • 1 단계
      CPU를 통해 원인 찾기
    • 2 단계
      예외 발생

답변1

가상 주소에 대한 MMU 조회가 잘못된 설명자 또는 권한 부족을 나타내는 설명자(예: 읽기 전용 페이지에 쓰려는 시도)로 끝나기 때문에 메모리 액세스에 실패하면 페이지 오류가 발생합니다. 페이지 오류가 발생하면 프로세서는 여러 작업을 수행합니다. 세부 사항은 각 프로세서 아키텍처에 따라 다르지만 요점은 동일합니다.

  • 특권 모드(예: 커널 모드)로 전환합니다.
  • 적어도 오류의 성격과 오류 지점의 프로그램 카운터 및 프로세서 모드를 나타내도록 일부 레지스터를 설정합니다.
  • 레지스터에 의해 표시되거나 메모리의 특정 위치(페이지 폴트 핸들러의 주소)에서 조회된 메모리의 특정 주소로 점프합니다.

예를 들어 (32비트) ARM 프로세서의 경우:

  • 이것dfsr레지스터는 오류(읽기 또는 쓰기, 프로세서 명령, DMA 등으로 인한 것인지 여부)를 설명하는 값으로 설정됩니다.
  • 이것dfar레지스터는 오류를 일으킨 액세스 대상의 가상 주소로 설정됩니다.
  • 프로세서가 다음으로 전환됩니다.중단 모드(커널 수준 권한 중 하나모델).
  • 오류가 발생하면 이 lr레지스터는 프로그램 카운터로 설정되고, 오류가 발생하면 이 spsr레지스터는 프로그램 상태 레지스터( cpsr모드 비트 등을 포함하는 레지스터)로 설정됩니다.
  • sp레지스터는 cpsr저장됩니다. 중단 모드에서 마지막으로 설정된 값에서 복원됩니다.
  • 실행은 중단 벡터로 점프하며, 그 중 하나는예외 벡터.

페이지 오류 처리기의 코드는 운영 체제 커널의 일부입니다. 그 임무는 실패의 원인을 분석하고 조치를 취하는 것입니다. 오류의 성격에 대한 정보를 제공하는 특수 레지스터를 참조할 수 있으며, 필요한 경우 프로그램이 실행 중인 명령을 확인할 수 있습니다. 또한 MMU 테이블에서 설명자를 찾을 수도 있습니다. 유효하지 않은 설명자는 때때로 스왑 공간의 페이지 위치와 같은 정보를 인코딩할 수 있습니다. 커널은 모든 컨텍스트 전환에서 업데이트되는 전역 변수나 레지스터의 값을 살펴봄으로써 현재 어떤 작업이 실행되고 있는지를 알고 있습니다. 다음은 페이지 오류의 몇 가지 일반적인 동작입니다.

  • 프로세스의 메모리 맵에 대한 데이터는 페이지가 스왑된 상태에 있음을 나타냅니다. 커널은 사용 가능한 물리적 페이지를 찾고 디스크 캐시가 포함된 페이지를 삭제하거나 먼저 해당 내용을 스왑 영역에 저장하여 물리적 페이지를 획득합니다. 그런 다음 스왑의 데이터를 물리적 페이지로 로드하고 MMU 테이블을 변경하여 오류를 일으킨 가상 주소가 이제 프로세스의 MMU 맵에 있는 물리적 페이지에 연결됩니다. 마지막으로 커널은 오류를 일으킨 명령에서 프로세스로 다시 전환하도록 준비합니다. 이 시점에서 명령은 성공적으로 실행됩니다.
  • 프로세스 메모리 맵에 대한 데이터는 해당 페이지가 쓰기 시 복사 페이지이고 쓰기 액세스가 시도되었음을 나타냅니다. 이전 사례와 유사하게 커널은 예비 물리적 페이지를 확보하고 데이터를 여기에 복사하고(여기서는 읽기 전용 페이지에서) MMU 설명자를 변경하고 명령을 다시 실행하도록 프로세스를 예약합니다.
  • 프로세스 메모리 맵에 대한 데이터는 페이지가 매핑되지 않았거나 필요한 권한이 없음을 나타냅니다. 이 경우 커널은 SIGSEGV 신호(세그먼트 오류)를 프로세스에 전달합니다. 프로세스의 실행은 원래 위치가 아닌 신호 처리기에서 재개되지만 원래 위치는 스택에 저장됩니다. 프로세스에 SIGSEGV에 대한 핸들러가 없으면 종료됩니다.

메모리에 액세스하기 전에 가상 메모리 구성을 이해하고 확인하지 않으면 예외가 곧 발생하는지 판단하는 것이 불가능한 경우가 많습니다. 일반적인 동작 흐름은 페이지 폴트가 발생하면 프로세서가 페이지 폴트의 원인을 기록하는 것입니다.

관련 정보