강좌 & 팁
글 수 2,412
2011.08.21 02:08:15 (*.138.143.120)
43937
이글은 ARMv6 에서 해당되는 내용이며, 향후 버전에서는 달라질수 있다.
MMU에서는 memory 의 접근 제어를 3가지 속성에 따라 제어한다.
Memory Access Control
1. Domain
2. Access Permission
3. Execute never bit s in the TLB entry
먼저 domain 은 CP15 레지스터의 32비트의 c3 레지스터에서 설정을 하고 있으며,
domain 의 속성은 2개의 비트를 이용해서 16개까지 만들수 있다.
각 값들은 아래와 같은 속성을 갖는다.
0 : No access
1 : Client – TLB entry 의 AP 에 의해서 접근 권한이 설정되며,
또한 CP15 의 C1 에서 S, R 비트에 의해서도 제어되나 사용되지 않는다.
2 : Managers – 접근에 제한을 두지 않는다. 따라서 permission fault 가 발생하지 않는다
CP1 레지스트에 있는 S,R 비트의 경우 compatible 을 위해서 0으로 세팅된다.
L1 table 의 경우 Bit[8-5] 의 4개의 비트를 사용해서 domain 을 정할수 있게 된다.
실제로는 대부분 Client 로 설정이 되어 TLB 에 있는 APX, AP 설정을 따른다.
Access Permision 의 경우 armv6 이전 모드에서는 AP 만 존재하고
ARMv6 부터는 APX 와 AP 두가지가 존재한다.
간단히 살펴보면 APX 가 설정되면 수퍼권한과 유저권한 모두 Reserved/read-only 의 속성을 갖게 된다.
APX 가 0 이 되면 AP 의 값에 따라 수퍼권한에서와 유저권한에서 그 설정이 달라진다.
AP 수퍼권한 유저권한
00 No, access No, access
01 Read/Write No, access
10 Read/Write Read-only
11 Read/Write Read-Write
위의 표에서와 같이 AP 값은 접근 모드에 따라 다른 권한을 갖게 되면 유저권한으로는 수퍼권한에 있는
데이타에 대한 수정이나 접근이 금지 될수 있다.
XN : Execute never bits int the TLB entry
모든 메모리 영역에 걸쳐서 실행코드를 갖고 있는 것은 아니다
XN bit 가 TLB entry 에 1로 세팅되어 있다면, 명령어를 수행할때 permission fault 를 발생시킬 것이다.
XN bit 가 TLB entry 에 0으로 세팅되어 있다면 해당 영역에서 명령어를 수행할수 있게 된다.
ARMv6 모드에서 XP(23번)비트가 활성화 되어 있다면 XN bit 의 값에 따라 명령어의 수행은 제한을 받게 된다.
응용프로그램을 하나 실행시키고 해당 프로세스의 MMU table을 분석해서 위의 내용을 확인해 본다.
[root@falinux ~]$ insmod dump_mm_table.ko
PAGE SEARCH START
*** insmod [1143] mm c5a1bae0 pgd c5a5c000 active_mm c5a5c000
L1 entry 0xc5a5c000
0x00000000 0x55A26031 L2 page entry 0xc5a26000
Small entry 0x507A182E address 0x00008000 xn 0 Access RW/R
Small entry 0x507A282E address 0x00009000 xn 0 Access RW/R
Small entry 0x507A482E address 0x0000A000 xn 0 Access RW/R
Small entry 0x507A382E address 0x0000B000 xn 0 Access RW/R
Small entry 0x507CE82E address 0x0000C000 xn 0 Access RW/R
Small entry 0x507D082E address 0x0000D000 xn 0 Access RW/R
Small entry 0x507D182E address 0x0000F000 xn 0 Access RW/R
Small entry 0x507D382E address 0x00010000 xn 0 Access RW/R
Small entry 0x507D282E address 0x00011000 xn 0 Access RW/R
Small entry 0x507D482E address 0x00012000 xn 0 Access RW/R
Small entry 0x507DF82E address 0x0001C000 xn 0 Access RW/R
Small entry 0x507DE82E address 0x0001D000 xn 0 Access RW/R
Small entry 0x507ED82E address 0x00084000 xn 0 Access RW/R
Small entry 0x507EF82E address 0x00085000 xn 0 Access RW/R
Small entry 0x507F982E address 0x00090000 xn 0 Access RW/R
Small entry 0x507FD82E address 0x00092000 xn 0 Access RW/R
Small entry 0x507FC82E address 0x00093000 xn 0 Access RW/R
Small entry 0x5079D82E address 0x0009B000 xn 0 Access RW/R
Small entry 0x5079A82E address 0x000A1000 xn 0 Access RW/R
Small entry 0x5079682E address 0x000A5000 xn 0 Access RW/R
Small entry 0x507A982E address 0x000A8000 xn 0 Access RW/R
Small entry 0x55D1983F address 0x000B2000 xn 1 Access RW/RW
Small entry 0x55D2D83F address 0x000B4000 xn 1 Access RW/RW
Small entry 0x55D2A83F address 0x000B5000 xn 1 Access RW/RW
Small entry 0x55D1083F address 0x000B6000 xn 1 Access RW/RW
Small entry 0x55D1183F address 0x000B7000 xn 1 Access RW/RW
Small entry 0x55D2983F address 0x000B8000 xn 1 Access RW/RW
insmod 라는 프로세스가 실행될때의 mm table 입니다.
일부만을 발췌하였는데 필드중에는 xn 이라는 필드가 있고 Access 필드가 있습니다.
Xn 필드가 0 인 영역은 0x00008000 - 0x000A8000 까지의 페이지입니다.
Xn 필드가 1 인 영역은 0x000B2000 - 0x000B8000 까지의 페이지입니다.
일반적으로 응용프로그램은 0x8000 번지에 로드되며 해당 영역들은 프로그램 공간이고
read-only 로 설정되며, 실행 가능해야 합니다.
뒤쪽에 있는 공간들은 데이타 공간으로 해당 공간에서는 프로그램 코드를 수행할수 없습니다.
좀더 많은 메모리 공간을 살펴보면, shared, heap, kernel 공간등에서는 실행가능, 읽기/쓰기에
대한 속성이 해당 공간의 특성에 따라 복잡하게 설정되는 것을 볼수 있습니다.