슬랩 할당자란?
커널에서 사용하는 동적 메모리 할당자이다.
쉽게, 유저모드에서 사용하는 heap과 유사하다고 보면 된다.
특이점은 메모리 풀 구조를 가지고 있으며, 미리 고정된 크기의 메모리 블록들을 할당해 놓는다는 것이다.
슬랩 할당자는 slab, slub, slob의 3가지 방식이 있는데, 결론은 현재 대부분 slub을 사용한다.
슬랩 할당자, 슬랩 캐시, 슬랩 객체, 슬랩 페이지
슬랩할당자
kmalloc_cache[]라는 전역 배열을 이용해 각 슬랩 캐시들을 관리한다.
slab_common.c - mm/slab_common.c - Linux source code (v6.4.8) - Bootlin
슬랩 캐시
kmem_cache라는 구조체로 표현되며, 슬랩을 관리하는 주체이다.
슬랩 객체
슬랩 캐시가 할당해 놓은 각 메모리 블록을 이야기한다.
heap chunk와 유사한 개념이라고 보면 쉽다.
슬랩 페이지
슬랩 페이지는 동일한 크기의 슬랩 객체의 모음을 이야기한다.
내부에 할당된 슬랩 객체는 alloc으로, 해제된 객체는 free로 표현하며,
free된 객체는 heap의 bins와 같이 freelist로 별도 관리한다.
더불어 이 페이지는 4kb 단위로 관리된다.
슬랩 할당 과정
동적 메모리 할당을 위해서는 kmalloc() 함수가 사용된다.
slab.h - include/linux/slab.h - Linux source code (v6.4.8) - Bootlin
커널 버전에 따라 다르지만, 이 함수가 호출되면 kmem_cache_alloc_trace(), slab_alloc(), slab_alloc_node() 순으로 호출된다.
이 중 대부분의 역할은 slab_alloc_note() 함수 내부에서 작동하는데,
kmem_cache_cpu 구조체로 관리되는 per-cpu 슬럽 캐시를 불러온 뒤
슬럽 캐시 필드 중 page에 접근한 다음
kmem-cache_cpu의 freelist에서 해제된 슬랩 여부에 따라 해제된 공간을 반환하거나 새로 할당하여 반환한다.
'Kernel Exploit' 카테고리의 다른 글
Kernel exploit - 모듈 프로그래밍 (0) | 2023.08.06 |
---|---|
Kernel exploit - 디바이스 드라이버 (0) | 2023.08.06 |
Kernel exploit - task란 (0) | 2023.08.06 |
Kernel exploit - 커널이란 (0) | 2023.08.05 |
Kernel exploit - 들어가며. (0) | 2023.08.05 |