
저는 칩셋 공급업체의 맞춤형 Embedded Linux 배포판에 애플리케이션 소프트웨어를 통합하는 중입니다. 제가 작업하고 있는 ARM 기반 제품입니다. 커널은 64비트로 구축되고 있지만 나머지 사용자 공간은 32비트인 것을 확인했습니다.
사용자 공간이 32비트임에도 불구하고 커널을 64비트로 구축하면 성능상의 이점이 있습니까? SOC는 ARM Cortex-a53을 기반으로 합니다.
누군가는 32비트의 사용자 공간을 가지면 사용자 공간에 대한 RAM 공간이 더 작아질 것이라고 제안했습니다. 커널에도 동일하게 적용되어야 하지만 커널은 64비트입니다. 성능 향상이 있을 것 같은데요?
하드웨어에 대한 구체적인 내용:
- ARM 피질 a53
- 1GB RAM
PS: 비공개 제한으로 인해 업체명을 공개할 수 없습니다.
답변1
Linux 프로세스의 가상 주소 공간은 두 가지 영역으로 나뉩니다.
- 커널 공간
- 사용자 공간.
32비트 아키텍처로 분할
arm 또는 i386과 같은 32비트 아키텍처에서는 아래와 같이 전통적인 분할이 3:1입니다.
+--------+ 0xffffffff
| Kernel |
+--------+ 0xc0000000
| |
| User |
| |
+--------+ 0x00000000
- 커널 공간 - 1GiB
- 사용자 공간 - 3GiB
따라서 커널은 한 번에 최대 1GiB의 물리적 메모리를 매핑할 수 있지만 나머지 물리적 메모리에 액세스하려면 임시 맵을 위한 가상 주소 공간이 필요하기 때문에 추가로 분할됩니다. 분할은 다음과 같습니다.
- 하위 896MiB(0xc0000000~0xf7ffffff)는 커널 물리적 주소 공간에 직접 매핑됩니다.
- 나머지 128MiB(0xf8000000 ~ 0xffffffff)는 커널에서 요청 시 높은 메모리에 매핑하는 데 사용됩니다.
배열은 다음과 같습니다.
physical memory 2 GiB
+------> +------------+
| | 1152 MiB |
| | |
+------------------+ 0xffffffff -----+ | HIGH MEM |
| On Demand 128MiB | | |
+------------------+ 0xf8000000 ------------> +------------+
| | ------+
| Direct mapped | +-----> +------------+
| 896 MiB | --+ | 896 MiB |
+------------------+ 0xc0000000 +---------> +------------+
따라서 Linux 커널은 highmem 인터페이스를 통해 2/4/6/8 GiB 범위에서 이 물리적 메모리에 대한 간접적인 액세스를 제공합니다. 그러나 임시 매핑을 생성하는 데에는 상당히 높은 비용이 발생할 수 있습니다. 아치는 커널의 페이지 테이블, 데이터 TLB 및/또는 MMU의 레지스터를 조작해야 합니다.
64비트 아키텍처
3G/1G 분할은 적용되지 않습니다. 거대한 주소 공간으로 인해 전체 물리적 메모리를 커널 주소 공간에 매핑할 수 있는 사용자 공간과 커널 공간 간의 분할 방식을 선택할 수 있습니다. 따라서 32비트 아키텍처에서 발생하는 임시 매핑의 모든 오버헤드를 절약할 수 있습니다.
높은 메모리 지원은 64비트 아키텍처의 Linux 커널의 경우 선택 사항이며 64비트 아키텍처의 Linux에서는 비활성화됩니다.
참조:Linux 높은 메모리 처리.