PXA255의 Memory Address에 대해서 헷갈리는게 있어서 이렇게 글을 올립니다..

문제는...
pxa255의 Memory Address를 보면 [25..0]의 26bit입니다..
MMU에서 Virtual Address를 Physical Address로 바꾸는데 문제는 바로 여기에서...
virtual address가 0xf100_0000이라고 하고, 이에 맵핑된 물리주소가 0x0c00_0000이라고 했을때...
이 주소를 통하여 데이터를 메모리에 쓰고자 할때...
26bit의 Address를 가지고 0x0c00_0000의 물리주소를 어떻게 사용할 수 있느냐(??) 입니다...
즉 0x0c00_0000은 최소 28bit가 있어야 표현가능 한데... 총 Memory Address는 26bit이니...

책을 보니(ARM System Developer's Guide) 0x0c00_0000에서 0c00이 베이스주소, 0000이 offset값으로 되어있는데
그렇다면 가상주소 및 물리적주소는 단지 16bit만을 표현하는 건가요 ?? 그럼 나머지 10bit는 ??

그리고 virtual address는 단지 Application에서 직접 물리주소를 접근하지 못하므로 사용하는 주소이고,
이에 연결되어 있는(FPGA와 PXA255에 연결되었을때에) FPGA에서는 물리주소로 접근을 하는게 맞는건가요 ?


전 위와 같이 알고 있었는데... 이상하게 26bit의 Address때문에 많은부분이 헷갈리네요...

명쾌한 답변 부탁드릴께요
그럼 이만

from Flytaki.

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



26bit를 제외한 상위 bit는 이미 용도가 정해져 있습니다.

CS0 : 0x00000000

CS1 : 0x04000000

CS2 : 0x08000000

CS3 : 0x0C000000

...



이미 CPU 내부에서 상위 bit를 decode 해서, 각 bank와 controller를 enable 시키는 용도로 사용하기 때문에, 외부에 별도로 나오지 않습니다.(물리 주소)

상위 6bit를 내장된 decoder를 통해서, 결과만 CS0~5, SDCS0~4, 내부 controller 접근등을 처리한다고 보시면...



-- 다시 설명.. 글쓰기 어렵내요.

0x0c000000으로 접근할 때, 상위 6bit (주소 & 0xFC000000)로 decode 해서 CS3이 동작하고,
이 CS3(bank)과 하위 26bit (주소 & 0x03FFFFFF)를 조합해서 해당하는 칩의 해당하는 주소에
접근합니다.

CS3(bank)가 enable된 칩은, 이 하위 26bit로만 주소구분이 가능하다는 제약 때문에, 한 bank의 최대 크기는 0x04000000 (= 64MB)라는 제약이 생깁니다.

(이건 하드웨어와 관련성이 높은데, 너무 소프트웨어적인 개념으로 접근하는 것 같습니다.)



-- 여기까지 순수하게 물리 주소입니다.(가상 주소와 완전 별개입니다. 질문에서는, 여러가지 관계 없는 것들을 섞어놓으니 이상해 보입니다.)





가상주소, 물리주소는 모두 32bit이고 4GB까지 표현 가능합니다.(실제로 4GB-32bit를 사용합니다)

가상주소는 base + offset 처럼 구성되어 있는데, 각 table의 level에 따라서(xscale의 경우 3단계가
있습니다), 상위 x bit로 table에서 물리주소의 base (x bit)를 찾고, 하위 (32-x) bit와 조합해서 실제
접근할 물리주소를 만들어 냅니다(레벨에 따라 1~3단계를 거칩니다).

이 물리 주소가 나온 후에 각 칩에 접근하는 방식이, 위에서 물리주소에 대해 질문하신 내용입니다.





MMU가 동작할 경우, 가상주소에서 물리주소를 만들고, 이 물리주소로 각 핀을 제어해서 각 칩에 접근합니다.

MMU가 없을 경우, 가상주소에서 물리주소로 만드는 부분이 빠지고(MMU가 disable일 때, 가상주소=물리주소라고 설명되어있습니다.), 물리주소로 각 핀을 제어합니다.





그리고 MMU의 목적은 효율적인 메모리 관리인걸로 알고 있습니다.

예를 들어 Linux OS가 동작할 경우, 각 프로세서 별로 메모리 영역을 할당(malloc 아님) 받는데, 물리주소처럼 고정이 되면, 한번 할당된 영역은 추가, 제거할 수가 없습니다.

(여기서 할당은 프로세서의 주소 공간인데, 보통 0~4GB까지 입니다. MMU가 없으면, 동적할당이 안되서 미리 자기 영역을
정해놓습니다. 1번 프로그램은 a부터 b까지, 2번 프로그램은 b부터 c까지... - 이런 문제도 해결해 주고.

MMU가 있을 경우는 0~4GB까지 할당해 주고, 필요할 때, 물리주소 영역을 mapping해 줍니다. )

또, Application에서 물리 주소에 접근하지 못하게 하는 건, OS에서 나온 개념 같습니다.(-언제나 불명확)

OS가 발전하면서, 추가된 개념이 사용자 Application이 OS 부분을 접근해서 뻗게 만들지 말라인데, 이부분이 MMU에 추가되어 있는 것 같습니다.





-----



MMU는 가상 주소를 물리주소를 바꾸고, 이 물리주소에 따라 핀이 제어되고, FPGA도 이 핀에 따라 동작하기 때문에,

MMU가 enable된 CPU의 software에서 접근할 때는 가상주소 사용합니다.(application 뿐만 아니라,
kernel에서도 가상주소 사용합니다.) DMA 등과 같이, CPU에서, MMU와 관계없이 물리주소로만 접근하도록 되어 있는
몇몇 경우를 제외하고는, 모두 가상 주소입니다.





---



물리주소에 대한 건 developer's manual 좀더 보시고,

MMU 등은 arm architecture reference manual을 참고하시는 것이 더 좋습니다.

WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,