Guillermo Austin Kim
Posts
998 posts[리눅스커널][시스템콜] ftrace로 시스템 콜 인자 디버깅하기
ftrace는 시스템 콜 디버깅을 위한 이벤트를 제공합니다.sys_enter, sys_exit 이라는 ftrace 이벤트를 쓰면 시스템 콜 동작을 확인할 수 있습니다. 위 이벤트를 키면 다음과 같은 시스템 콜 디버깅 정보를 출력합니다.1> 시스템 콜 번호2> 시스템 콜이 실행와 종료 시각3> 시스템 콜 핸들러 함수로 전달된 인자 sys_enter와 sys_exit ftrace 이벤트는 어떻게 설정할 수 있을까요? 다음 명령어로 sys_enter와 sys_exit 이벤트를 키는 enable 파일을 1로 써주면 됩니다.echo 1 > /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/enableecho 1 > /sys/kernel
[리눅스커널][시스템콜] ftrace로 시스템 콜 실행 확인하기
시스템 콜 관련 코드를 분석하다 보면 다음과 같은 의문이 생기지 않나요? 평소 시스템 콜은 얼마나 자주 발생할까?시스템 콜 번호는 어떻게 확인할 수 있을까? 이 의문에 대한 답은 ftrace 로그에서 찾을 수 있습니다. 시스템 콜을 ftrace 로 디버깅을 할 수 있기 때문입니다. 이를 위해 ftrace를 다음과 같이 설정합니다.1 "echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable"2 "echo 1 > /sys/kernel/debug/tracing/events/raw_syscalls/enable"3 "echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_entry/e
[리눅스커널][시스템콜] 전처리 코드에서 시스템콜 핸들러 확인하기
전처리 코드에서 시스템 콜 핸들러 확인하기이번에는 전처리 코드에서 실제 시스템 콜 핸들러 구현부를 찾아보겠습니다. sys_read() 시스템 콜 핸들러를 찾으려면 다음 명령어을 입력하면 됩니다.root@raspberrypi:/home/pi/RPi_kernel_src/linux #egrep -nr SYSCALL_DEFINE * | grep read...fs/read_write.c:566:SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count) 시스템 콜 핸들러는 SYSCALL_DEFINE으로 시작하는 매크로로 선언됐으니 이 매크로로 검색하고 grep 명령어로 지정한 이름이 포함된 결과를 출력하면 되는 것입니다. 이전 절에서 시
[리눅스커널][시스템콜] SYSCALL_DEFINEx 매크로로 시스템콜 핸들러 선언
시스템 콜 관련 리눅스 커널 코드를 분석하려고 할 때 만나는 걸림돌은 어느 소스 코드를 봐야할 지 모르겠다는 것입니다. 시스템콜 핸들러 함수는 구현부를 찾기 어렵습니다. 한 가지 예를 들어 봅시다.리눅스 저수준 함수인 write() 와 read() 함수에 대한 시스템 콜 핸들러 함수는 sys_read()와 sys_read() 라고 합니다. 아무리 소스 코드에서 sys_read()와 sys_read() 함수를 검색해도 코드 위치를 찾기 어렵습니다. 그 이유는 시스템 콜 핸들러 함수는 리눅스 커널에서 제공하는 SYSCALL_DEFINE1과 같은 매크로 함수로 선언되어 있기 때문입니다. 시스템 콜 핸들러는 처리하는 인자 갯수에 따라 다음과 같이 선언합니다.SYSCALL_DEFINEx(시스템콜 번호, 1번째
[리눅스커널] 워크큐(workqueue): Trace32로 워크큐 자료 구조 디버깅하기
이번 시간에는 임베디드 디버깅 프로그램인 Trace32를 써서 워크큐 자료구조를 점검합니다. 리눅스 커널 시스템에서 커널 크래시가 나면 생성되는 vmcore를 올려 확인한 내용입니다. 참고로, vmcore는 라즈베리파이가 아니라 다른 ARM64비트 아키텍처를 적용한 시스템에서 받았습니다. 먼저 시스템 워크큐 전역 변수를 확인합니다.var.view %type %string system_wq1 (static struct workqueue_struct *) system_wq = 0xFFFFFFC632C15080 -> (2 (struct list_head) pwqs = ((struct list_head *) next = 0xFFFFFFC63A3B2870 3 (struct list_head)



