logical address, linear address, physical address에 관한 개념 좀 잡아주세요.
글쓴이: nearfri / 작성시간: 토, 2007/03/03 - 6:36오후
가상 메모리에 대해서 공부하다 보니까 linear address에서 physical address로 매핑하는 거까지 배우게 됐는데요.
포럼을 뒤지다보니 logical address라는 것도 있더라구요.
읽어봐도 logical address가 뭔지, 세그먼트가 뭔지 개념이 잘 잡히지 않습니다.
가장 궁금한 건 메모리 참조를 할 때 logical -> linear -> physical 순으로 한다고 나와있는데요.
그럼 아래와 같은 코드에서
-----------------------------
...
int a = 3;
cout << &a;
...
-----------------------------
출력되는 "0012FF7C"는 linear address인가요, logical address의 offset인가요?
또, 위 프로그램을 다른 디렉토리에 복사해서 인스턴스를 여러 개 띄워봐도
같은 출력을 나타내는 건 왜인가요?
저기서 출력되는 건 가상 메모리상에서의 주소이고 이게 곧 logical address의 offset에 해당하는 거 같기도 하고...
책도없이 주먹구구식으로 공부하려니 힘드네요. 휴.
Forums:
제 북마크입니다.
http://www-128.ibm.com/developerworks/kr/library/l-memmod/index.html
책은 인텔에서 PDF로 배포하고 있습니다.
라이센스를 몰라 첨부를 올리진 않습니다.
를 구글링해 보세요.
리눅스는 가상메모리 전체를 한 세그먼트로 잡습니다. CS, DS등등이 같은 BASE, LIMIT를 갖죠. 따라서 변수의 주소는 linear 이기도 하고 logical address의 offset이기도 하죠.
안녕하세요? 초보
안녕하세요? 초보 운영체제 제작자 돼지군입니다.
32비트 아키텍쳐인 IA-32에서 페이징을 사용하지 않고 보호모드에 진입한 경우,
선형 주소(linear address)가 논리 주소(logical address)와 똑같고,
물리 주소(physical address)로 변환하기 위해서 GDT를 거칩니다.
GDT에는 각 세그먼트에 대한 정보가 들어있습니다. (예: 시작 물리주소Base, 크기Limit 등)
보호모드에 진입하지 않고 16비트의 실제주소모드(real [address] mode)를 사용하는 경우,
세그먼트와 오프셋은 각각 16비트 값이며, 세그먼트 * 16 + 오프셋 = 최대 0x10FFEF까지 접근 가능합니다.
그러나 메모리가 1MiB 넘게 달려있지 않았기 때문에 키보드 컨트롤러에 A20 게이트라는 게이트를 만들어서,
주소의 비트 20이 잘리게 만들었습니다. (덕분에 OS 개발자들 헛삽질 해야하죠;;; 홀수MiB 영역에 접근하려면)
마찬가지로 IA-32에서 물리주소 확장을 사용하지 않고 페이징을 사용하는 경우,
32비트 주소의 상위 10비트는 페이지 디렉토리 번호(PD#), 다음 10비트는 페이지 테이블 번호(PT#),
최하위 12비트는 물리 페이지 오프셋(PPO)입니다.
PD#를 통해 페이지 디렉토리를 찾습니다. 페이지 디렉토리 테이블의 베이스 어드레스를 찾기 위해 CR3을 참조합니다.
다음, 페이지 디렉토리 테이블의 PD#번 항목을 따라가면 페이지 테이블 테이블이 있습니다.
(보통 이 말이 어색해서 그냥 페이지 테이블이라고 합니다만... 저는 혼란을 막기 위해 이렇게 씁니다.)
페이지 테이블 테이블의 PT#번 항목을 따라가면 4KiB짜리 물리 페이지의 베이스 어드레스가 나옵니다.
여기에 PPO를 더하면 바로 실제 주소(X) 선형 주소(O)가 나오는 겁니다.
물리 주소 확장(PAE; Physical Address Extension)을 사용할 경우,
페이지 디렉토리의 항목 수는 1024개 그대로지만, 페이지 테이블이 없어져 물리 페이지 하나가 2MiB가 됩니다.
제 운영체제의 개발 환경인 x86-64 환경에서는,
4KiB 모드에서 비트 64-48은 비트 47의 부호확장(sign extend)이며,
비트 47-39는 PML4(Page Map Level 4; '4단계 페이지 맵') 항목번호를 가리키고,
비트 38-30은 PDP(Page Directory Pointer; '페이지 디렉토리 포인터') 항목번호를 가리키고,
비트 29-21는 페이지 디렉토리 항목번호, 20-12는 페이지 테이블 항목번호,
최하위 12비트는 마찬가지로 물리 페이지 오프셋을 지정하는 데 쓰입니다.
하지만 4KiB 모드는 페이지가 너무 작죠.
x86-64환경에서는 페이지 디렉토리 항목의 PS(Page Size) 비트를 1로 설정함으로서 페이지 크기를 2MiB로 늘릴 수 있습니다.
저는 대략 이렇게 알고 있는데... 틀린 점 있으면 고수분들 지적 부탁드립니다.
------------------------------------------------------
[낡배밀] 낡은 리눅스 배포판을 밀어내야 한다고 생각합니다.
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
댓글 달기