본문 바로가기
3. 개발 관련/정리 :: issue 와 resovle

[펌] u-boot MMU Table setup

by kyuho.choi 2010. 11. 10.
728x90
반응형

원문출처


http://www.aesop.or.kr/?mid=Board_QA_General&page=3&sort_index=readed_count&order_type=desc&document_srl=34591


========================================================================================


아래는 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에 있을 것 입니다.


========================================================================================

728x90
반응형

댓글