원문출처
========================================================================================
아래는 SMSK6400용 MMU 테이블을 임포트 하는 코드 입니다. 간단하게 주석을 달아놓겠습니다.
/*
* MMU Table for SMDK6400
*/
/* form a first-level section entry */
.macro FL_SECTION_ENTRY base,ap,d,c,b
.word (\base << 20) | (\ap << 10) | \
(\d << 5) | (1<<4) | (\c << 3) | (\b << 2) | (1<<1)
// base 는 MMU 테이블로 매핑할 PHY 주소, ap는 접근 퍼미션, d는 도메인, c는 캐시 사용여부, b는 버퍼 사용 여부
.endm
.section .mmudata, "a"
.align 14
// the following alignment creates the mmu table at address 0x4000.
.globl mmu_table
mmu_table:
// 여기는 MMU 테이블 설정을 하는 부분 입니다.
// MMU 테이블은 가상주소 0x0 번지부터 아래 설정대로 순서대로 매핑이 됩니다.
.set __base,0 // 물리주소 0x0 번지를 __base로 할당하며, MMU 매핑 준비
// 1:1 mapping for debugging
.rept 0xA00 // .rept 명령은 .rept 시작 부터 .endr 까지 0xA00 만큼 반복을 하라는 뜻 입니다.
FL_SECTION_ENTRY __base,3,0,0,0
// 0x0 번지부터 0xA00 번지까지 순차적으로 증가하며, MMU 테이블을 작성
// 억세스 퍼미션은 3 입니다. ( Supervisor 모드 및 User 모드 모두 R/W 허용)
// 도메인은 0으로 캐시와 버퍼는 Disble 합니다.
.set __base,__base+1
// 순차적으로 MMU 테이블 증가. 0x0000_0000 -> 0x0001_0000 단위로 0xA000_0000 까지 증가
.endr
// access is not allowed.
.rept 0xC00 - 0xA00
.word 0x00000000
.endr
// MMU 테이블의 0xA0 부분부터 0xC0000_0000 구간은 억세스를 허가하지 않습니다.
// 이 전 스탭에서 0XA0000_0000 구간까지 MMU 테이블을 설정했으니,
// 0XA0000_0000 구간 부터 , 0xA0000_0000 + (0xC0000_0000 - 0xA0000_0000)
// 구간까지 위의 테이블을 설정
// 128MB for SDRAM 0xC0000000 -> 0x50000000
.set __base, 0x500
.rept 0xC80 - 0xC00
// 가상주소 0xC000_0000 ~ 0xC800_0000을 물리주소 0x5000_0000 ~ 0x5800_0000을 매핑
FL_SECTION_ENTRY __base,3,0,1,1
// 억세스 퍼미션은 3 입니다. ( Supervisor 모드 및 User 모드 모두 R/W 허용)
// 도메인은 0으로 캐시와 버퍼는 Enable 합니다.
.set __base,__base+1
.endr
// access is not allowed.
.rept 0x1000 - 0xc80
.word 0x00000000
.endr
// MMU 테이블의 나머지는 억세스를 허가하지 않습니다. 루틴은 앞쪽 부분과 동일
endif
이 MMU 테이블을 만들어주신후, MMU를 활성화 할 때 MMU에 저 테이블이 위치한 주소를 설정하면 MMU가
활성화 됩니다. S3C64x0 혹은 S3C2443의 uBoot에서 작성된 MMU 테이블을 사용하여 MMU를 활성화하는
코드는 Startup.S에 있을 것 입니다.
========================================================================================
댓글