'가상 메모리 관리'에 해당되는 글 1건

  1. 2012.10.03 가상 메모리 관리
리눅스/커널2012. 10. 3. 13:55

출처: 리눅스 커널 내부구조


각 태스크는 task_struct 이라는 자료구조를 가지고 있다.

메모리 가상 관리를 위해 다음가 같은 hierarchy를 가지고 있다.

task_struct

struct mm_struct

vm_area_struct


vm_area_struct의 vm_end와 vm_start는 가상 메모리 공간에서 vm_area_struct이 가리키는 세그먼트의 끝 주소와, 시작주소를 각각 가리킨다.


물리 메모리 관리와 같이 가상 메모리 역시 고정된 크기(4kb)의 할당 단위로 관리되며 이를 page라 부른다.(물리 메모리의 page frame과 혼동하지 말자)  결국 공통의 속성을 갖는 페이지들이 모여 vm_area를 구성하고, 이를 vm_area_struct라는 자료구조로 관리한다. 그리고 결국 이런 vm_area_struct들이 모여 하나의 mm_struct 내에서 괸리된다.(위의 계층구조를 보자)


그러나 cpu는 물리 메모리에 대한 직접적인 엑세스를 하는게 아니라 가상주소를 참조한다.  그러므로, 이를 위해 페이지 테이블이 존재하고 페이지 테이블을 통해 가상 메모리와 물리 메모리를 연결해 준다.


참고로 버디나 슬랩 할당자를 통해 할당받는 메모리 공간은 늘 물리 메모리상에서 연속이다.


여기서 커널은 어떻게 가상 주소를 물리주소로 변환할까?  리눅스 커널 또한 3~4GB의 가상 주소 공간에서 동작하기에 페이징 단계를 거쳐야 가상 주소를 물리 주소로 변환할 수 있다.  그럼 위에서와 같이 mm_struct안에 pgd(페이지 글로벌 디렉터리)값을 알아야 하는데, 커널한테는 둘다 존재 하지 않고, 커널 자신을 위한 페이지 테이블을 시스템 부팅 시점에 미리 작성해 놓고, 이 위치를 swapper_pg_dir이라는 전역 변수에 저장해 놓고 사용한다.


3GB            1MB              8MB             16MB                                 896MB                                                 4GB

bios comm area 

kernel code image 

DMA region 

mem_map 

Direct Mapping 

vmalloc 

kmap 

fixed mapping 


mem_map은 물리 메모리를 위한 페이지 프레임 자료 구조가 있다.

Direct Mapping은 가상 주소와 물리주소가 direct mapping되어 있어, 간단하게 가장주소-3GB를 통해 가상 주소를 바로 물리 메모리로 연결할 수 있다.

Posted by code cat