SW 개발

winCE / 메모리 / Physical Address가 Virtual Address로 변환되는 과정

. . . 2010. 1. 14. 02:00
반응형

Xeno's Study Blog (http://XenoStudy.tistory.com)
- 글쓴이 : xeno
- 출처 : http://cafe.naver.com/wincepro/3466
- 기타사항 : WEEG에서 퍼온자료입니다. 자료정리용으로 퍼온자료입니다. 문제있을시 리플달아주시면 삭제하겠습니다.

어제 리틀보이님께서 PA->VA 변환 과정을 잘못이해하신거 같아서 도움되라고 올립니다.
또 혹시나 궁금해하시는 분들이 있으실까봐..
Windows CE에서 Physical Address가 Virtual Address로 변환되는 과정을 알려드립니다.
아래는 SMDK2410 의 5.0 BSP를 기준으로 설명합니다.

------------------------------------------------------------------------------------
우선 Physical Address는 회로도를 보고 알아내셔야 합니다.

예를 들어.. SMDK2410 회로도를 보면..
CS8900의 Base offset이 0x0100 0300 으로 nGCS3에 연결되어 있습니다.
그래서 .. nGCS3의 Address(0x1800 0000)를 더해줍니다.
Base Address = 0x0100 0300 + 0x1800 0000
Base Address = 0x1900 0300
즉, 이것이 Physical Address입니다. ^^

------------------------------------------------------------------------------------
Virtual Address로 어떻게 바뀌는지 알아보겠습니다.
oemaddrtab_cfg.inc 에서 0x1900 0300 이 위치하는 곳을 찾습니다. 즉, nGCS3 입니다.

DCD     0x86000000, 0x18000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 3

위 테이블은 cached address, physical address, size 형태입니다. 
위 내용은 Physical Address 0x1800 000 부터 32MB까지는
Virtual Address 0x8600 0000 부터 32MB에 맵핑된다고 보시면 됩니다.

그럼 CS8900의 Bass Address 인 0x1900 0300 를 VA로 바꿔보겠습니다.

1. VA계산
   VA = ca + (PA - pa)    // ca, pa는 위 테이블의 값을 뜻함.
   0x8700 0300 = 0x8600 0000 + (0x1900 0300 - 0x1800 0000)

2. Cached 계산
   Physical address 이므로 아마 No Cashed 입니다. 그래서 ..
   VA |= 0x2000 0000 
   그래서 ...
   VA = 0xA700 0300 이 되는 것입니다.
   만약 Cached라면 이 과정은 없습니다.

위에서 말한 과정들은 OALPAtoVA()의 내용입니다.
나머지 CPU에 대해서는 Address만 다를뿐 내용은 같을 겁니다. ^^;;

반응형