Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

11206
629
98793


[라즈베리파이] 시스템 콜 - 커널 모드에서 시스템 콜을 어떻게 실행할까? 11장. 시스템 콜

이번 절에서는 커널 공간에서 시스템 콜을 어떻게 실행하는지 살펴보겠습니다.
다음 그림 전체 흐름도에서 검은색으로 표시된 부분을 눈여겨봅시다.

위 그림에서 검은색으로 된 부분입니다. 유저 공간에서 소프트웨어 인터럽트를 유발했으니 소프트웨어 인터럽트 벡터인 vector_swi 레이블이 실행합니다. 유저 공간에서 “svc 0x0” 이란 명령어를 실행하면 vector_swi 이란 시스템 콜 처리용 인터럽트 벡터로 프로그램 카운터를 이동하는 것입니다. 

유저 공간에서 지정한 시스템 콜 번호는 r7 레지스터에 실려서 옵니다. 이 시스템 콜 번호를 통해 시스템 콜 테이블에 접근한 후 시스템 콜 핸들러로 분기합니다.

ARM 프로세서 관점으로 시스템 콜을 실행하면 커널 공간에서 다음과 같은 동작을 수행합니다.
1> 유저 공간에서 실행 중인 프로세스 레지스터 세트를 프로세스 최하단 스택 공간에 푸시
2> 시스템 콜에서 유저 공간에서 전달한 시스템 콜 번호를 r7 레지스터에서 읽어 시스템 콜 테이블에서 시스템 콜 핸들러 함수로 분기
   : 각 시스템 콜 핸들러 함수 서브 루틴 실행
3> 프로세스 최하단 스택 공간에 푸시한 레지스터를 팝해서 ARM 레지스터에 다시 저장
  : 소프트웨어 인터럽트 발생 직전 코드로 이동함

소프트웨어 인터럽트 벡터 소개
시스템 콜은 ARM 아키텍처와 연관이 깊은 동작입니다. 시스템 콜은 익셉션의 한 종류로 실행하는데 익셉션은 CPU 마다 달리 구현되어 있습니다.

익셉션이 발생하면 ARM 프로세서는 실행하던 동작을 멈추고 익셉션 종류 별로 이미 정해진 주소를 프로그램 카운터로 바꿉니다. 익셉션 별로 실행하는 이미 정해진 주소는 익셉션 벡터라고 합니다. 

시스템 콜을 호출하면 소프트웨어 인터럽트가 발생하며 유저 공간에서 커널 공간으로 이동한 다음 익셉션 벡터인 vector_swi 레이블로 함수 주소를 바꿉니다. 이후 다음과 같은 동작을 수행합니다.
1> 유저 공간에서 실행 중인 프로세스 레지스터를 프로세스 최하단 스택 공간에 푸시
2> 시스템 콜에서 유저 공간에서 전달한 시스템 콜 번호를 R7 레지스터에서 읽어 시스템 콜 테이블에서 시스템 콜 핸들러 함수로 분기
   : 각 시스템 콜 핸들러 함수 서브 루틴 실행
3> 프로세스 최하단 스택 공간에 푸시한 레지스터를 팝해서 ARM 레지스터에 다시 저장
  : 소프트웨어 인터럽트 발생 직전 코드로 이동함

유저 공간에서 “svc 0x0” 이란 명령어를 실행하면 vector_swi 이란 시스템 콜 처리용 인터럽트 벡터로 프로그램 카운터를 이동합니다. vector_swi 레이블은 ARM 프로세스를 직접 제어하는 어셈블리 코드로 구성돼 있습니다.

1초에 수 십번 이상 시스템 콜이 수행하기 때문에 ARM 프로세스를 최적화해서 구동할 수 있는 어셈블리 코드로 구성돼 있습니다.


시스템 콜 벡터 테이블이 실행하기 직전 R7에 시스템 콜 번호가 저장돼 있다는 사실을 기억합시다.


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

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


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

핑백

덧글

댓글 입력 영역