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만 다를뿐 내용은 같을 겁니다. ^^;;