vm_struct vs vm_area_struct

Linux 2010. 11. 27. 20:44
리눅스 커널에서는 가상 메모리를 관리하는 구조체가 두 가지가 있습니다.

하나는 커널 영역에서의 가상 메모리 관리를 위한 것으로 vm_struct이며,

다른 하나는 사용자 영역에 있는 프로세스의 가상 메모리 관리를 위한 것으로 vm_area_struct입니다.

커 널 내부에서의 가상 메모리는 vmlist 전역 변수가 head이기 때문에 vmlist를 따라 struct vm_struct *next 멤버를 따라가면서 탐색하면 됩니다.(동기화를 위해 vmlist_lock 전역 변수가 선언되어 있습니다. DEFINE_RWLOCK( vmlist_lock ); 그러니, 접근이나 수정시에는 적절한 잠금을 사용하시길...)

프로세스의 가상 메모리는 프로세스의 메모리를 관리하는 mm_struct 구조체의 mmap 멤버가 head이며, 여기서 시작해서 vm_area_struct 구조체의 vm_next 멤버를 따라가면서 탐색하면 됩니다.

이 둘을 위한 API가 전부 따로 있는데, 이름 때문에 혼동되는 부분이 꽤 있습니다.

게 다가, 커널 공간에서의 가상 메모리 할당에는 vmap(), vunmap()이 사용되고, 프로세스의 가상 메모리 할당에는 vmalloc(), vfree()가 사용되는데, 내부적으로는 get_vm_area() 함수에 의해 메모리가 할당되고, 흩어진 물리 메모리를 연속된 물리 메모리로 매핑하는 map_vm_area() 함수를 공통으로 사용하고 있습니다.

여기까지의 내용은 커널 2.6.14.6을 기준으로 한 이야기이고, 커널 2.6.20을 보면 내부가 상당히 바뀌었습니다.

vmap() 함수의 구현은 그다지 바뀌지 않았고, vmalloc() 함수는 내부 처리가 __vmalloc_node()으로 바뀌었군요.

NUMA를 위해 뭔가 세부 처리를 더한 것 같은데, NUMA 시스템을 사용하지 않으니 모르겠습니다. :)


출처 : http://www.codeplus.org/blog/298

WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,