안녕하세요~~
kerenl memory 공부를 하다가 궁금한 점이 있어 글을 남기게 되었습니다.
커널 주소 공간의 가상 주소가 3G - 4G로 잡힙니다.
----------------------
( 0G - 3G ) - user
( 3G - 4G ) - kernel
----------------------
커널 주소 공간을 자세히 보면..
이런식으로 매핑된다고 하는데...
전체적인 그림을 그리기가 어렵습니다.
물리적 메모리와 매핑 된다고 했을 때..
그럼 최소 메모리가 896mb는 있어야 하는 건인지..
최소 다이렉트 매핑이 된다고 한다면 그 부분은 반드시 물리적인 공간이 있어야 하는 건 아닌가요??
이 부분에 대해 물리적 공간에 어떻게 매핑되는 점에 대해 알려주실 수 있으시나요??
또 proc/meminfo 에서 확인할 수 있는 vmalloc이 있는데 위 그림에서의 vmalloc 공간을 나타내는 건인지요??
그럼 kmalloc은 어디에서 잡혀있진지요...
보면 볼수록 미궁에 빠지는 거 같습니다..
리눅스 커널 대가님들의 자세한 설명 부탁드립니다..
감사합니다. :)
댓글 5
-
최문규
2010.04.29 15:16
-
최문규
2010.04.29 15:47
kmalloc()는 슬랩할당자의 외부 인터페이스 함수라고 합니다. (리눅스 커널 내부구조 책 찾모)
그래서 proc/meminfo의 slab이라고 생각합니다.
Slab: 144916 kB
VmallocTotal: 116728 kB
VmallocUsed: 41220 kB
VmallocChunk: 75424 kB그리고 자세한 slab정보는
cat /proc/slabinfo으로 확인이 가능합니다.
저도 정확히 slab이 어디에 할당되는지는 잘 모르겠습니다. 그림에서 처럼 kernel memory에 없는것으로보아...;
-
김건무1
2010.04.29 16:24
kmalloc();는 당연히 위 그림의 Direct Mapping에 위치하겟졈
linux의 가상주소 3G~(3G+896M)은 그냥 물리주소 0~896M이에염
예를 들어 시스템 메모리가 256M일 경우에는
linux의 가상주소 3G~(3G+256M)까지는 물리주소 0~256M이구
linux의 가상주소 (3G+256M)~(3G+896M)까지는 없는 가상주소거나
vmalloc();나 mmap();등을 처리하는 함수에서 쓰여질수도 잇을거에염
-
김민종
2010.04.29 16:45
감사합니다.
저도 위의 그림이 1 기가 이상 일 때의 상황을 말씀 하신거라 생각합니다.
그럼 아래 답변처럼 물리주소 0~256M 일때 커널에게만 할당 하면 유저 영역은
어떻게 물리적 메모리에 매핑되나요? 위에서 시스템 메모리라고 한 게 총 메모리량을 말씀 하신 건가요?
또한 vmalloc 부분은 정확히 명시되어 있지 않은데... 이곳을 명시하는 코드을 알 수 있을까요??
각각을 정의한 부분요.. 아마두 설치하거나 컴파일 할때의 하드웨어 상태( 메모리 .. )을 읽어서
적절하게 할 것 같긴 하지만요..
-
김남형
2010.04.29 21:11
그림 예쁘네요.. ^^
896MB는 normal zone의 (HIGHMEM 사용 시) 최대 크기입니다.
그보다 적은 메모리를 가지고 있다면 (당연히) 있는 만큼만 사용합니다.
또한 kmalloc (slab)은 어디에나 할당될 수 있지만 일반적으로 normal zone에 할당되며
kmalloc 호출 시 __GFP_DMA 혹은 __GFP_HIGHMEM 등의 플래그를 이용하면
다른 zone에서 할당하도록 요청할 수 있습니다.
.
가상 메모리 자체가 물리 메모리 크기와는 관계없기때문에
최소 물리 메모리가 896MB가 있어야된다는건 아니라고 봅니다.
아마 물리 메모리가896MB보다 작다면, 따로 페이지 프레임이 있을듯합니다.
(mem_map이겠죠..? 저도 확실히 정리되지는 않네요..)
그리고 물리 메모리가 1G이상인 경우는
말씀하신대로 896MB와 direct mapping이 된후 나머지는 ZONE_HIGHMEM으로 설정하고
동적으로 할당되기도 한다고합니다. (리눅스 커널 내부구조 책 참조)