안녕하세요
학부 졸업하고 바로 대학원 연구실 생활을 시작하는 바람에 경험이 너무 부족하다 싶어서...
연구실에서 남는 보드에 간단한 OS를 만들어 보려고 하는데요...
초반부터 mmu 설정 관련해서 문제가 생겨서 질문을 드립니다.
pxa320 이 박혀있는 보드에서 실습중인데요... 그대로 물리주소 0x8000_0000 ~ 0x8800_0000 로 매핑하려고 하는데요 arch/arm/boot/compressed/head.S 를 참조해서 TTB 설정하는 부분만 제외하고(0x80004000 으로) 거의 그대로 갔다가 썻는데도 안되네요 ㅠㅠ 부트로더에서 커널이미지로 뛰자마자 아래의 mmu_init 에서 페이지테이블 써주고 MMU ON 한 다음 main 으로 뛰게 되어 있는데 ... 잘못된 부분이나 이전에 뭐 다른 설정을 해주어야 하는게 있을 까요? 몇주째 이렇고 있네요...ㅠㅠ mmu_init: /* set start addr of L1 PTE */ ldr r4, =0x80008000 sub r3, r4, #16384 bic r3, r3, #0xff bic r3, r3, #0x3f00 /* set Section entry with AP and C,B */ mov r0, r3 mov r1, #0x12 orr r1, r1, #3 << 10 orr r1, r1, #0x0c 1: str r1, [r0], #4 add r1, r1, #1048576 teq r0, r4 bne 1b mov r0, #0 mcr p15, 0, r0, c7, c10, 4 @ drain write buffer mcr p15, 0, r0, c8, c7, 0 @ flush I, D TLBs mrc p15, 0, r0, c1, c0, 0 @ read control reg /* mmu & cache control bit set */ orr r0, r0, #0x7000 orr r0, r0, #0x0030 bl __common_mmu_cache_on mov r0, #0 mcr p15, 0, r0, c8, c7, 0 @ flush I, D TLBs bl main __common_mmu_cache_on: /*orr r0, r0, #0x000d*/ orr r0, r0, #0x01 mov r1, #-1 mcr p15, 0, r3, c2, c0, 0 @ set TTB mcr p15, 0, r1, c3, c0, 0 @ load domain access control b 1f .align 5 1: mcr p15, 0, r0, c1, c0, 0 @ set control register mrc p15, 0, r0, c1, c0, 0 @ and read it back to sub pc, lr, r0, lsr #32
exception vector 를 사용해야 되는데
RAM 영역은 0x8000_0000 ~ 0x8800_0000 까지 128MB 만큼 잡혀 있고 NAND 부팅을 하게 되있어서...
MMU 을 사용해서 0xFFFF_0000 부터 0xFFFF_4000 까지를 RAM 영역에 있는 exception vector 쪽으로 돌리려고 하고 있습니다.
일단은 테스트 목적으로 가상주소 0x8000_0000 ~ 0x8800_0000 까지를
MMU를 ON 하자마자 시스템이 먹통이 되네요...
제가 짠 코드에 버그가 있나 싶어서 리눅스 커널의
.
pxa320이면 마벨에서 제공하는 blob code에서 mmu 설정 코드를 찾을수 있으니 참고 하십니다.
단, page mapping이 아닌 section mapping 만을 제공하지만, 필요한 기능을 사용하는데는 아무 문제 없을겁니다.