시스템호출

포스트: 17
Tags

Posts

17 posts

[리눅스커널][시스템콜] strace로 시스템콜 디버깅하기

Guillermo Austin Kim|2019년 2월 21일

리눅스에서는 시스템콜 디버깅을 위한 strace라는 훌륭한 툴을 제공합니다. 유저 프로그램이 실행할 때 어떤 시스템콜을 실행했는지 확인할 수 있습니다. strace 이란 툴은 리눅스에서 제공하는 강력한 시스템 트레이싱 기능입니다. 물론 라즈베리파이에서도 기본으로 설치되어 있어 바로 사용할 수 있습니다. strace는 다음 기능을 제공합니다.1. glibc(GNU C) 라이브러리에서 시스템 콜을 호출하는 함수 이름 출력2. 시스템콜 실행 후 반환값 이 기능을 쓰기 위해 우선 다음 코드를 시스템 프로그램으로 입력해 봅시다.1 #include 2 #include 3 #include 4 #include

[리눅스커널][시스템콜] ftrace로 시스템 콜 인자 디버깅하기

Guillermo Austin Kim|2019년 2월 21일

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로 시스템 콜 실행 확인하기

Guillermo Austin Kim|2019년 2월 21일

시스템 콜 관련 코드를 분석하다 보면 다음과 같은 의문이 생기지 않나요? 평소 시스템 콜은 얼마나 자주 발생할까?시스템 콜 번호는 어떻게 확인할 수 있을까? 이 의문에 대한 답은 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

[리눅스커널][시스템콜] 전처리 코드에서 시스템콜 핸들러 확인하기

Guillermo Austin Kim|2019년 2월 21일

전처리 코드에서 시스템 콜 핸들러 확인하기이번에는 전처리 코드에서 실제 시스템 콜 핸들러 구현부를 찾아보겠습니다. 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 명령어로 지정한 이름이 포함된 결과를 출력하면 되는 것입니다. 이전 절에서 시