라즈베리파이
Posts
191 posts[라즈베리파이] 시스템 콜 - 커널 공간에서 시스템 콜 테이블 확인하기
시스템 콜 테이블은 sys_call_table 심볼에 저장돼 있습니다. 쉽게 설명을 드리면 전역 변수라고 봐도 무방합니다. T32 프로그램으로 시스템 콜 테이블을 확인하면 다음과 같습니다.d.v %y.l sys_call_table________address||value______|symbolNSD:80107FC4| 0x8012C6F4 \\vmlinux\kernel/signal\sys_restart_syscallNSD:80107FC8| 0x801212C0 \\vmlinux\exit\sys_exitNSD:80107FCC| 0x8011C100 \\vmlinux\fork\sys_forkNSD:80107FD0| 0x8026AB24 \\vmlinux\read_write\sys_readNSD:80107FD4|
[라즈베리파이] 시스템 콜 - 소프트웨어 인터럽트 벡터(vector_swi) 코드 분석
커널 공간에서 시스템 콜 실행 출발점은 vector_swi 레이블입니다. svc 명령어를 실행하면 소프트웨어 인터럽트 벡터인 vector_swi 레이블으로 브랜치하기 때문입니다. vector_swi 레이블 어셈블리 코드 분석으로 ARM 리눅스 커널에서 시스템 콜이 어떻게 동작하는지 살펴봅시다. vector_swi 레이블 어셈블리 코드는 다음과 같습니다.1 80107ee0 :2 80107ee0: e24dd048 sub sp, sp, #72 ; 0x483 80107ee4: e88d1fff stm sp, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip}4 80107ee8: e28d803c add r8, s
[라즈베리파이] 시스템 콜 - 커널 모드에서 시스템 콜을 어떻게 실행할까?
이번 절에서는 커널 공간에서 시스템 콜을 어떻게 실행하는지 살펴보겠습니다.다음 그림 전체 흐름도에서 검은색으로 표시된 부분을 눈여겨봅시다. 위 그림에서 검은색으로 된 부분입니다. 유저 공간에서 소프트웨어 인터럽트를 유발했으니 소프트웨어 인터럽트 벡터인 vector_swi 레이블이 실행합니다. 유저 공간에서 “svc 0x0” 이란 명령어를 실행하면 vector_swi 이란 시스템 콜 처리용 인터럽트 벡터로 프로그램 카운터를 이동하는 것입니다. 유저 공간에서 지정한 시스템 콜 번호는 r7 레지스터에 실려서 옵니다. 이 시스템 콜 번호를 통해 시스템 콜 테이블에 접근한 후 시스템 콜 핸들러로 분기합니다. ARM 프로세서 관점으로 시스템 콜을 실행하면 커널 공간에서 다음과 같은 동작을 수행합니다.1>
[라즈베리파이] 시스템 콜 - 유저 공간 시스템 콜 발생 어셈블리 코드 분석
아키텍처별로 시스템 콜을 실행하는 동작은 다릅니다. 시스템 콜을 실행하는 동작은 어셈블리 코드로 구현되어 있습니다. 라즈베리파이가 탑재한 ARM(ARM32) 아키텍처에서는 시스템 콜은 다음과 같이 구현돼 있습니다.1. r0 ~ r5 레지스터에 시스템 콜로 전달할 인자 지정2. r7 레지스터에 시스템 콜 번호 저장3. "svc 0x00000000" 명령어 실행 GNU C 라이브러리 파일에서 실제 시스템 콜을 실행하는 어셈블리 코드를 봅시다. write() 함수에 대한 시스템 콜을 실행하는 코드를 소개합니다.00000020 :1 20: e59fc060 ldr ip, [pc, #96] ; 88 2 24: e79fc00c


