[컴퓨터구조, OS] 흔히 말하는 Memory map이란 RAM의 map아닌가요?

aeeeefff의 이미지

인녕하세요. 컴공3학년입니다.
운영체제 책을 보면서 paing에 대해 공부하던 중
컴퓨터구조에 대해 아주 기초적인 부분을 잘 몰라 질문드립니다.

Memory map에 대한 설명 :
http://wiki.osdev.org/Memory_Map

위의 사이트의 설명을 보면 Memory map에는
RAM영역도 있을 뿐더러 ROM영역도 존재합니다.
전 프로그램이 로드되는 물리메모리 공간이라는 곳이 RAM이라고 알고 있습니다.
컴퓨터가 처음 부팅될 때 BIOS가 POST과정을 거쳐서
전원이 꺼지면 데이터가 사라지는 RAM에
0번지의 Real mode IVT와 같은 데이터들을 초기화하고,
이후 os에서 프로그램실행시 적절한 메모리관리기법을 통해
프로그램이 RAM에 필요한 부분만큼 로드되어 실행된다고 이해하고 있습니다.
os도 RAM위에서 계속해서 실행되고 있는 프로그램 중 하나구요.

실제 요즘 컴퓨터는 대부분 2GB나 4GB의 RAM을 사용하고 있습니다.
(제 노트북과 같은 보급형을 기준으로 합니다)
paging에선 이러한 작은 물리용량을 맵핑하여 각 프로세스에 할당한다고 알고 있습니다.
그러다 64GB의 물리메모리를 맵핑하는 page table코드를 보았고
실제 os로 테스트 해본결과 문제 없이 64GB의 물리메모리를 맵핑하여 사용가능했습니다.
물론 제 PC는 2GB의 RAM이 탑재되어 있습니다.
이게 어떻게 가능한 건가요?

64bit라 64GB까지 메모리 어드레스는 page table에 작성 가능 하고 접근 가능한 건 알겠지만
실제 2GB이상은 존재하지 않는 것인데...
말도 안되겠지만 혹시나 0~2GB까지는 RAM이고 그 이후 부터는 하드디스크로 인식하나요?(;;;)
아직 HDD를 가상메모리로 쓰는 기법도 스왑도 구현되지 않은 os커널이었는데
이게 어떻게 가능한 건가요?

다시 말해, 리얼모드에선 1MB의 주소공간을 32bit모드에선 4GB의 주소공간을, 64bit 모드에선 16EB의 주소공간을 지원하는데
이 주소공간이란 것이 가상메모리의 논리주소라면 이해가 갑니다만,
page table를 만드는 과정에서 즉 실제 물리메모리는 2GB인데 (실제 2GB의 RAM을 탑재한 노트북)
어떻게 64GB를 맵핑이 가능한지?
64bit컴퓨터이니 16EB의 주소공간을 지원한다고 해도 실제 16EB의 RAM이 있다면 모를까 실제 하드웨어는 2GB RAM인데
어떻게 된 건가요?
16EB의 주소공간을 지원한다고 할 때 이 16EB는 HDD도 아닐 것인데 어떤 의미인가요?
(그냥 만약 16EB RAM이 있다면 접근가능 하다고 이해하고 있었습니다만...)

답변이 가능하다면 자세한 설명부탁드리겠습니다.
읽어주셔서 감사합니다.

익명 사용자의 이미지

그 용량만큼의 주소 지정이 가능한 것이지, 그 공간을 전체 다 쓰는 것이 아닙니다.

리눅스나 윈도 기준으로 말씀드리면(어차피 x86 에선 기본은 다 같지만)
32비트 OS 에서 A 라는 프로세스가 있을 때 0x00000000 ~ 0xFFFFFFFF 의 주소 공간 중에서
실제로 접근 가능한 영역으로 맵핑이 되어있는 영역은 극히 일부분에 불과한 것이 보통입니다.

작은 프로세스라고 하면 예를 들어 0x8048000 주소부터 0x804b000 까지 0x3000 정도 할당되고
0xbffff800 ~ 0xbfffffff 까지 스택이 할당되어 있고 기타 0xb7800000 ~ 0xb7820000 에
동적 라이브러리가 적재되는 등으로 이렇게 보통 영역은 분산되어 있습니다.

만약 정말로 프로세스에서 0x80000000 가량 되는 큰 메모리가 필요해서
mmap 등으로 할당할 경우, 별 다른 swap 공간이 "만약" 없다고 가정하고 실제 컴퓨터의 RAM 이
2GB 라고 가정한다면 당연히 할당 실패를 유발할 것입니다.

또한 각 프로세스마다 전부 4GB 의 주소 공간을 갖고 있고, 이는 독립적으로 각 프로세스마다
페이지 테이블을 갖고 있어서 실제 메모리에 맵핑되는 형태입니다.

가령 프로세스 A 와 B 가 있다고 하면,

A 프로세스 실제 메모리
0x08048000 - 0x30000000

B 프로세스
0x08048000 - 0x40000000

이렇게 각 프로세스가 같은 주소를 쓰지만 당연히 프로세스마다 서로 접근은 할 수 없고
물리 메모리 상으로는 다른 주소에 맵핑이 됩니다.

또한 동적 라이브러리라든지 기타 이런 형태는 물리 메모리에 한 번만 적재되고
이후에는 다른 프로세스에서 같은 물리 메모리 주소로 맵핑하는 식으로 하면 메모리를 절약합니다.
물론 그 메모리 공간도 수정이 가능하긴 할 테니, 만약 수정한다면 COW 에 의해 그 때서야 복사될 것이고요.

시스템 전체 프로세스들이 사용하는 메모리 영역의 총합(공유 영역은 1번만 계산하는 등) 과
커널이 사용하는 공간 등을 모두 합한 크기는 당연히 물리 메모리보다 항상 작습니다.
(물론 HDD swap 이 없을 때 얘기입니다. 실제로는 이렇지 않죠.)

aeeeefff의 이미지

다시 읽어 보니 제가 질문 올린 내용이 좀 난잡하네요.
네, 맞습니다. 답변해주신 내용 그대로 저도 그렇게 이해하고 있습니다.
결국 그 물리머모리라는 게 RAM이란 소리죠.
문제는 제가 본 코드는 32비트 모드에서 직접 그 물리메모리를 맵핑하는
page table인데요. 선형주소를 그대로 물리주소와 1:1대응시키는
page table이었는데 총 64GB의 물리메모리를 그대로 맵핑시키는
코드였습니다. page frame은 보통크기인 4KB였구요.
코드가 page table을 준비한 후에 64비트 모드로 전환하면서
준비한 paging을 활성화하는 코드였는데요. page 크기가 4KB이니
계산하면 총 64GB/4KB=2^24개의 page로 물리메모리를 나누는
코드입니다. 이건 어떤문제 인가요?

익명 사용자의 이미지

가상메모리(virtual memory) 메카니즘이 궁금하신 분이시군요.
----
운영체제와 연계해서 생각하셔야 합니다.

page fault 및 page fault handler를 공부/이해하세요.

실제 메모리는 폴트가 발생 했을때, 핸들러에서 후처리로 할당합니다.
---
아울러, CPU가 예외 발생시 수행하게 되는, trap, fault, abort연산의 특성도 알아야지요?
trap : 해당 루틴으로 점프
fault : 실패 시 (폴트)핸들러 처리 후 재시도; 해당 페이지가 메모리에 없을시, 해당 페이지를 액세스 가능하게 하고는, 해당 명령을 재실행하게 해서, 응용은 마치 아무 일도 없다는 듯 사용하게 함
abort : 중지
----
이 글도 도움이 될듯
http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-isa-ko-4/s1-memory-virt-details.html

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.