Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

11206
629
98793


[리눅스커널] 시스템 콜 소개 11장. 시스템 콜

시스템 콜은 유저 모드에서 커널 모드로 진입하는 동작입니다. 시스템 콜은 다른 관점으로 유저 공간과 커널 공간 사이 가상 계층이자 인터페이스입니다.

유저 공간과 커널 공간 소개
그렇다면 여기서 말하는 유저 공간과 커널 공간이란 무엇일까요? 리눅스에서는 실행 공간을 메모리 접근과 실행 권한에 따라 유저 공간과 커널 공간으로 분류합니다. 

먼저 커널 공간이 무엇인지 알아볼까요? 
   "커널 코드가 실행할 때는 모든 커널 함수 호출이 가능"
   "제약 없이 메모리 공간에 접근해서 하드웨어를 제어"

이런 시스템 상태를 커널 공간이라고 부릅니다. 

다음은 유저 공간을 알아봅시다. 
   "유저 어플리케이션 코드가 구동하는 동작과 상태"
   "유저 공간에서 실행하며 메모리 공간 접근에 제한이 있어 하드웨어에 직접 접근할 수 없음 "

     
유저 어플리케이션에서 권한이 없는 메모리 공간에 접근하면 커널은 오류를 감지해서 해당 프로세스를 종료시킵니다.

시스템 콜은 누가 언제 발생시킬까
시스템 콜은 유저 모드에서 실행 중인 어플리케이션에서 커널에게 어떤 서비스를 요청할 때 실행을 시작합니다. 유저 어플리케이션에서 다음과 같은 실행을 할 때 주어진 규약에 맞게 커널에 서비스를 요청을 하는 것입니다. 
-   파일시스템에 접근해서 파일을 읽고 쓰고 싶을 때 
-   PID와 같은 프로세스 정보를 얻으려 할 때
-   시스템 정보를 얻고 싶을 때

이를 위해 시스템 콜을 발생해서 유저 공간에서 커널 공간으로 실행 흐름을 이동합니다.

이 동작은 다음 그림으로 표현할 수 있습니다.
                         
[그림 11.1] 시스템 콜 동작

위 그림에서 보이듯, 시스템 콜을 통해 유저 공간에서 커널 공간으로 진입할 수 있습니다.  

시스템 콜 동작은 왜 잘 알아야 할까
이번에 시스템 콜 세부 동작을 왜 잘 알아야 하는지 생각해봅시다. 

문제 해결 능력을 키울 수 있음
개발자들에게 시스템 콜을 잘 알아야 한다고 말하면 다음과 같은 반문을 할 수 있습니다. 

   "시스템 콜은 리눅스 시스템에서 당연히 잘 동작하는데 왜 알아야 할까?"

필자는 이 질문에 대해 "문제 해결 능력을 키우기 위해 시스템 콜 동작을 잘 알아야 한다"고 대답하고 싶습니다. 

리눅스 시스템 저수준 함수를 써서 응용 어플리케이션 코드는 누구나 작성할 수 있습니다. 그런데 리눅스 시스템 프로그램을 개발 하다 보면 리눅스 표준 함수를 호출했는데 이 함수들이 가끔 에러를 반환합니다. 예상치못한 동작으로 정해진 시나리오로 프로그램이 동작하지 않게 됩니다. 시스템 콜이 유저 공간에서 커널 공간까지 어떤 흐름으로 동작하는지 잘 알면 어디부터 분석을 시작해야 할지 알 수 있습니다. 

그렇다면 시스템 콜 세부 동작은 어떻게 디버깅할 수 있을까요? 

   "ftrace로 디버깅을 하면 시스템 콜을 실행할 때 세부 인자와 반화값을 알 수 있다."

이렇게 시스템 콜 처리 과정을 파악하고 ftrace로 시스템 콜 디버깅을 하면 더 빨리 문제를 해결할 수 있습니다. 사실 실전 개발에서 이와 비슷한 문제가 생겼을 때 어느 코드부터 분석을 시작할지 모를 때 참 난감합니다. 어느 코드부터 분석을 시작할 지 아는 것과 모르는 것은 천지 차이입니다.

안정적인 코드 작성 
리눅스 시스템 저수준 함수를 써서 응용 어플리케이션 코드는 누구나 작성할 수 있습니다.
그런데 시스템 콜 전체 흐름을 제대로 이해한 분이 더 안정적인 코드를 작성할 가능성이 높습니다. 시스템 콜을 실행해 리눅스 커널 어느 함수에서 이를 처리하는지 알면 에러 코드의 의미를 파악할 수 있습니다. 또한 에러 코드를 반환했을 때 예외 처리 코드를 추가할 수 있습니다.

다음 절에서는 시스템 콜 전체 흐름도와 동작에 대해서 살펴보겠습니다.

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





핑백

덧글

댓글 입력 영역