본문 바로가기

무언가 만들기 위한 지식/ARM Processor

System Call Interface

시스템 호출은 운영체제가 제공하는 서비스에 대한 프로그래밍 인터페이스 이다.


이는 사용자 프로그램(OS상에 로딩된 하나의 어플리케이션-통상 User Mode)에서 커널의 자원을 사용할 수 있도록 한다.
OS에 어플리케이션이 돌아가고 있다고 가정하면 기본적으로 해당 어플리케이션은 User 모드로 수행된다. 즉, Device Driver 또는 I/O 제어장치등에 비특권 권한으로 실행되고 있다. 그러나 비특권 모드의 경우에는 자원으로의 접근이 불가능하기 때문에 소프트웨어 적으로 인터럽트를 걸어 모드를 특권 모드로 변경해주어야 한다.

단, System Call 자체가 DeviceDriver들의 접근제어를 하지는 않는다.
이는 Kernel 내부에서 Resource Management 통해 여러 장비들을 관리할 뿐이다.


요약하자면 System Call에서는 비특권 모드에서 특권 모드로 전환시켜주어 자원에 접근할 수 있는 기회를 주는 것이다.
 (=OS의 Kernel도 일종의 응용프로그램의 일종이지만, OS위에 올라간 Application과는 다르다.
 
OS에서는 Application을 관리해주기 때문이다. Application 내에서 Kernel 상의 위치에서 자원을 사용해야할 때
  바로 System Call을 사용하게 된다.)

이는 OS상에서 돌아가는 어플리케이션들을 관리하기 위해 반드시 필요한 부분이다.
System Call이라는 인터페이스는 운영체제(OS)내에 탑재된 기능중 하나라고 보면 된다.
대부분의 프로그램들은 시스템 호출을 사용하기 보다는 고급 API를 통해 시스템 호출에 접근하게 된다.

ARM Processor 상에서 System Call을 구현하기 위해서는 SWI(Software Interrupt)를 사용하여 모드를 변환하는 과정을 거쳐야 한다.



위 도표는 기본적인 OS Kernel상의 시스템 콜 루틴이다.
User상에서는 System Call 함수가 포함된 Library상의 정의된 함수를 호출한다.
그 함수내에서는 SWI가 발생하고, 그후 핸들러를 따라 Kernel 상의 처리 Routine으로 가서 실행을 하고 다시 처음 분기 했던 곳으로 이동하는 모습이다.

ARM에서 구현될 System Call도 위와 똑같은 모습으로 구현될 것이다.


프로젝트 중에서 필자가 속한 팀이 OS팀중에 바로 이 System Call Interface 구현부였다. (나중에 깨달았지만 -.,-)
이 System Call의 의미를 처음에 파악하지 못해 방황했는데, 시간이 지나면서 알게 되었고 결국 구현도 성공했었다. ㅋ
System Call의 경우 Kernel 상에서 Function Table이 존재한다.
이는 "SWI 5;" 이런식으로 Software Interrupt발생시 실행할 Kernel상의 함수 번호를 말하고, 이 번호를 Index로 하여 Table 내의 함수를 실행하게 된다.
(이 과정은 System Call 구현부 포스팅에서 자세히 언급될 것이다.)

리눅스상 syscall에도 System Call Reference에 따라 각 번호에 해당하는 함수가 수행되게 된다.
그에 대한 Reference 및 소개는 아래 링크에서 확인할 수 있다.

조인시 위키:
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Assembly/Documents/
접속후, article_linux_systemcall_quick_reference 클릭~!