리눅스를 비롯한 대부분의 운영체제에서는 가상 메모리를 메모리 관리 기법으로 활용합니다. 이번에는 가상 메모리와 물리 주소에 대해 알아보고 가상 메모리 기법이 적용된 이유를 알아봅시다.

대부분의 운영체제는 다양한 메모리(DRAM) 상에서 실행될 수 있는데, 다음 그림은 가상 메모리 기법을 적용하기 전의 시스템 구조도입니다.
 

그림 19.2 물리 메모리와 메모리 시스템의 관계

물리 메모리가 '물리 메모리 A' ~ '물리 메모리 D'까지 있습니다. 만약 소프트웨어 개발자가 물리 메모리 타입에 따라 주소 오프셋을 변경하는 설정을 하거나 추가로 물리 메모리와 관련된 설정을 하면 소프트웨어의 복잡도가 많이 늘어날 수 있습니다. 물리 메모리에 대한 예외 상황을 점검해야 하니 골치가 아플 것입니다.

하드웨어 측면에서는 다양한 메모리 공급사가 있으며, 대표적인 업체로 삼성전자, 하이닉스, 도시바를 예로 들 수 있습니다. 또한 SoC 업체(브로드컴, 인텔, 퀄컴)별로 서로 다른 물리 메모리 맵을 구성하며, 리눅스 커널와 같은 운영체제 커널이 실행하는 물리 메모리의 주소가 다릅니다. 다음 그림에서 Soc A는 0x8000_0000 물리 주소에 '리눅스 커널' 이미지를 실행하고, SoC B는 0x4000_0000 물리 주소에서 '리눅스 커널' 이미지를 실행합니다.   

 

그림 19.3 SoC 벤더별 메모리 맵

그런데 만약 프로세스 입장에서 물리 메모리별로 서로 다른 주소에 접근한다면 시스템 복잡도가 높아질 것입니다. 물리 메모리별로 무엇인가 따로 설정을 해야 하기 때문입니다. 그런데 가상 메모리 기법을 적용하면 시스템의 전체 구조를 다음과 같이 그릴 수 있습니다. 

 

그림 19.4 가상 메모리 기법을 적용한 메모리 시스템의 전체 구조

시스템 소프트웨어 개발자 입장에서는 가상 메모리 범위 내의 가상 주소 처리에만 신경 쓰면 됩니다. 시스템에 어떤 물리 메모리를 탑재했는지 걱정할 필요가 없습니다.

MMU(Memory Management Unit)란 무엇일까요? 가상 주소를 물리 주소로 변환하는 일을 하는 주인공이 MMU입니다. MMU는 하드웨어 블록으로 Arm 프로세서 내부에 존재합니다. MMU를 눈으로 직접 확인하고 싶지만 Arm 코어와 함께 MMU가 내부에 실장돼 있어 확인할 수는 없습니다.

최근에 개발되는 대부분 시스템에서 프로세스는 MMU를 활성화한 상태에서 실행됩니다. 그래서 MMU를 활성화하면 운영체제에서 실행되는 프로세스가 바라보는 주소는 가상 주소입니다. 여기서 ‘가상’이라는 용어는 말 그대로 세상에 존재하지 않는 논리적인 개념으로 볼 수 있습니다. 그런데 가상 주소가 존재하려면 MMU가 있어야 하는데, MMU의 역할은 가상 주소를 물리 주소로 변환하는 것입니다.

그렇다면 MMU는 가상 주소를 물리 주소로 어떻게 바꿀까요? MMU 내에는 TLB(Translation Lookaside Buffer)가 있는데, 이 버퍼는 페이지 테이블 레코드 정보를 담고 있습니다. TLB 에는 최근에 변환된 가상 주소에 대한 페이지 테이블 정보가 들어있고, 이 정보를 참고해 가상 주소를 물리 주소로 변환합니다.

Arm에서 제공하는 메모리 아키텍처에서 MMU는 가장 중요한 기능이므로 잘 익혀둡시다. 좀 더 자세한 내용은 19.2절 'MMU의 세부 동작'에서 설명합니다.


[정보] MMU와 운영체제
대부분 CPU 코어 위에서 운영체제가 실행되는데 CPU의 특징을 잘 알아야 운영체제의 세부 동작 원리도 잘 파악할 수 있습니다. 이를 메모리 관점에서 "운영체제에서 메모리를 관리하는 주요 기능은 CPU에서 지원하는 MMU를 활용한다"라고 설명할 수 있습니다.


 

 

Arm 아키텍처에서 메모리 매니지먼트란 무엇일까요? Arm 아키텍처에서 메모리와 관련된 내용을 다룰 때 '메모리 매니지먼트'와 MMU를 함께 설명하는 경우가 많아 메모리 매니지먼트에 대해 한 문장으로 정의하기 어렵습니다. Arm 아키텍처에서 메모리 매니지먼트는 다음과 같은 기능을 활용해 운영체제 커널에서 메모리 관련 시스템을 구축할 수 있는 환경을 제공하는 것입니다.

 MMU: 가상 주소를 물리 주소로 변환
 메모리 컨트롤 레지스터: MMU와 메모리 시스템 관련 속성 설정 

그렇다면 MMU는 무엇일까요? 가상 주소를 물리 주소로 변환하는 일을 하는 하드웨어 블록을 MMU라고 합니다.

메모리 매니지먼트의 전체 구조

다음 그림을 보면서 메모리 매니지먼트를 구성하는 주요 기능에 대해 알아봅시다.

 

그림 19.1 가상 주소가 물리 메모리에 접근하는 과정

그림에서 먼저 ①로 표시된 부분을 봅시다. ①은 CPU 코어 입장에서 바라보는 주소를 나타내며, 이는 가상 주소입니다. ②로 표시된 박스는 MMU이며, CPU 코어에서 접근하는 가상 주소를 물리 주소로 변환하는 역할을 맡습니다. MMU가 가상 주소를 물리 주소로 변환할 때 주소 변환 테이블 정보가 있는 페이지 테이블을 참고합니다. ③에 표시된 박스는 주소 변환 정보를 지닌 페이지 테이블을 나타냅니다. 

MMU는 CPU 코어가 접근하는 가상 주소인 ①에 해당되는 주소 변환 정보가 ③으로 표시된 페이지 테이블에 있는지 체크합니다. 이 정보가 페이지 테이블에 있으면 ④와 같이 물리 주소가 존재하는 메인 메모리에 접근합니다. 메인 메모리에 존재하는 데이터나 명령어를 로딩하는데, 이는 그림에서 ⑤에 해당됩니다.

만약 CPU 코어가 접근하는 가상 주소의 변환 정보가 페이지 테이블에 없으면 폴트(fault)를 유발하는데, 이는 ⑥에서 표시된 부분에 해당합니다. 익셉션 관점에서 Synchronous 익셉션이 유발됩니다.

소프트웨어 관점에서는 어셈블리 명령어로 구성된 루틴에서 메모리에 접근해 데이터를 읽는 코드를 보면 명령어가 한 줄씩 실행되는 것처럼 보입니다. 하지만 그림 19.1에서 표시된 전체 구조 내에서 주소가 처리됩니다.

[정보] 그림 19.1의 전체 구조에 대해

그림 19.1의 전체 구조는 메모리 시스템이 큰 그림에서 어떤 방식으로 동작하는지를 간단한 구조로 표현한 것입니다. 실제 메모리 시스템은 이보다 더 복잡한 구조로 구성돼 있습니다.


실전 개발에서 메모리 매니지먼트 

'메모리 매니지먼트'와 관련된 기능은 실전 개발에 어떻게 활용될까요? 다음과 같은 업무를 진행할 때 알아야 하는 기반 지식이 메모리 매니지먼트입니다.

 메모리 컨트롤 레지스터 설정
 MMU 관련 레지스터 설정
 캐시나 메모리를 설정하는 명령어 실행
 가상 주소 맵 변경

특히 브링업할 때 메모리 시스템을 구성하는 MMU와 캐시를 설정합니다. 이때 메모리 매니지먼트와 관련된 내용을 알아야 시스템을 제대로 브링업할 수 있습니다.

또한 크래시와 같은 신뢰성 이슈를 잘 해결하기 위한 기반 지식이 메모리 매니지먼트입니다. Arm 아키텍처 관점에서 크래시는 메모리 어보트로 볼 수 있는데, 메모리 어보트로 발생하는 원인의 절반 이상이 메모리 매니지먼트와 관련돼 있습니다. 몇 가지 예를 들면 다음과 같습니다.

 PC 얼라이먼트, SP 얼라이먼트
 메모리 권한 속성 오류로 인한 페이지 폴트
 가상 주소 변환 오류

메모리 매니지먼트를 이루는 지식은 메모리 어보트로 유발된 다양한 문제를 잘 해결할 수 있는 기반 지식입니다.

마지막으로 성능을 최적화하기 위한 기반 지식도 메모리 매니지먼트입니다. L1, L2 캐시 설정, 캐시 정책, 변환 테이블 처리 방식과 같이 메모리 시스템을 설정하는 방식이 성능에 많은 영향을 끼칠 수 있습니다.  

+ Recent posts