mmap - 2^48 이상의 주소에 매핑

mmap - 2^48 이상의 주소에 매핑

64비트 PC에서 사용되는 주소 공간은 이라는 것을 알고 있지만 mmap을 사용하여 파일을 2 48[0,2^48) 이상의 주소에 매핑할 수 있습니까 ?

아래 코드를 작성했는데, 매핑된 주소가 아직 내부에 있는 것을 발견했습니다 [0,2^48).

int
main(void) {
    const char* name = "/tmp/file";

    int fd = open(name, O_RDONLY);
    if (fd < 0) {
        perror("open");
        exit(-1);
    }

    int pageSize = sysconf(_SC_PAGE_SIZE);
    void* targetAddr = (void*)(0UL - pageSize);

    char* str = mmap(targetAddr, pageSize, PROT_READ, MAP_SHARED, fd, 0);
    if (str == MAP_FAILED) {
        perror("mmap");
        exit(-1);
    }

    printf("addr: %p\n", str);

    return 0;
}

예제 출력:addr: 0x7fc761f6f000

일부 파일을 2 48 이상의 주소 로 매핑하는 것이 가능합니까 mmap?

그렇지 않다면 "사용되지 않는" bit48-bit63을 어떻게 활용할 수 있습니까?

주소의 상위 비트를 활용하는 방법이 궁금합니다.

운영 체제: Ubuntu16.04

메모리 크기: 4GB

답변1

5단계 페이지 테이블을 활성화했거나(56비트 가상 주소 공간 제공) 커널에 있는 경우(주소 공간의 상위 절반 사용) 2 48 이상의 항목만 매핑할 수 있습니다.

"사용된" 비트 위의 비트는 사용되지 않고 예약되어 있으며 최상위 사용 비트와 동일해야 합니다. x86-64 정의정식 형식여기서 사용자 공간의 주소는 모두 0비트로 시작하고 커널 공간의 주소는 모두 1비트로 시작합니다. 당신은 또한 볼 수 있습니다커널 메모리 맵.

관련 정보