안녕하세요^^
제가 아는 만큼만 쓰겠습니다.
도스에서는 메모리의 주소가 세그먼트:오프셋으로 구성됩니다.
+-----------------------+
| 세그먼트 00 |
+-----------------------+
| | ↗ 오프셋 00
세그먼트 A3 ↕
| | ↘ 오프셋 FF
+-----------------------+
| 세그먼트 FF |
+-----------------------+
위의 그림과 같이요 ^^;;
한세그먼트는 다시 오프셋으로 쪼개져서 00-FF 의 값을 갖게 되죠
메모리의 주소는 0000 - FFFF 로 나타내어 지는데 세그먼트 두자리 오프셋 두자리
이렇게 표현됩니다. 그래서 도스에서는 포인터가 2바이트입니다. 그래서 64K의 메모리를
가리킬 수 있습니다. 여기서 far 란 무엇이냐.
보통 alloc 나 malloc 로 메모리를 잡으면 현재 세그먼트의 오프셋 영역에 힙 메모리를 잡습니다.
즉 현재 내가 세그먼트 A3 에 있다면 A3 의 오프셋 00 - FF 사이의 영역에 힙메모리를 잡는 것이죠
하지만 far 를 쓰게 되면 다른 세그먼트의 오프셋에 힙메모리를 잡습니다. 이것이 far 의 역할이죠
큰 메모리를 잡고자 할 때 맘 편하게 far 를 사용하면 되는 것이죠.
하지만 32 비트 OS 의 세계에서는 위의 예기는 모두 옛날이야기가 됩니다. 즉 몰라도 된다는 얘기
지요. 현재의 리눅스나 윈도우즈는 32비트 OS 입니다. 32 비트에서는 포인터가 4바이트입니다.
이 얘기는 무슨 얘기일까요? 바로 포인터가 가리킬 수 있는 메로리 영역이 2 의 32 승 즉 4G
가 되는 것입니다. 정말 많지요^^ 한 프로세서가 저렇게 많은 메모리를 넘치게 쓸일은 없을
것입니다. 그래서 웬만한 큰메모리를 잡더라도 메모리를 잡을 수 있는 한계를 벗어날 염려가 없겠지요.
도움이 되었으면 좋겠습니다. 옛날 기억이라 틀린 부분이 있을지도 모르겠습니다 -_-;;
그럼 즐거운 하루 되세요^^;
박순분 님이 쓰신 글 :
: 그래픽 함수의 원형에 있는 'far'라는 키워드에 대하여 자세히 알고 싶습니다.
:
: 예)
: void far initgraph(int far *graphdriver, int far *graphmode, int far *pathtodriver)
:
: 빠른 답변을 기다리며...
: 수고하십시오.
:
:
|