커널은 스왑 파티션이나 스왑 파일의 스왑 메모리 페이지를 어떻게 처리합니까?

커널은 스왑 파티션이나 스왑 파일의 스왑 메모리 페이지를 어떻게 처리합니까?

스왑 파티션에는 구조화된 파일 시스템이 포함되어 있지 않습니다. 커널은 스왑 영역으로 표시된 파티션에 메모리 페이지를 저장하기 때문에 필요하지 않습니다. 스왑 영역에 여러 메모리 페이지가 있을 수 있으므로 프로세스가 해당 페이지를 메모리에 로드하도록 요청할 때 커널은 각 페이지를 어떻게 찾습니까? 더 자세히 설명하겠습니다. Devuan OS에서 스왑 파티션의 헤더를 확인하세요.

#define SWAP_UUID_LENGTH 16
#define SWAP_LABEL_LENGTH 16
struct swap_header_v1_2 {
    char          bootbits[1024];    /* Space for disklabel etc. */
    unsigned int  version;
    unsigned int  last_page;
    unsigned int  nr_badpages;
    unsigned char uuid[SWAP_UUID_LENGTH];
    char          volume_name[SWAP_LABEL_LENGTH];
    unsigned int  padding[117];
    unsigned int  badpages[1];
};

따라서 mkswap파티션에서 명령이 실행되면 해당 파티션에 스왑 헤더가 배치됩니다.

이제 "프로세스 A"의 메모리 페이지가 스왑되어 스왑 영역에 메모리 페이지가 있는 시나리오를 가정해 보겠습니다. 물론 스왑 영역에는 많은 메모리 페이지가 있을 수 있다. "프로세스 A"는 스왑된 메모리 페이지에 액세스해야 합니다. "프로세스 A"는 커널에 스왑된 메모리 페이지를 얻을 수 있는지 알려줍니다. 커널은 이렇게 말했습니다: 물론이죠, 친애하는 친구여. 커널은 스왑 파티션에서 "프로세스 A"의 메모리 페이지를 찾습니다. 스왑 파티션은 복잡한 구조(파일 시스템이 아님)가 아니기 때문에 커널은 스왑 파티션에서 "프로세스 A"의 특정 메모리 페이지를 찾는 방법을 어떻게 알 수 있습니까?

커널은 이러한 스왑 페이지의 섹터 주소를 어딘가에 저장하므로 프로세스가 메모리 페이지를 요청할 때 커널은 스왑 파티션에서 위치를 찾고 파티션에서 메모리 페이지를 읽어 메모리에 로드하는 방법을 알고 있습니다.

답변1

스와핑은 특정 부팅 중에만 유효하므로 모든 추적 정보는 메모리에 보관됩니다. 페이지 내부 및 외부 교체는 전적으로 커널에 의해 처리되며 프로세스에 투명합니다. 기본적으로 메모리는 페이지로 나누어져 있으며 페이지 테이블에서 추적됩니다. 이는 각 CPU 아키텍처에 의해 정의된 구조입니다. 페이지가 교체되면 커널은 이를 유효하지 않은 것으로 표시합니다. 따라서 다음에 페이지에 액세스하려고 하면 CPU에 오류가 발생하여 커널의 핸들러가 호출됩니다. 페이지.

리눅스에는swap_info구조각 전환 장치 또는 파일에 대해 설명합니다. 이 구조 내에서swap_map메모리 페이지를 스왑 장치 또는 파일의 블록에 매핑합니다. 페이지가 교체되면 커널은 해당 페이지 테이블 항목에 swap_info인덱스와 swap_map오프셋을 저장하므로 필요할 때 디스크에서 페이지를 찾을 수 있습니다. (지원되는 모든 아키텍처는 페이지 테이블에 이를 위한 충분한 공간을 제공하지만 제한 사항이 있습니다.예를 들어여유 공간은 Linux가 x86에서 최대 64GiB의 스왑 공간을 관리할 수 있음을 의미합니다. )

자세한 설명은 다음에서 확인하실 수 있습니다."교환 관리" 장멜 고먼의Linux 가상 메모리 관리자 이해.

관련 정보