[완료] 메모리 주소에 대한 질문
글쓴이: hiluciano / 작성시간: 목, 2009/08/13 - 8:42오전
1. 16비트용 C 소스를 보면 near, far, huge 이런 식으로 포인터를 쓰던데요
이게 무슨 뜻인가요? far나 huge면 운영체제가 인식하는 메모리 범위의 밖을 의미하는 건가요?
요즘 램 용량이 커져서 32비트 운영체제가 그 공간을 다 활용하지 못하는데 64비트 OS가 어느정도
보편화 될 때까지만이라도 이런 키워드를 부활시켜서 버려두는 메모리가 없게 할 수 있나요?
2. 보통 NULL이라고도 하는 0번지에 있는 메모리는 그 어떤 프로그램도 사용하지 않나요?
만일 사용 한다면 그 프로그램은 null을 어떻게 표현하나요?
Forums:
1번 답(?)
1. 그건 16비트 포인터가 아니라 16비트 x86 아키텍쳐 전용 포인터입니다. 8086과 80286 CPU는 세그먼트 구조라는 매우 변태적이고 엽기발랄한 메모리 관리 방식을 썼는데, 이를 이용해서 16비트 아키텍처임에도 불구하고 64KB가 아닌 1MB까지 메모리를 사용할 수 있었습니다. (뭐 그 이후 CPU에서도 지원은 합니다. 거의 아무 데서도 안 쓸 뿐이죠.)
따라서 32비트라고 해서 그런 키워드를 부활시키는 게 말처럼 쉬운 게 아니고,
1. CPU가 세그멘테이션을 지원해 줘야 하고 (이건 되는지 안되는지 잘 모르겠네요, 아마 될지도...)
2. 응용프로그램이 segment register를 막 바꾸는 걸 OS가 지원해 줘야 하고 (제정신인 OS 개발자라면 절대 안할듯)
3. 컴파일러가 그런 키워드를 지원해 줘야 하는데 (역시 마찬가지)
...거의 가능성이 없다고 보시면 되겠습니다.
아무데서도 안 쓰진 않습니다. :)
아직도 32bit 에서 벗어나질 못하는 X86 에서는 아직도 사용하고 있답니다.
이를 이용하여 32bit Linux, MacOS, Windows 모두 4G 이상의 메모리를 사용할 수 있습니다. 다만 차이가 있다면, Linux 나 MacOS 에서는 OS만 4G 이상을 사용하고 각 application 은 하나가 최대 4G 까지만 사용할 수 있습니다. (즉 application 은 아무 생각 없이 작성하면 됩니다.)
반면 Windows 는 (server 계열만 가능할 것입니다만) OS는 4G 까지만 관리합니다. 그 이상을 사용하기 위해서는 옛날 방식처럼 application 쪽에서 자알 해 주어야 합니다. (자세한 건 저도 잘 몰라 생략합니다. -ㅅ- 여튼 상위 memory 관리를 application 쪽에서 해 주어야 합니다. -_-)
X86 외의 다른 쪽 (뭐 좀 더 따진다면 Windows 를 제외한 타 OS라고 봐야겠죠.) 은 이미 64bit OS 가 보편화(?)되어 (심지어는 Linux 와 MacOS 도!!!) 굳이 저런 것을 따질 필요가 있을까 싶습니다.
(뭐 Windows 도 7 부터는 64bit 가 쓸만해졌단 이야기가 있긴 하네요.)
32비트 윈도우 서버
32비트 윈도우 서버 운영체제도 어플리케이션은 최대 가상메모리는 2기가밖에 사용 못합니다.
총 4기가에서 2기가는 커널+드라이버+각종dll로 예약되어 있기 때문입니다.
3기가까지 사용할 방법이 있긴 있는데..윈도우 부팅 옵션에 large memory aware를 켜고 어플리케이션도
링커 옵션에서 위의 옵션을 켜서 컴파일 하면 가상메모리를 3기가까지 쓸수 있습니다.
http://msdn.microsoft.com/en-us/library/aa366778%28VS.85%29.aspx
위의 링크에서 보시면 아시겠지만 물리메모리는 4기가를 넘어서 많은 양을 사용할 수 있습니다.
하지만 가상메모리를 사용하는 어플리케이션은 최대 4기가 고작입니다.(2기가+2기가)
운영체제야 ring 0에서 동작하므로 여전히 세그먼트를 이용하여 대량의 메모리를 사용 할수는 있습니다.
일단 유저모드(ring 3)에서 동작하는 어플리케이션이 세그먼트 레지스터를 이용하여 4기가를 넘어선
메모리를 사용할려고 하면 세그먼트 디스크립터에 정의된 4기가를 넘어서므로 운영체제에서 예외를
발생시킵니다. 그런다고 해서 이 세그먼트 디스크립터를 어플리케이션에서 조작을 할 수 있는것도
아니지요. 현대의 운영체제는 세그먼트 레지스터를(유저레벨에서) 메모리 접근용도가 아닌 접근 권한
제어를 위한 용도로 사용되고 있습니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
제가 잘못 알고 있었군요.
뭐 날림으로 공부를 하다 보니 잘못 알고 있었습니다. ^^a
제가 이야기한 것은 AWE (Address Windowing Extensions) 입니다. 32bit OS 에서 application 이 직접 4GB 이상의 memory 를 사용할 수 있게 해 주는 API 입니다. (만... 거의 DOS 시절의 overlay 가 생각나는 방식이라죠. 삐질.)
http://msdn.microsoft.com/en-us/library/aa366527(VS.85).aspx
혹은
http://en.wikipedia.org/wiki/Address_Windowing_Extensions
를 보시면 될 듯 합니다.
저는 Windows 에서는 저 방식으로만 4GB 이상의 메모리를 지원하는 줄 알았습니다. 헌데 chadr 님이 링크해 주신 부분을 보니 자체적으로도 잘 지원해 주고, 저것은 정말 꼼수로 제공해 주는 방식인듯 하네요. (아마도 MS-SQL 을 위해 어쩔 수 없이 만든게 아닐까 싶네요.)
댓글 달기