Linux에서 높은 메모리와 낮은 메모리란 무엇입니까?

Linux에서 높은 메모리와 낮은 메모리란 무엇입니까?

Highmem과 Lowmem의 차이점에 관심이 있습니다.

  1. 왜 그런 차이가 있습니까?
  2. 이렇게 함으로써 우리는 무엇을 얻나요?
  3. 각각의 특징은 무엇입니까?

답변1

32비트 아키텍처에서 RAM 주소 지정을 위한 주소 공간 범위는 다음과 같습니다.

0x00000000 - 0xffffffff

또는 4'294'967'295(4GB).

Linux 커널은 3/1(아마도 2/2 또는 1/3 1 )을 사용자 공간(높은 메모리)과 커널 공간(낮은 메모리)으로 나눕니다.

사용자 공간 범위:

0x00000000 - 0xbfffffff

새로 생성된 각 사용자 프로세스에는 이 영역 내의 주소(범위)가 제공됩니다. 사용자 프로세스는 일반적으로 신뢰할 수 없으므로 커널 공간에 액세스하는 것이 금지됩니다. 또한 이는 긴급하지 않은 것으로 간주되며 일반적으로 커널은 이러한 프로세스에 대한 메모리 할당을 연기하려고 시도합니다.

커널 공간 범위:

0xc0000000 - 0xffffffff

이것은 커널 프로세스가 주소(범위)를 얻는 곳입니다. 커널은 이 1GB 주소에 직접 액세스할 수 있습니다(물론 전체 1GB가 아니라 고급 메모리 액세스용으로 128MB가 예약되어 있습니다).

커널 공간에서 생성된 프로세스는 신뢰할 수 있고 긴급하며 오류가 없다고 가정하면 메모리 요청이 즉시 처리됩니다.

원하는 경우 각 커널 프로세스는 사용자 공간 범위에 액세스할 수도 있습니다. 이를 달성하기 위해 커널은 사용자 공간(높은 메모리)의 주소를 커널 공간(낮은 메모리)으로 매핑하며 위에서 언급한 128MB는 이를 위해 특별히 예약되어 있습니다.


1 분할이 3/1, 2/2 또는 1/3 인지는 옵션에 의해 제어됩니다. 커널에 어떤 옵션이 선택되어 있는지 확인할 CONFIG_VMSPLIT_...수 있습니다 ./boot/config*

답변2

첫 번째 참고자료는리눅스 장치 드라이버(온라인이나 책 형태로 이용 가능), 특히.제15장이 주제에 대한 섹션이 있습니다.

이상적인 세계에서는 각 시스템 구성 요소가 액세스해야 하는 모든 메모리를 매핑할 수 있습니다. 이는 Linux 및 대부분의 운영 체제의 프로세스에 해당됩니다. 32비트 프로세스는 2^32바이트보다 약간 작은 가상 메모리(실제로 일반적인 Linux 32비트 아키텍처에서 약 3GB)에만 액세스할 수 있습니다. 이는 시스템 호출을 실행하는 프로세스의 전체 메모리와 전체 물리적 메모리 및 기타 메모리 매핑된 하드웨어 장치를 매핑할 수 있어야 하는 커널의 경우 어려워집니다.

따라서 32비트 커널이 4GB 이상의 메모리를 매핑해야 하는 경우 높은 메모리를 지원하도록 컴파일해야 합니다. 대용량 메모리는 커널 주소 공간에 영구적으로 매핑되지 않는 메모리입니다. (낮은 메모리의 경우 그 반대입니다. 항상 매핑되므로 포인터를 역참조하는 것만으로 커널에서 액세스할 수 있습니다.)

커널 코드에서 높은 메모리에 액세스할 때 kmap먼저 호출하여 페이지 데이터 구조()에서 포인터를 가져와야 합니다 struct page. kmap호출은 페이지가 높은 메모리에 있든 낮은 메모리에 있든 상관없이 작동합니다. kmap_atomic제약 조건을 추가하지만 더 세분화된 잠금을 사용하기 때문에 다중 프로세서 시스템에서 더 효율적인 것도 있습니다 . 획득한 포인터 kmap는 리소스입니다. 주소 공간을 차지합니다. 완료되면 kunmap(또는 kunmap_atomic)을 호출하여 리소스를 해제해야 합니다. 그러면 포인터가 더 이상 유효하지 않으며 다시 호출할 때까지 페이지 내용에 액세스할 수 없습니다 kmap.

답변3

이는 Linux 커널과 관련이 있습니다. Unix 커널이 이를 어떻게 처리하는지 잘 모르겠습니다.

대용량 메모리는 사용자 공간 프로그램이 주소를 지정할 수 있는 메모리 세그먼트입니다. 메모리 부족을 건드릴 수 없습니다.

낮은 메모리는 Linux 커널이 직접 해결할 수 있는 메모리 세그먼트입니다. 커널이 높은 메모리에 액세스해야 하는 경우 먼저 이를 자체 주소 공간에 매핑해야 합니다.

클립 위치를 제어할 수 있는 패치가 최근 출시되었습니다. 단점은 커널이 사용하기 전에 매핑할 필요가 없는 더 많은 메모리를 가질 수 있도록 사용자 공간에서 주소 지정 가능한 메모리를 가져오는 것입니다.

추가 리소스:

답변4

Linux 커널 메모리 공간과 관련된 설명을 찾는 사람들은 다음을 참고하세요.두 가지 상충되는 정의높은/낮은 메모리 분할(안타깝게도 표준이 없으므로 상황에 맞게 해석해야 함):

  • "상위 메모리"는 커널 공간의 합으로 정의됩니다.가상메모리. 커널만 접근할 수 있는 영역으로 .보다 크거나 같은 모든 가상 주소를 포함합니다 PAGE_OFFSET. 따라서 "낮은 메모리"는 각 사용자 프로세스에서 액세스할 수 있는 사용자 공간 메모리에 해당하는 나머지 주소 영역을 나타냅니다.

    예: 기본값이 32비트 x86에서 PAGE_OFFSET이는 상위 메모리가 임의의 주소 ADDR( ADDR ≥ 0xC0000000 = PAGE_OFFSET예: 더 높은 1GB)임을 의미합니다.

    이것이 Linux 32비트 프로세스가 일반적으로 3GB로 제한되는 이유입니다. PAGE_OFFSET직접 구성할 수 없으며 구성 가능한 옵션 VMSPLIT_x(원천).

    요약하자면, 32비트 아키텍처에서 가상 메모리는 기본적으로 하위 3GB(사용자 공간)와 상위 1GB(커널 공간)로 나뉩니다.

    64비트의 경우 PAGE_OFFSET구성할 수 없으며 커널 로딩 중 런타임 시 가끔 감지되는 아키텍처 세부 사항에 따라 달라집니다.

    x86_64에서 4레벨 페이징(일반) 및 PAGE_OFFSET5 레벨 페이징(0xffff8880000000000xff11000000000000원천). ARM64의 경우 이는 일반적으로 사실입니다 0x8000000000000000. 그러나 KASLR이 활성화된 경우 이 값은 의도적으로 예측할 수 없습니다.


  • "고급 메모리"는 다음과 같이 정의됩니다.물리적나머지 커널 가상 메모리와 연속적으로 매핑할 수 없는 메모리입니다. 커널의 가상 주소 공간의 일부는 단일 연속 블록으로 소위 물리적 "낮은 메모리"에 매핑될 수 있습니다. 이것이 의미하는 바를 완전히 이해하려면 Linux 가상 메모리 공간에 대한 더 깊은 이해가 필요합니다. 합격을 추천드립니다이 슬라이드.

    슬라이드에서:

    대용량 메모리 맵

    이 "높은/낮은 메모리" 구분은 설치된 물리적 RAM의 크기가 상대적으로 큰(약 1GB 이상) 32비트 아키텍처에만 적용됩니다. 그렇지 않은 경우, 즉 물리적 주소 공간이 작거나(<1GB) 가상 메모리 공간이 큰 경우(64비트) 커널 가상 메모리 공간에서 전체 물리적 공간에 접근할 수 있습니다. 이 경우 모든 실제 메모리는 "메모리 부족"으로 간주됩니다.

    고급 메모리가 전혀 존재하지 않는다면 더 좋을 것입니다. 전체 물리적 공간을 커널에서 직접 액세스할 수 있어 메모리 관리가 더 간단하고 효율적이기 때문입니다. 이는 DMA(일반적으로 물리적으로 연속적인 메모리가 필요함)를 처리할 때 특히 중요합니다.

    또한보십시오@gilles의 답변

관련 정보