kernel vmalloc vs kmalloc
커널 메모리 관련 자료를 보다 보면,
0xffffc90000000000 ~ 0xffffe8ffffffffff: vmalloc 영역입니다. 커널 개발자가 vmalloc()을 호출해 할당받은 주소가 해당 영역에 위치합니다.
다음과 같이 vmalloc를 위한 구간이 따로 존재한다.
근데 알다시피 kmalloc으로 많이 할당한다고 봤는데 이 둘의 차이점이 뭘까?
- kmalloc
- 반환 주소: 커널 VA (대부분 direct map을 통해 “바로 매핑된” 영역)
- what is direct map
- 특징: 물리적으로 연속(physically contiguous) 인 메모리를 주려고 함
- 장점: 빠름(연속 페이지 + 캐시/TLB 관점에서도 유리), 특정 저수준 코드/일부 DMA 친화적
- 단점: 큰 크기/단편화 상황에서 실패하기 쉬움
- vmalloc
- 반환 주소: 커널 VA (vmalloc 영역)
- 특징: 가상으로는 연속이지만, 물리적으로는 연속일 필요 없음(페이지들을 따로따로 잡아 새 페이지테이블로 이어 붙임)
- 장점: 큰 메모리도 상대적으로 잘 잡힘(물리 연속 필요 없으니까)
- 단점: 매핑 오버헤드/페이지테이블 부담, TLB 부담 증가 가능, 무작정 DMA에 쓰면 곤란(원칙적으로는 DMA API 사용)
이게 “왜 필요하냐”에 대한 원인-결과:
- 커널은 “연속 물리 메모리”가 필요한 경우도 있고(kmalloc류),
- “물리 연속은 포기하고 그냥 큰 가상 연속 버퍼만” 필요한 경우도 많아서(vmalloc류),
두 API가 공존함