리눅스의 메모리관리에 대한 질문입니다!
글쓴이: kangnuni / 작성시간: 수, 2006/09/06 - 10:01오전
리눅스 커널의 오해라는 책을 공부중입니다
메모리관리를 보던중에 궁금증이 하나 생겼습니다
물리메모리 0~1G와 가상메모리상에의 3~4G를 다이렉트매핑했다고 하는데
물리메모리가 1G가 보다 모자라면 가상메모리상의 매핑은 어떻게 달라지나요
음 예를 들어 물리메모리가 512메가면 가상메모리상에서 3600메가부분은 매핑이 안되있을텐데 이경우에는 접
근이 어떻게 되는지.. 음 그림은 쉬운데 말로 쓰자니 표현력이 딸리는군요 ㅎㅎ
아무튼 답변부탁드리겠습니다
Forums:
가상 메모리는 가상
가상 메모리는 가상 메모리일뿐....실제 물리메모리 ( 컴퓨터에 달려있는 메모리 )와는 다른 것입니다.
물리메모리 1기가 영역에는 여러가지 device들의 메모리를 메핑하고 있고 페이지 테이블영역과 DMA부분을
메핑하고 있는것으로 알고 있고.
가상메모리 영역에 대해서 아직 이해를 못하고 계시는거 같군요.
컴퓨터에 얼마만큼의 메모리가 달려있던지 간에.
리눅스 커널에서는 4기가 만큼의 메모리영역을 가정하고 위에 이야기 했던 부분을 메핑하고 있습니다.
이것을 물리메모리라 하고.
가상메모리라는것은 책을 참고하시는게 좋을것 같습니다.
그 책에서 이야기하는 물리메모리라는것도...어찌보면....진정한 물리메모리는 아닌것이지요.
그럼 수고하세요
리눅스 커널의 오해... -_-b
헷갈리지 않을 수 없는 책이로군요!! ;;;
질문하신 분이
질문하신 분이 어느정도 올바르게 이해하셨다고 생각합니다.
좀 더 부가 설명을 드리겠습니다.
Linux에서 커널주소공간 (3G~4G)의 사용은 메인메모리 크기가 896MB 이상이냐 이하냐에 따라 살짝 달라집니다.
일단 80x86이고 PAE가 설정되지 않았다고 가정을 하겠습니다.
다음은 부팅 후 초기에 커널이 페이지테이블을 초기화하여 메인메모리를 가상주소에 매핑하는 방식입니다.
1. 메인메모리가 896MB 이상 일 때,
가. 가상주소 896MB 까지는 물리메모리 896MB를 말씀하신 대로 다이렉트(?) 매핑하고 있습니다.
다이렉트라는 용어가 좀 마음에 걸리는데 일단 제쳐두고, 예를 들어 설명하자면
물리메모리주소 0x100000(1M)는 가상주소 0xc00100000 (3G+1M)로 매핑됩니다.
즉 물리메모리 896MB 까지는 3G만 더해주면 가상주소를 얻을 수 있고 그 역도 가능합니다.
이렇게 페이지테이블을 설정을 해놓으면 커널은 특정 물리메모리주소를 쉽게 접근할 수 있죠.
나. 896M+3G에서 1016M+3G까지의 120M의 가상주소는 noncontiguous memory area 입니다.
0M+3G에서 896M+3G 사이에서 할당된 하나의 메모리 블록은 그 크기에 상관없이 물리적으로 연속되었음을 보장받을 수 있습니다.
하지만 noncontiguous memory area의 이름이 나타내듯이 이 공간에서 할당된 메모리 블록은 물리적으로 연속이 아닐 수 있습니다.
시스템이 부팅되어 오랜동안 동작하면 메모리 단편화가 심해져서 물리적으로 연속된 페이지 프레임들을 찾기 어려울 수 있습니다.
이 경우 페이지테이블을 적절하게 설정을 하면 연속적인 가상주소에 물리적으로 비연속적인 페이지 프레임들을 매핑할 수 있습니다.
vmalloc() 루틴이 이런 일을 하고, 이렇게 할당된 페이지 프레임이 물리주소 896MB 이하라면 그 페이지 프레임은 두개 이상의 가상주소를 가지겠죠. 단, DMA 동작에는 연속적인 물리공간을 필요로 하므로 이렇게 할당된 메모리는 부적절합니다.
또한 ioremap() 루틴을 통해 hardware device 내의 버퍼가 이 영역에 매핑할 수 있습니다.
다. 나머지 4M 공간은 persistent kernel mapping을, 나머지 4M 공간은 fix-mapped linear address에 쓰입니다.
Persistent kernel mapping 공간은 high memory--즉 896MB 이상의 물리메모리에 접근하기 필요한 가상 주소들 입니다.
High memory는 평상시에 가상주소가 없으므로 접근할 일이 있으면 임시적으로 가상주소를 할당하여 접근하게 됩니다.
Fix-mapped linear address는 특정 가상주소에 물리메모리를 번갈아가며 매핑해서 쓸 때 사용할 수 있습니다.
라. 만약 PAE가 설정되었다면 persistent kernel mapping 공간은 2M가 되고 fix-mapped linear address 공간은 "아마도(확인을 안해봐서)" 2M가 될 것입니다. 여기서 줄어든 만큼 noncontiguous memory area가 증가하겠죠.
2. 메인메모리가 896MB 이하 일 때,
질문하신 대로 메인메모리가 512MB이다고 가정하겠습니다.
가. 물리메모리는 0M ~ 512M 은 가상주소 0M+3G ~ 512M+3G에 매핑됩니다.
나. 512M+3G에서 1016M+3G까지의 가상주소가 noncontiguous memory area 입니다.
다. 앞선 말한 내용과 동일합니다.
3. 결론
메인메모리가 512MB인 상황이라면 가상주소 600M+3G 부분은 vmalloc()을 통해 메인메모리로 매핑되거나 ioremap() 함수를 통해 device 내의 메모리로 매핑될 수 있습니다.
사족: 잘못 알고 있던 부분이 많아 수정을 여러번 했습니다.
감사합니다~!
명쾌한 답변 감사드립니다~
책에 없는 내용도 보이네요.. wow..
896M이상의 128메가를 그냥 상위메모리를 매핑한다고만 알고있었는데 또 그게 아니군요
세분화된 얘기는 책에서 못본거 같습니다
여튼 정말 감사드립니다~
댓글 달기