Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

81235
1036
103651


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

이렇게 시스템 콜 핸들러 함수는 커널에서 제공하는 매크로 함수로 구현이 됐습니다. 이번에는 전처리 코드에서 시스템 콜 핸들러 구현부를 찾는 방법을 소개합니다. 

먼저 커널 소스에서 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)

‘egrep -nr SYSCALL_DEFINE *  | grep read’ 명령어는 다음과 같은 동작을 처리합니다.
리눅스 커널 전처리 코드에서 'SYSCALL_DEFINE’ 문자열을 찾아라. 
'SYSCALL_DEFINE’ 문자열이 들어있는 파일 중에 read 문자열이 있는 결과만 라인(행)을 화면에 출력해라.

시스템 콜 핸들러는 SYSCALL_DEFINE으로 시작하는 매크로로 선언됐으니 이 매크로로 검색하고 grep 명령어로 지정한 이름이 포함된 결과를 출력하는 의도입니다. 

시스템 콜 핸들러는 SYSCALL_DEFINEx(x는 인자 개수 0~6 범위 숫자) 매크로를 써서 선언됐습니다. 이 정보를 활용해서 코드를 검색한 것입니다.

이어서 sys_write() 시스템 콜 핸들러를 찾으려면 다음 명령어를 입력하면 됩니다.
root@raspberrypi:/home/pi/RPi_src/linux #egrep -nr SYSCALL_DEFINE *  | grep write
...
fs/read_write.c:581:SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,

그런데 전처리 코드를 보면 시스템 콜 핸들러 함수를 더 쉽게 확인할 수 있습니다.

이어서 다음 전처리 코드를 봅시다.
01 [out/fs/.tmp_read_write.i]
02 long sys_write(unsigned int fd, const char * buf, size_t count) __attribute__((alias("__se_sys_write")));  
...
03 {
04  return ksys_write(fd, buf, count);
05 }
06 
...
07 long sys_read(unsigned int fd, char * buf, size_t count) __attribute__((alias("__se_sys_read")));
...
08 {
09 return ksys_read(fd, buf, count);
10 }

2번째 코드와 07번째 코드를 보면 각각 sys_write()와 sys_read() 함수 시작 코드와 구현부 코드를 볼 수 있습니다. 새로운 시스템 콜 핸들러를 찾을 때 전처리 코드를 이 방식으로 찾아서 소스 코드를 검색해 봅시다.

이렇게 전처리 코드는 매크로를 모두 풀어서 커널 코드를 표현하므로 코드를 더 직관적으로 읽을 수 있습니다.



"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)


#Reference: 시스템 콜
시스템 콜 주요 개념 소개
유저 공간에서 시스템 콜은 어떻게 발생할까
시스템 콜 핸들러는 어떤 동작을 할까? 
시스템 콜 실행 완료 후 무슨 일을 할까?
시스템 콜 관련 함수  
시스템 콜 디버깅  



핑백

덧글

댓글 입력 영역