책에서 i386 기준으로 가상주소를 물리주소로 변환하는 과정을 설명하고 있습니다.
이 부분에서 어느 분께서(성함을 몰라서 죄송합니다.) GDT와 LDT를 이야기 하면서
설명이 부족한 부분이 있다고 하셨습니다.
그래서 자료를 찾아 보고 해당 내용을 첨부 해 봅니다.
결론적으로 인텔 계열 프로세서는
물리주소, 가상주소, 논리주소로 3단계의 주소 체계가 있는데
이중에서 책은 가상 주소를 물리 주소의 변환을 설명한 것이고,
GDT와 LDT는 논리 주소를 가상 주소로 변환하는데 사용 되는 것입니다.
따라서 책의 설명이 맞기는 하지만
인텔 프로세서의 전체적인 주소 변환을 설명하려면, GDT와 LDT도 설명이 되어야 할 것 같습니다.
(아마도 책은 가상주소 -> 물리주소 만으로 한정되어 표현한것 같습니다.)
댓글 7
-
홍성진
2011.04.14 11:57
-
서유해
2011.04.15 00:07
오~ 감사합니다 ㅎㅎ
-
김용욱
2011.04.15 15:59
인텔 기반 아키텍쳐에서 GDT와 LDT가 있는데 LDT는 개별 프로세스를 위한 것입니다.
제가 toy 운영체제를 만들 때 보호 모드에서 GDT와 LDT로 세그먼트를 나눠서 썼는데 리눅스도 그런 구성을 할 줄 알았습니다. 그런데 리눅스의 구현은 제 생각과 다르네요. ( http://www.ibm.com/developerworks/kr/library/l-memmod/ )
리눅스는 세그먼트를, 적어도 주소차원에서는 의미없게 만들었다고 생각됩니다. 리눅스는 GDT의 커널 코드 세그먼트, 커널 데이터 세그먼트, 사용자 코드 세그먼트, 사용자 데이터 세그먼트가 모두 base가 0x00000000에서 시작하고 limit가 모두 0xffffffff (4GB)로 설정했습니다. 모든 세그먼트가 똑같이 0x00000000부터 4GB를 공유하겠네요. LDT도 모델이 한정되어 있네요.
저는 세그먼트를 보고 무의식적으로 분리했는데 단일 모델을 쓰는 것도 괜찮은 선택인 것 같습니다. 세그먼트를 0x00000000으로 시작하게 통일한다면 메모리 모델이 단순하고 이해하기 쉽고 관리하기 쉬울 것 같습니다.
암에는 GDT, LDT, cr3가 없었고 페이지 테이블을 위해 CP15 c2 register를 쓰는 것으로 보입니다. ( http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0388f/CIHJFFCI.html )
그리고 virual address와 logical address를 명확하게 구별하지 않는 것 같네요.
http://recipes.egloos.com/5232056
http://www.peter-cockerell.net/aalp/html/ch-2.html
두가지 가능성이 있겠죠. 인텔 기반과는 달리 ARM에서는 virtual address와 logical address의 구분이 없음. 글을 쓴 사람들이 잘 모를 가능성. 후자일 가능성은 별로 없어보이고요. GDT나 LDT와 같은 구조가 ARM에 없어 보이니 전자가 확률이 높겠죠. 즉, virtual address(logical address) -> physical address로 매핑되는 겁니다.
-
myskan
2011.04.17 11:26
저는 가상 주소와 물리 주소를 명확하게 구별하지 않는 것 같다고 한게 아니라 가상 주소와 논리 주소를 명확하게 구별하지 않는 것 같다고 한 것입니다.
-> 네. 제가 잘못 읽었습니다. ^^;
VIVT, VIPT, PIVT, PIPT는 이미 알고 계시겠지만 캐시를 접근하고 태그를 매칭 하는 방법에 대한 문제입니다.
따라서 가상 주소 -> 물리 주소에서 VIVT, VIPT, PIVT, PIP은 영향을 미치지 않습니다.
하지만 OS에서 VIVT, VIPT, PIVT, PIP에 의하여 메모리 및 캐시의 운영 방법은 달라 집니다.
이 부분은 나중에 세미나를 통해서 논의가 되지 않을가 싶습니다.
-
김용욱
2011.04.17 01:53
<상철님> 그리고 ARM에서 가상 주소와 물리 주소를 명확하게 구별하지 않는다고 말씀하셨는데 완전히 잘못 알고 계신것입니다
<저> 그리고 virual address와 logical address를 명확하게 구별하지 않는 것 같네요.
저는 가상 주소와 물리 주소를 명확하게 구별하지 않는 것 같다고 한게 아니라 가상 주소와 논리 주소를 명확하게 구별하지 않는 것 같다고 한 것입니다. ARM에서 논리 주소(logical address)가 없는 것이군요. :)
그리고 이건 별도로 든 의문인데요. VIVT, VIPT, PIVT, PIPT가 virtual address <-> physical address에서도 영향을 미치나요? Virtual address와 Cache 간에, Physical address와 Cache 간에만 고려해 할 부분인지 아니면 virtual address <-> physicla address에서도 같이 고려할 부분이 있는 것인지 궁금합니다.
-
myskan
2011.04.16 23:41
제가 쓴 글과 첨부 화일을 보시면 아시겠지만 그리고 님께서 남겨놓으신 첫번째 링크를 자세히 보시면 하시겠지만 인텔 기반 아키텍쳐는 논리, 가상, 물리 3단계 주소 체계가 있습니다.
GDT와 LDT는 이중에서 논리 주소를 가상 주소로 변환하는데 사용합니다.
그리고 ARM에서 가상 주소와 물리 주소를 명확하게 구별하지 않는다고 말씀하셨는데 완전히 잘못 알고 계신것입니다.
프로세서의 MMU와 캐시를 구성하는데 있어서 하드웨어의 구현 방법에 대한 문제로 VIVT, VIPT, PIVT, PIPT에 대한 내용을 오해 하신것 같습니다.
(V : Virtual. P:Physical, I:Index, T:Tag)
결론적으로 ARM 프로세서에서는 논리 주소와 가상 주소를 구별하지 않는 것이 아니라 논리 주소의 개념이 없습니다.
-
김용욱
2011.04.17 02:20
저와 상철님이 VIVT, VIPT 등을 이야기 한것에 대해 궁금하신 분이 궁금하실까봐 제가 아는 것을 살짝 적어보겠습니다. 조금 더 자세한 부분은 다른 분이 보충해주시거나 저희 스터디 때 학습할 기회가 있지 않을까 싶습니다. (사실 저도 개념적으로만 알고 있기 때문에 더 자세히 알 기회가 있으면 좋겠습니다.)
메모리는 자료들을 가지고 있고 그 자료들을 접근하기 위한 인덱스를 가지고 있습니다. 그 인덱스를 우리는 주소(address)라고 부릅니다. 캐쉬는 메모리의 내용의 일부를 가지고 있는데 그 내용이 원래 메모리에서 어느 위치인지를 표기해두어야 합니다. 그 표기를 태그라고 합니다. PIVT(캐쉬만 가상 주소를 쓰는 경우)는 실제로 의의가 없고 PIPT 속도가 느린 것으로 알고 있습니다. 둘다 physical로 유지할려면 비용이 듭니다.
.
좋은 자료 감사합니다^^