Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

ARM 프로세서 MMU(Memory Management Unit)

4.1. ARM 프로세서 MMU(Memory Management Unit)

ARM 리눅스를 시작하기 전에 ARM 프로세서에 대해 충분히 알아야 쉽게 이해할 수 있을 것이다. 그러나 모든 것을 다루긴 힘들고 여기선 MMU에 대해 다루고 가상 어드레스를 어떻게 이해하면 되는지 정도를 습득하면 되겠다.

이 절의 그림과 글은 모두 ARM architectural Reference Manual(Dave Jaggar저)를 바탕으로 번역했다.

4.1.1. 개요

ARM프로세서의 MMU는 다음의 큰 두가지 일을 한다.

  • 가상 어드레스를 물리 어드레스로 변환

  • 메모리 접근 권한 제어

그리고 MMU는 위의 일을 하기위해 다음과 같은 하드웨어를 갖고 있다.

  • 적어도 하나의 TLB(Translation Lookaside Buffer)

  • 접근 제어 로직

  • translation-table-walking 로직

4.1.1.1. TLB

TLB는 가상 어드레스를 물리 어드레스로 변환하는 것과 접근 권한을 캐싱하고 있다. 만약 TLB가 가상 어드레스에 대한 변환된 엔트리를 갖고 있다면 접근 제어 로직은 접근이 가능한지 판별한다. 접근이 허용된다면 MMU는 가상 어드레스에 대한 물리 어드레스를 출력해준다. 접근이 허용되지 않는 경우엔 MMU가 CPU에서 abort 시그널을 보낸다.

TLB가 없다면(가상 어드레스에 대한 변환된 엔트리를 갖고 있지 않다) 하드웨어를 움직이는 변환 테이블은 물리 메모리 내에 있는 변환 테이블에서 정보를 읽어온다. 일단 읽어온 후엔 그 정보가 TLB에 저장된다. 이 때 원래 있던 엔트리는 지워질 지워질 수도 있다.

4.1.1.2. 메모리 접근

MMU는 두 가지의 메모리 접근 방식을 지원한다.

  • 섹션

    1MB 블럭 단위로 메모리 제어

  • 페이지

    페이지 방식엔 또 두 가지 방식이 있다.

    • small page - 4kB 블럭 메모리

    • large page - 64kB 블럭 메모리

섹션과 큰페이지 방식은 TLB에 하나의 엔트리 만이 있을 때 큰 메모리 영역을 매핑하는데 사용된다. 추가로 작은 페이지 방식은 1kB 서브 페이지로 확장되고 큰 페이지 방식은 16kB로 확장 된다.

4.1.1.3. 변환 테이블

주 메모리 내의 변환 테이블은 두 가지 레벨을 갖고 있다.

  • 1 레벨 테이블

    섹션 변환과 섹션 레벨 테이블에 대한 포인터를 갖고 있다.

  • 2 레벨 테이블

    큰/작은 페이지 변환을 갖고 있다.

4.1.1.4. 도메인

MMU는 도메인이란 기능도 제공한다. 이 것은 개별적 접근 권한을 갖도록 정의된 메모리 영역을 말한다. DACR(Domain Access Control Register)를 사용해 16개 까지의 도메인을 지정할 수 있다.

MMU가 off 상태일 때(프로세서가 리셋된 직후가 이렇다) 가상 어드레스의 출력은 직접 물리 어드레스를 가리키고 메모리 접근 권한 검사는 하지 않는다.

두 TLB 엔트리가 중첩된 메모리 영역을 가리는 경우는 예측할 수 없는 일이 발생한다. 이런 경우는 다른 크기의 페이지로 재 매핑된 후 TLB를 갱신하지 않아 발생할 수 있다.

4.1.2. 변환 절차

MMU는 CPU에의해 만들어진 가상 어드레스를 외부 메모리에 접근하기 위한 물리 어드레스로 변환한다. 그리고 접근 권한 검사도 병행한다. 어드레스가 변환되는 방식은 섹션 방식인가 페이지 방식(페이지 방식엔 또 두 가지 크기의 페이지가 있다)인가에따라 3가지가 있다.

그러나 변환 절차는 언제나 같은 식으로 1레벨 읽기로부터 시작된다. 섹션 방식은 1레벨만 필요하고 페이지 방식은 2레벨도 사용해야한다.

4.1.3. 변환 테이블 베이스

변환 절차는 요청된 가상 어드레스에 대한 엔트리가 칩에 내장된 TLB에 없을 때부터 시작된다. TTBR(Translation Table Base Register)는 1레벨 테이블의 베이스를 가리키고 TTBR의 14에서 31 비트만이 사용된다. 나머지는 0이어야한다. 그러므로 1레벨 페이지 테이블은 반드시 16KB 단위로 정렬되야한다(214=16384).

4.1.4. 1레벨 읽기

TTBR의 비트 31:14는 그림 4-1에서 보듯이 30비트 어드레스를 만들기 위해 가상 어드레스의 31:20 비트와 연결된다. 이 어드레스는 섹션용 1레벨 디스크립나 2레벨 페이지 테이블 포인터용 디스크립터를 나타내는 4바이트 길이의 변환 테이블 엔트리를 선택한다.

그림 4-1. 변환 테이블 1레벨 디스크립터 접근

attachment:accessing-the-translation-table-first-level-descriptors.png

4.1.5. 1레벨 디스크립터

1레벨 디스크립터는 섹션 디스크립터나 2레벨 페이지 테이블 포인터가 될 수 있고 포맷을 그에 따라 변한다. 그림 4-2에서 비트 1:0이 디스크립터 타입을 나타낸다.

비트 1:0이 00인 디스크립터를 사용하면 변환 폴트를 발생한다. 비트 1:0이 11인 디스크립터는 어떻게 동작할지 모른다.

그림 4-2. 1레벨 디스크립터 포맷

attachment:first-level-descriptor-format.png

4.1.6. 섹션 디스크립터와 섹션 변환

그림 4-3은 섹션 변환 전체를 나타낸다. 1레벨 디스크립터에 포함된 접근 권한은 물리 어드레스를 만들어내기 전에 먼저 체크된다.

그림 4-3. 섹션 변환

attachment:section-translation.png

1레벨 디스크립터가 섹션 디스크립터인 경우 각 필드는 다음과 같은 의미를 갖는다.

표 4-1. 섹션 디스크립터 필드

비트 1:0디스크립터의 타입을 나타냄(10은 섹션 디스크립터를 의미함)
비트 3:2캐시가능, 버퍼가능 비트
비트 4이 비트의 의미는 'IMPLEMENTATION DEPENDENt'
비트 8:5이 디스크립터에 의해 조정되는 모든 페이지에 대한 16개 까지의 도메인 지정
비트 9사용되지 않음. SHOULD BE ZERO
비트 11:10접근 권한
비트 19:12사용되지 않음. SHOULD BE ZERO
비트 31:20물리 어드레스의 상위 12비트를 구성하는 섹션 베이스 어드레스

4.1.7. 페이지 테이블 디스크립터

페이지 테이블 디스크립터를 1레벨에서 읽고나면 2레벨 디스크립터 읽기가 시작된다. 그림 4-4에 나타나 있다.

그림 4-4. 2레벨 디스크립터 접근

<IMG attachment:accessing-the-translation-table-second-level-desctiptors.png

1레벨 디스크립터가 페이지 테이블 디스크립터인 경우 각 필드는 다음과 같은 의미를 갖는다.

표 4-2. 페이지 디스크립터 필드

비트 1:0디스크립터의 타입을 나타냄(01은 페이지 디스크립터를 의미함)
비트 4:2이 비트의 의미는 'IMPLEMENTATION DEPENDENt'
비트 8:5이 디스크립터에 의해 조정되는 모든 페이지에 대한 16개 까지의 도메인 지정
비트 9사용되지 않음. SHOULD BE ZERO
비트 31:10페이지 테이블 베이스 어드레스는 2레벨 페이지 테이블 포인터이다. 2레벨 페이지 테이블은 1KB로 정렬되야한다(210=1024)

4.1.8. 2레벨 디스크립터

2레벨 디스크립터는 큰페이지 혹은 작은 페이지로 정의된다.

그림 4-5. 2레벨 디스크립터 포맷

attachment:second-level-descriptor-format.png

각필드는 다음과 같은 의미를 갖는다.

표 4-3. 2레벨 디스크립터 포맷

비트 1:0디스크립터의 타입을 나타냄
비트 3:2캐시가능, 버퍼 가능 비트
비트 11:4접근 권한
비트 15:12사용되지 않음. SHOULD BE ZERO
비트 31:12작은 페이지 모드에서 물리 어드레스를 만드는데 사용됨
비트 31:16큰 페이지 모드에서 물리 어드레스를 만드는데 사용됨

비트 11:4의 접근 권한은 다음과 같은 4가지의 서브 페이지로 나뉜다.

표 4-4. 2레벨 디스크립터 접근 권한

AP01서브 페이지에 대한 접근 권한
AP12서브 페이지에 대한 접근 권한
AP23서브 페이지에 대한 접근 권한
AP34서브 페이지에 대한 접근 권한

4.1.9. 큰 페이지 변환

그림 4-6은 큰 페이지 변환을 나타낸다. 페이지 인텍스의 상위 4비트와 2레벨 테이블 인덱스의 하위 4비트는 서로 겹치는데 큰 페이지에 대한 각 페이지 테이블 엔트리는 페이지 테이블 내에 16번 복사되야한다.

그림 4-6. 큰 페이지 변환

attachment:large-page-translation.png

4.1.10. 작은 페이지 변환

그림 4-7은 작은 페이지 변환을 나타낸다.

그림 4-7. 작은 페이지 변환

attachment:small-page-translation.png

4.1.11. 캐시와 쓰기 버퍼 제어

ARM 메모리 시스템은 각 가상 페이지 마다 개별적으로 선택 가능한 두가지 속성에 의해 제어된다.

표 4-5. 메모리 시스템 속성

Cacheable이 속성은 페이지 내의 데이터가 캐시될 수 있음을 나타낸다. 이렇게하면 다음 이어지는 동작은 메인 메모리를 읽을 필요가 없게된다. 또 현재 실행점을 넘어 미리 명령을 읽을수 있음을 나타내기도 한다. 캐시는 write-back 혹은 write-through로 만들어질 수 있다(각 가상 페이지마다 개별적으로 설정할 수 있다).
Bufferable페이지 내의 데이터가 쓰기 버퍼에 저장될 수 있음을 나타내고 이렇게하면 메인 메모리보다 빠른 동작을 할수 있게 된다. 쓰기 버퍼는 정확한 쓰기 명령을 보장하지 않는다. 그러므로 같은 위치에 대한 여러번의 쓰기 동작이 여러 번의 외부 쓰기 동작을 한다는 보장은 없다.

캐시와 쓰기 버퍼 비트 값은 다음과 같은 의미를 갖는다.

표 4-6. 캐시, 쓰기 버퍼 비트의 의미

CB의미
00캐시 불가능, 쓰기 버퍼 불가능
01캐시 불가능, 쓰기 버퍼 동작
10캐시 동작, 쓰기 버퍼 불가능 혹은 write-through 캐시, 쓰기 버퍼 동작
11캐시 동작, 쓰기 버퍼 동작 혹은 write-back 캐시, 쓰기 버퍼 동작

두가지 타입의 캐시를 모두 지원하려면 10으로 write-through, 11으로 writeback 캐시를 지정한다. 어느 한가지 타입의 캐시만을 지원하려면 C와 B 비트를 엄격히 적용해 캐시 가능과 쓰기 버퍼 가능이 각각 동작하도록 한다.

4.1.12. 접근 권한

섹션과 페이지 디스크립터 내의 접근 권한 비트는 해당 섹션이나 페이지의접근을 제어한다. 접근 권한은 시스템(S)과 롬(R) 제어 비트에 의해 변경된다. 테이블은 S, R 비트와 결합된 접근 권한 비트의 의미를 나타낸다. 필요한 권한 없이 메모리에 접근하면 퍼미션 폴트가 발생한다.

표 4-7. 접근 권한

APSR권한
수퍼바이저유저
0000접근 불가접근 불가
0010읽기만 가능접근 불가
0001읽기만 가능읽기만 가능
0011예측 불가능
01xx읽기/쓰기접근 불가능
10xx읽기/쓰기읽기만 가능
11xx읽기/쓰기읽기/쓰기