logical address, linear address, physical address에 관한 개념 좀 잡아주세요.

nearfri의 이미지

가상 메모리에 대해서 공부하다 보니까 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에 해당하는 거 같기도 하고...

책도없이 주먹구구식으로 공부하려니 힘드네요. 휴.

sephiron의 이미지

http://www-128.ibm.com/developerworks/kr/library/l-memmod/index.html

책은 인텔에서 PDF로 배포하고 있습니다.
라이센스를 몰라 첨부를 올리진 않습니다.

Quote:

Intel® 64 and IA-32 Architectures
Software Developer’s Manual
Volume 1:
Basic Architecture

를 구글링해 보세요.

리눅스는 가상메모리 전체를 한 세그먼트로 잡습니다. CS, DS등등이 같은 BASE, LIMIT를 갖죠. 따라서 변수의 주소는 linear 이기도 하고 logical address의 offset이기도 하죠.

cppig1995의 이미지

안녕하세요? 초보 운영체제 제작자 돼지군입니다.

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.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.