슬럽

포스트: 5
Tags

Posts

5 posts

[리눅스커널] 슬럽 메모리: set_track() 함수에 전달되는 addr인자의 정체

Guillermo Austin Kim|2020년 12월 10일

리눅스 커널의 슬럽 관련 디버깅 피쳐를 켜 놓으면, struct track 구조체로 슬럽 오브젝트를 할당하거나 해제할 때의 콜 스택 정보를 저장합니다. 이를 처리하는 핵심 함수는 set_track() 함수인데, 이 함수에 마지막으로 전달되는 인자는 addr입니다. 다음은 set_track() 함수의 구현부인데, 볼드체로 표기된 부분을 봅시다. void set_track(struct kmem_cache *s, void *object, enum track_item alloc, unsigned long addr){ struct track *p = get_track(s, object, alloc); if (addr) {... p->addr = addr; p->cpu = smp_process

[리눅스커널] ARMv8: 슬럽 오브젝트의 트랙(track) 구조체를 TRACE32로 디버깅하기

Guillermo Austin Kim|2020년 4월 28일

이번 시간에는 64비트 기반 ARMv8 아키텍처(커널 4.19 버전)에서의 슬럽 오브젝트의 디버깅 정보를 확인해보겠습니다. 슬럽 오브젝트의 패턴을 빨리 확인하는 좋은 컨텐츠였으면 좋겠습니다. 크래시 유틸리티로 슬랩 페이지(kmalloc-256)를 확인 ffffffbf50925d00 슬럽 오브젝트의 속성을 확인하기 위해 'kmem ffffffbf50925d00' 명령어를 입력하겠습니다. 여기서 kmem 오른쪽에 보이는 주소는 슬랩 페이지 디스크립터입니다. crash64> kmem ffffffbf50925d001 CACHE OBJSIZE ALLOCATED TOTAL SLABS SSIZE NAME2 ffffffd3c08e7780 256 36025

[리눅스커널] 메모리관리/디버깅: kmalloc() 함수로 메모리 할당 후 슬랩 캐시 종류 확인하기

Guillermo Austin Kim|2019년 9월 3일

이번 소절에서는 가상주소를 물리주소로 변환하는 과정을 실습으로 알아봅시다. 3장 3.6 절에 소개한 rpi_debugfs.c 소스를 활용해 실습을 진행합니다. 먼저 rpi_debugfs.c 소스를 입력하고 커널 빌드를 하시기 바랍니다. 패치 코드 입력 방법 알아보기 먼저 입력할 패치 코드부터 소개합니다.[drivers/soc/bcm/rpi_debugfs.c] 01 static int rpi_kernel_debug_stat_set(void *data, u64 val)02 {03 int ret;04 05 raspbian_debug_state = (uint32_t)val;06 07 if ( raspbian_debug_state == 1402 ) {08 unsigned long ph

[리눅스커널][디버깅] 슬럽(슬랩) 오브젝트 레드존 데이터 구조 T32로 메모리 디버깅(1)

Guillermo Austin Kim|2019년 4월 1일

이번 시간에서는 슬럽 오브젝트의 레드 존에 대해서 확인하는 시간을 갖겠습니다.여러 개발자들이 리눅스 드라이버를 개발하다 보면 슬럽 오브젝트를 깨버리는 코드를 작성할 수 있습니다.결과 메모리가 오염돼서 랜덤하게 커널 크래시가 발생합니다. 이런 상황에 메모리 오염을 일으킨 범인을 찾기 위해 슬럽 오브젝트에 포이즌과 레드존을 추가했습니다. Free 슬럽 오브젝트 데이터 스트럭처 확인하기 먼저 kmalloc_caches 전역 변수를 통해 "kmalloc-64" 슬럽 캐시 주소를 알아봅시다.01 (static struct kmem_cache * [14]) kmalloc_caches = (02 [0x0] = 0x0,03 [0x1] = 0x0,04 [0x2] = 0xE4402340,05 [0