| uftrace를 통해서 user + lib + kernel 호출과정 추적하기
[정리]
1. 주제
- uftrace를 통해 mv 명령의 시스템콜 rename 호출과정을 탐색
2. 전체 내용 요약
1) uftrace record 기능을 사용해 mv 동작시 발생하는 call trace 수집
2) uftrace replay 기능을 사용해 전체 호출 과정 확인
3) mv 동작을 위해 사용되는 rename syscall에 대한 호출 과정 확인
[1) uftrace record 기능을 사용해 mv 동작시 발생하는 call trace 수집]
$ touch file # mv 동작을 하기 위한 file을 생성
$ sudo uftrace record --force -K 5 /bin/mv file file-mv # file에 대해 file-mv로 이름 변경
uftrace record 동작 수행시 trace 관련 파일들이 uftrace.data 경로에 생성됨
[2) uftrace replay 기능을 사용해 전체 호출 과정 확인]
해당 trace 파일들을 이용해 reaplay 수행을 하기 위해선 아래 명령어를 수행 해야 함
기타 옵션들이 추가적으로 많이 존재함 ex) function filtering, time resolution
tracing 과정에서 다른 함수들도 포함될 수 있으며, 시간 값 조절 및 filtering을 통해 원하는 함수의 내용을 추출 할 수 있음
$ uftrace replay -t 2ms
함수 콜 내용을 보면 application (/bin/mv)에서 rename을 호출하고 rename은 system call, vfs call 등...을 수행해 결국 file의 이름을 변경 함
[3) mv 동작을 위해 사용되는 rename syscall에 대한 호출 과정 확인]
/bin/mv는 여러가지 .so 파일들이 연결되어 있으며 이를 ldd(List Dynamic Dependencies)를 통해 확인 가능함
rename syscall 또한 연결된 .so 파일 중 하나 (libc.so.6)에 존재함
$ ldd /bin/mv
연결된 library 중 libc.so.6 내에서 rename이 구현된 것을 확인
$ objdump -d /lib/x86_64-linux-gnu/libc.so.6 | less
less 화면 상에서 rename 탐색
/bin/mv는 libc.so.6내 존재하는 rename을 호출하며, libc.so.6내 존재하는 rename은 위의 disassemble코드내 두번째 줄에 작성된 것 처럼 syscall을 호출함
system call table내 존재하는 vector table을 존재하기 위해 nr 값이 필요하며, 이 nr 값은 여기에서 보이는 0x52 값임
nr = 0x52 = 82, 82에 위치한 vector table을 접근해 syscall을 수행함
$ vim /usr/include/x86_64-linux-gnu/asm/unistd_64.h
Syscall이 호출되는 되는 과정에 대해 살펴 보자
$ vim ${linux}/arch/x86/entry/entry_64.S
x86_64 CPU이며, 175번째 위치한 do_syscall_64를 호출함으로써 system call을 호출하게 됨
$ vim ${linux}/arch/x86/entry/common.c
do_syscall_64가 호출되어 common.c::do_syscall_64를 호출하며, sys_call_table[nr]을 통해 table을 호출하게 됨
앞에서 언급했던 rename의 nr은 0x52 = 82이며, sys_call_table[82]에 rename 함수 포인터가 세팅되어 있음
rename 정의를 쉽게 찾기 위해 아래 명령을 수행
$ ag SYSCALL_DEFINE | grep rename
fs/namei.c:4671에 rename에 대한 syscall이 정의 되어 있으며, 확인 하면 아래와 같으며, do_renameat2()에서 vfs_rename을 호출하게 됨
vfs_rename 내에선 error = old_dir->i_op->rename() 부분에서 file system의 rename call을 수행하게 되고 ext4와 연결됨
'Linux Kernel' 카테고리의 다른 글
[운영체제] [리눅스 커널 5.0 동작과정 이해와 tracing 실습] 2일차 - 가상메모리, Page fault handling (2/2) (1) | 2021.10.07 |
---|---|
[운영체제] [리눅스 커널 5.0 동작과정 이해와 tracing 실습] 2일차 - 수업 중 필기 (0) | 2021.10.06 |
[운영체제] [리눅스 커널 5.0 동작과정 이해와 tracing 실습] 1일차 - 가상메모리, Page fault handling (1/2) (0) | 2021.10.05 |
[운영체제] Coredump, dmesg (0) | 2021.03.19 |
[커널] nvme device driver 분석 자료구조 (0) | 2021.02.02 |