Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

230224
1178
109352


[리눅스커널] 메모리 관리: 슬럽 오브젝트 해제하는 kfree() 함수 분석하기 14. Memory Management

kmalloc() 함수로 동적 메모리를 할당하고 난 후 사용하지 않으면 메모리를 반환해야 합니다. 이 때 kfree() 함수를 사용하면 됩니다.

이번 시간에는 kfree() 함수를 분석하면서 커널 내부에서 반환하는 동적 메모리를 어떻게 처리하는지 살펴보겠습니다.
[https://github.com/raspberrypi/linux/blob/rpi-4.19.y/source/mm/slub.c]
01 void kfree(const void *x)
02 {
03 struct page *page;
04 void *object = (void *)x;
05
06 trace_kfree(_RET_IP_, x);
07
08 if (unlikely(ZERO_OR_NULL_PTR(x)))
09 return;
10
11 page = virt_to_head_page(x);
12 if (unlikely(!PageSlab(page))) {
13 BUG_ON(!PageCompound(page));
14 kfree_hook(object);
15 __free_pages(page, compound_order(page));
16 return;
17 }
18 slab_free(page->slab_cache, page, object, NULL, 1, _RET_IP_);
19 }
20 EXPORT_SYMBOL(kfree);

먼저 kfree() 함수로 전달되는 인자를 확인해볼까요?
인자 이름은 x이며 void* 타입입니다. x인자는 4번째 줄과 같이 object 지역변수로 캐스팅됩니다.
04 void *object = (void *)x;

이 코드로 우리는 다음과 같은 사실을 확인할 수 있습니다.

    kfree() 함수로 해제하는 동적 메모리는 슬럽 오브젝트이다. 
   
함수 인자를 살펴봤으니 이어서 코드를 분석하겠습니다.
06 trace_kfree(_RET_IP_, x);

06번째 줄 코드는 kfree ftrace 이벤트 메시지를 출력합니다.

다음 11번째 줄 코드를 보겠습니다.
11 page = virt_to_head_page(x);   

virt_to_head_page() 함수를 사용해 슬럽 오브젝트에 대응하는 슬랩 페이지를 page에 저장합니다.

12~17번째 줄은 슬랩 페이지가 아닐 때 예외 처리 코드입니다. 13번째 줄은 kfree() 함수로 해제하는 메모리 타입이 슬랩이 아니면 커널 패닉을 유발하는 코드입니다.

18번째 줄은 slab_free() 함수를 호출해 슬럽 오브젝트를 kmalloc 슬랩 캐시에 반환합니다.
slab_free() 함수 내부에서 다음 함수를 실행해 슬럽 오브젝트를 슬랩 캐시의 per-cpu 캐시에 반환합니다.
slab_free_freelist_hook()
do_slab_free()

이번 절에서는 디바이스 드라이버에서 자주 쓰는 kmalloc() 함수를 호출했을 때 커널 세부 동작을 알아봤습니다. 코드 분석으로 배운 내용을 정리해보겠습니다.
kmalloc() 함수를 호출하면 할당 요청한 메모리 크기 별로 kmalloc 슬랩 캐시 종류를 체크한다.
kmalloc() 함수로 반환되는 메모리는 kmalloc 슬럽 오브젝트이다.

필자는 슬럽 오브젝트는 커널 디버깅을 잘하기 위한 핵심 개념 중 하나라고 생각합니다. 그래서 할 말이 많습니다. 하지만 이번 소절에서 슬랩 캐시와 슬럽 오브젝트의 중요한 개념을 최대한 쉽게 설명하는데 초점을 맞췄습니다. 신입 개발자가 이해하기에는 슬랩 캐시와 슬럽 오브젝트는 너무 어렵기 때문입니다. 여러분이 이번 소절에서 배운 내용을 이해한 다음 슬럽 관련 커널 함수 분석에 한번 도전했으면 좋겠습니다.



"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)

Reference(커널 메모리 소개) 
가상 주소를 물리 주소로 어떻게 변환할까?   
메모리 존(Zone)에 대해서   
커널 메모리 할당은 어떻게 할까   
슬랩 메모리 할당자와 kmalloc 슬랩 캐시 분석   
커널 메모리 디버깅




핑백

덧글

댓글 입력 영역