Guillermo Austin Kim
Posts
998 posts[Linux][Kernel] irq - in_interrupt irq context
커널이나 드라이버 코드 리뷰를 하는 도중에 preempt_add, preempt_sub 그리고 in_interrupt 함수를 자주 마주칩니다. 이 함수들의 사용 예와 구현부에 대해서 좀 더 짚어 볼까요? 리눅스 커널에서 보는 모든 코드는 두 가지 모드에서 돌고 있어요.process context: 우리가 보는 대부분의 코드라고 할 수 있는데, 커널 쓰레드로 돌고 있는 상태죠.IRQ context: 어떤 디바이스던 인터럽트 전기 신호로 IRQ가 Trigger될 수 있어요. 그래서 해당 IRQ에 매핑되는 Interrupt Subroutine(ISR) 핸들러나 이 서브 루틴에서 돌고 있는 상태죠. 그럼 어떤 함수가 IRQ/process context인지는 어떻게 알 수 있을까요? 스스로 참 알기 어렵죠.이를
[Kernel][Debug] "cat /d/shrinker" kernel panic
100% 커널 패닉으로 타겟이 죽어버리는 이슈를 발견했어요.자자, 일단 커널 로그부터 좀 볼까요? 뭐, PID가 6978이 sh 프로세스에서 do_raw_spin_lock() 함수에서 데이터 어보트를 유발시켰네요.[ 761.636711] Unable to handle kernel paging request at virtual address f38a9a84[ 761.645048] pgd = e8074000[ 761.649800] [f38a9a84] *pgd=a0721811, *pte=00000000, *ppte=00000000[ 761.658106] Internal error: Oops: 7 [#1] PREEMPT SMP ARM[ 761.665481] Modules linked in:[ 761.6
[Kernel] memory leak - debug
가끔 가다가 커널 메모리 누수(memory leak) 이슈가 생길 때가 있어요.OOM Killer가 메모리가 부족하다고 커널이 메시지를 남기며 스스로 자살을 하거나,Low Memory Killer가 너무나도 자주 돌아서 락업 현상으로 검출되죠. 이런 이슈가 나왔을 때 어떻게 디버깅을 하면 좋을까요?한번 정리 좀 해볼께요. 1. 디버그 정보: contig_page_data.node_zones[0--1].free_area 우선 중 High/Low 메모리 Zone 중 어떤 Zone에서 페이지가 부족한 지 점검할 필요가 있어요.만약에 Low 메모리 존에서 메모리가 부족하면 커널 동작으로 포커스를 맞추어야 하구요,아래 경우와 같이 High Memory Zone에 Order 별로 free 페이지가 거의 없으면 더
[Linux][Kernel] T32 - 구조체 확인 (v.type)
T32로 디버깅을 하다보면 struct의 선언부를 확인하고 싶을 때가 있어요.예를 들어서 struct tty_struct 구조체의 멤버를 갑자기 확인하고 싶은 경우, "do do_struct.cmm tty_struct" 요렇게 입력하면 상세 멤버 변수를 확인할 수 있어요.struct tty_struct struct tty_struct struct(620 bytes, [0] int magic (signed 32 bits), [4] struct kref kref struct(4 bytes, [0] atomic_t refcount struct(4 bytes, [0] int counter (signed 3
[Linux][Kernel][Debug] T32 - container_of 매크로
리눅스 커널 코드를 분석하다 보면 아래 container_of 매크로를 자주 만날 수 있어요.void t21142_media_task(struct work_struct *work){ struct tulip_private *tp = container_of(work, struct tulip_private, media_work); struct net_device *dev = tp->dev; 그럼 T32으로 코어 덤프를 분석 할 때 위 매크로를 그대로 가져다 쓸 수 있는 방법이 있어요. 아주 간단히, 아래 명령어를 치면 되죠.sYmbol.NEW.MACRO offsetof(type,member) ((int)(&((type*)0)->member))sYmbol.NEW.MACRO container_o


