이번 산책길에서는 시스템 콜 만능 함수 

syscall() 함수에 대해서 알아보죠

이번 산책 길은 

이 함수 설명만으로 끝낼 것이므로 

무척 짧은 길이 될겁니다. 조오~~타!

우리가 흔히 쓰는 

시스템 콜 함수 open() , close() 함수들은

최종적으로 swi 어셈블 명령으로 호출하도록 변환됩니다. 

그래서 open(), close() 함수들을 랩퍼 함수라고 합니다. 

흠... 랩퍼 발음이 맞나... 

랩퍼 함수는 함수에 목적하는 구현 코드가 있는 것이 아니고 

다른 형태의 호출 처리 부분만 소스로 구현하고 

이를 알아 보기 쉽게 

C 함수 형태의 이름을 지어 놓고 

이를 호출하도록 하는 함수들을 랩퍼 함수라고 하죠..

스펠링이... 흠.... 아.. 영어 실력이 딸려요...

거두절미 하고 

자 여러분이 GNU 라이브러리인 glibc 계열을 쓴다면

그거 만드신 고마운 분들이 모든 시스템 콜들을 

잘... 랩퍼해 주셨습니다. 우린 그냥 쓰면 됩니다.  편하죠...

그런데 여러분이 

이제 시스템 콜을 하나 만들어서 

커널에 추가해야 한다고 합시다..

그러면 랩퍼 함수 하나 만들어야 하잖아요... 

어셈블러로 코딩 하면서...

싫죠? 어셈블러... 

저도 어셈블러로 코딩하는 거 싫어요..

그럼 ?

예.....

이럴때 사용할 수 있는 만능 함수가 하나 있습니다. 

그게 바로 syscall() 함수죠

참고로

예전에는 매크로를 이용해서 하도록 했고 

대부분의 커널 책들이 이 방법을 소개해 놓고 있었는데

지금은 그 방법이 더 이상 통하지 않습니다. 

대신 syscall() 함수를 써야 합니다. 

자....

그럼 어떻게 사용해야 할까요?

먼저 깔끔한 정리 부터...

먼저 모양새는 

int syscall(int number, ...);

요로코롬 생겼습니다. 

간단하죠?

number 는 시스템 콜 번호 입니다.

그리고 그 뒤에 인자는 가변 인자... 

그래서 만능이죠.. 

그러면 쓸수 있는 시스템 콜 번호는 어디에 있을까요?

바로 요기

asm-arm/unistd.h 

파일에 있습니다. 

보통 크로스 컴파일러의 헤더파일이 있는 곳에서 위 파일을 찾아야 합니다. 

시스템 콜은 아키텍쳐 마다 틀리죠..

그렇지만 syscall() 함수를 쓸때는 

#include <sys/syscall.h>
#include <unistd.h>

이런식으로 헤더 파일을 써 주시면 됩니다. 

자 어떻게 쓸까요?

예를 들어 getpid() 함수는 

시스템 콜 번호가 얼마인지 모르지만 위 헤더파일에 의해서 

SYS_getpid 식으로 지정됩니다. 

시스템 콜 매크로 상수 이름 유추하기 쉽죠?

원래 getpid() 함수는 이런식으로 사용하죠

long id;
  
id = getpid();
printf("getpid() = %ld\n", id);

이걸 이렇게 고쳐 써도 똑같은 기능을 합니다. 

long id;
  
id = syscall(SYS_getpid)
printf("getpid() = %ld\n", id);

보면 딱! 아시겠죠?

오늘은 여기까지... 헥헥...

다음 산책길에는 

임베디드 시스템에서 최적화 하려면 

기존 크로스 컴파일러를 사용하기 보다는 

직접 크로스 컴파일러를 빌드를 해야 좋은지 

그 이유를 

알려 드릴께요.

그 이유중 하나가 바로 시스템 콜과 관련이 있거든요..
 
바바이...