제가 이해하고 있는 바를 말씀드립니다. 제가 틀릴 수 있고 이 글은 소설일 수도 있습니다. 제 무식이 뽀록나는 것이 아닌가하여 조심스럽긴 한데요. 틀린 부분이 있다면 다른 분이 가르쳐주세요. 제가 안다고 장담할 수 없는 사안이 있어서, pdh0710님이 발제하시고, 제가 토론의 첫번째로 참가한다는 마음으로 씁니다.
이 문제는 두 가지 원인이 섞여서 일어나고 있는 것으로 보입니다.
(1) 주 원인은 memory mapped I/O 때문입니다.
(2) 부수적인 원인은 단위 (Mega bytes, Kilo bytes 등)의 혼란 때문입니다.
Memory mapped I/O부터 말씀드리죠. 학교 다닐 때, micro-processor 혹은 컴퓨터 구조론을 들으셨다면, 컴퓨터의 I/O 장치의 레지스터에 접근하는 방식이 두 가지가 있다는 것을 아실 것입니다. 하나는 memory mapped I/O이고 다른 하나는 port mapped I/O (혹은 I/O mapped I/O)입니다. I/O 디바이스 (비디오 카드, 사운드 카드, PCI controller 등)에 있는 레지스터에 데이터를 쓰고 읽기 위해서는 그 레지스터들에 주소를 부여하여 구분해야 합니다. 그 주소를 부여할 때, 메모리 주소의 일부를 떼어내어 주소를 부여하는 것을 memory mapped I/O라고 부르고, 메모리는 그대로 놓아두고 따로 I/O 장치용 주소를 사용하는 것을 port mapped I/O라고 부르죠. x86 processor와 그 아류의 경우 port mapped I/O의 대표적인 예로 들고, 대부분의 다른 processor는 memory mapped I/O의 대표적인 예로 듭니다.
memory mapped I/O의 장점으로 보통 드는 것이 memory instruction (MOV, ADD, …)과 addessing mode들을 I/O에도 그대로 사용할 수 있어서 다양한 프로그래밍이 가능하고 속도가 빠르다는 점을 들고, 단점은 memory space의 일부를 I/O에 사용하기 때문에 설치된 memory의 일부를 사용할 수 없다는 점이죠. port mapped I/O의 장단점은 거꾸로 생각하면 되겠습니다.
그런데 시스템 메모리가 커지면서, I/O에 일부 메모리 주소를 빼았겨서 사용할 수 없다는 memory mapped I/O의 유일한 단점이 희석되었습니다. 그래서 x86 CPU를 사용하는 컴퓨터에서도 memory mapped I/O가 일반화 되고 말았죠. 그래서 요즘 사용하는 컴퓨터들은 모두 memory mapped I/O를 사용한다고 볼 수 있을 것입니다. free command를 사용했을 때, 설치된 memory의 전부가 나타나지 않는 것은 이런 이유 때문으로 저는 이해하고 있습니다. 죽, 메모리 주소의 일부를 I/O에서 사용하기 때문에 설치된 메모리 모두를 사용할 수 없다는 것이죠.
두번째, 단위의 혼란이란 Mega bytes (MB)와 Mebi bytes (MiB)의 차이를 의미합니다. Giga bytes (GB)와 Gibi bytes (GiB)의 경우도 같습니다. Mega bytes란 1,000,000 bytes를 곱해서 나오는 단위입니다. 반면, Mebi bytes는 2**20 (2의 20승) bytes, 즉, (1024x1024=1,048,576)를 곱해서 나오는 단위입니다. 따라서, 시스템이 설치된 8 Giga bytes 메모리란 사실은 정확한 표현이 아니고 8 Gibi bytes이죠.
8 GiB = 8x1024x1024x1024 bytes = 8,589,934,592 bytes = 8589 MB = 8x1024 MiB = 8192 MiB 입니다.
"free" command에서 나오는 숫자는 manual page에는 Giga, Mega Kilo bytes라고 이야기하고 있지만, 실제로는 Gibi, Mebi, Kibi bytes인 것으로 추정됩니다. -m, -k, -b 옵션을 주고 크기를 한번 살펴보세요. Gibi, Mebi, Kibi bytes가 아니라면 설명이 안됩니다. 따라서, 예를 드신 7868은 7868 MB가 아니고 7868 MiB로 해석하는 것이 맞는 것으로 생각됩니다. 즉, 7868x1024x1024 = 8250 MB (Mega bytes)로 해석된다는 것이죠. 말을 바꾸면, 8589 MB (8192 MiB)의 address space 중에서 8250 MB (7868 MiB)가 실제 메모리로 쓰이고 나머지는 I/O address에 사용되고 있는 것으로 보입니다.
그렇다면, 왜 Fedora 가상 머신에서는 다르게 나오느냐? 이 부분은 제 추정인데요. 네, "추정", 즉, 제 "짐작"입니다. 결론부터 이야기하자면 "마더 보드가 달라서"라는 것입니다. Memory mapped I/O에서 얼마 만큼이 실제로 memory에 사용되고, 얼마 만큼이 I/O에 사용 되느냐… 이것은 마더 보드 설계에 달렸다고 보는 것입니다. 업계에서 사용하는 표준이 있겠지만, 구체적인 것은 마더 보드 설계에 달려있는 것이 아닌가하고 추정하는 것이죠. 따라서, 가상 머신의 가상 마더 보드와 실제 PC의 마더 보드는 다르잖아요? 그러니, 다르게 나온다고 추정합니다. 이 부분은 확인된 것이 아니니, 검색하셔서 공부해 보시고 제가 틀리면 알려 주세요.
아무튼 제가 틀린 것이 있으면 알려주세요. 좀 망신스럽긴 하지만, 이를 통해 배우는거죠, 뭐…