[리눅스커널] 메모리: TRACE32로 슬랩 캐시 디버깅해보기
By Guillermo Austin Kim | 2020년 4월 21일 |
슬랩 캐시를 나타내는 링크드 리스트 확인 먼저 slab_caches 전역 변수를 확인해보자. $ v.v %t %h slab_caches (static struct list_head) slab_caches = ( (struct list_head *) next = 0xFFFFFFC72CA83E60, (struct list_head *) prev = 0xFFFFFFC6008FC060) slab_caches 전역변수의 next 필드는 struct kmem_cache 구조체의 list 필드를 가르킨다. 다음과 같은 명령어를 입력해보자. $ v.v %h %t %s container_of(0xFFFFFFC72CA83E60,struct kmem_cache,list) (struct kmem_cac
[리눅스커널][디버깅] 편하게 커널 코드를 수정할 수 있는 디버깅용 Debugfs 드라이버 코드 소개
By Guillermo Austin Kim | 2019년 4월 7일 |
편하게 커널 코드를 수정할 수 있는 디버깅용 Debugfs 드라이버 코드 소개 이전 절까지 리눅스 커널 코드를 수정해서 ftrace나 커널 로그를 출력하는 방법을 소개했습니다. 리눅스 드라이버를 처음 접하거나 커널 코드에 익숙하지 않은 분은 커널 로그를 수정해 커널 빌드를 하는 것은 굉장히 낯선 일입니다. 왜나면 코드를 잘못 입력해 커널이 오동작하면 어떨지 걱정이 앞설 수 있기 때문입니다. 그런데 실수로 커널 코드를 잘못 입력하면 라즈베리파이가 부팅을 못할 수도 있습니다. 필자도 실수로 커널 코드를 잘못 수정한 후 컴파일한 적이 있습니다. 결과 라즈베리파이가 부팅이 안됐습니다. 처음 이런 상황을 겪으니 조금 당황스러웠습니다. 임베디드 리눅스 실전 개발자는 코드를 수정한 다음 커널 부팅이 안 되는 상황
[Crash-Utility] Radix Tree 디버깅: 'tree -t radix -N (struct radix_tree_node *) 구조체 주소'
By Guillermo Austin Kim | 2019년 9월 30일 |
이번 시간에는 크래시 유틸리티로 라덱스 트리를 디버깅하는 방법을 소개합니다. 라딕스 트리(Radix Tree)를 보기 위한 명령어 크래시 유틸리티로 라덱스 트리 노드를 보기 위한 명령어 포멧은 다음과 같습니다. tree -t radix -N (struct radix_tree_node *) 구조체 주소 예제 명령어 및 결과 ( struct radix_tree_node 구조체 주소가 0xFFFFFFFF3A806E79 인 경우) crash> tree -t radix -N 0xFFFFFFFF3A806E79ffffffff3f53c180ffffffff3f53c4c0ffffffff3f555180ffffffff3f5554c0ffffffff3f56e180ffffffff3f56e4c0ffffffff3f5
[리눅스커널] 메모리 관리: 슬럽 오브젝트 해제하는 kfree() 함수 분석하기
By Guillermo Austin Kim | 2019년 9월 1일 |
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;0506 trace_kfree(_RET_IP_, x);0708 if (unlikely(ZERO_OR_NULL_PTR(x)))09 return;1011 page = virt_to_h