시스템 콜은 응용프로그램에서 운영체제에게 어떠한기능(시스템 자원)을 수행해 달라고 하는 하나의 수단이다.

- 저수준 프로그래밍을 몰라도 프로그래밍 가능, 프로그램 호환성이 좋다.

- 사용자 요청을 처리하기전에 인터페이스 수준에서 올바른 요청인지 검사할 수 있으므로 시스템 보완성이 높다.

 

 

 

시스템 콜의 종류 - type 별로 구분

  - 프로세스 제어

  - 파일조작

  - 장치 관리

  - 시스템 정보 및 자원 관리

  - 통신관련

  - 시스템콜의 초기화는 시스템 부팅시 커널 초기화 과정에서 trap_init()함수 내의 set_system_gate(SYSCALL_VECTOR, &system_call)을

     수행해서 0x80 인터럽트를 위한 게이트 디스크립터를 설정

  • SYSCALL_VECTOR : 0x80로 정의된 상수
  • &system_call : 시스템 콜을 위한 핸들러주소

 메모리 주소 영역이 커널 주소영역사용자 주소영역 으로 구분되어있기 때문에, 사용자 프로세스에서 커널 영역에

 접근시 Segmentation Fault 메시지를 출력하면서 프로세스가 종료된다. (커널 스레드나 디바이스드라이버 계층만 접근가능) 

 

arm 은 SWI 명령을 사용하면 내부 인터럽트가 발생한다.

x86에서는 eax에 시스템 콜 번호를 넣고 0x80번 인터럽트를 발생시킨다.

 

ARM의 경우

 -- USER 모드의 태스트에서 SWI 명령을 사용해서 특권모드인 SVC 모드로 진입하고, SWI 핸들러는 SWI 명령의 인자로 넘어오는 시스템 콜 번호를 보고서 어떻게 동작할지 결정한다.

 

 

 

 그림[1] 시스템 콜

 

 

 

[그림2] 시스템 콜 함수 찾아가는 과정

 

음.. fork()함수를 썻을때 glibc라이브러리를 통해 vfork()로 연결되는 부분을 찾고싶은데????????........어떻게하지

일단 라이브러리 소스를 받아보았다.. 졸려...............퓨ㅜ

 

 

 

[그림3] ARM 에서의 시스템콜  호출순서를 보자

   1.  사용자 프로세스에서 fork를 호출

   2.  glibc에 래핑되어 있는 fork함수가 호출되어 vfork함수를 호출한다. swi __NR_vfork 명령으로 시스템 콜을 호출하면  

   3. exception vector table로 들어간다(커널영역)

       (fork()의 시스템 콜 번호가 0x02 므로 여기에 4를 곱해 ,해당 시스템 콜을 처리하는 함수의 주소가

       System Call Vector Table의 어느 위치에 있는지 계산)

   4. sys_fork() 함수로 분기

 

 glibc - GNU C library 의 약자. GNU 시스템과 Linux에서 사용되는 대표적인 C라이브러리

glibc받기

http://www.gnu.org/software/libc/

 

 

 

 

참고

 - 12장 시스템 콜 구현하기(도전 임베디드 OS만들기 [이만우])

 - 휴인스 쟈료   www.huins.com

 - 리눅스 커널기초 http://idkkangjs.blog.me/30091117058

 - ARM 아키텍쳐   http://www.jkelec.co.kr/img/lecture/arm_arch/arm_arch_3.html

 - FALinux Forum [커널산책]

http://forum.falinux.com/zbxe/index.php?document_srl=575411

 

'리눅스커널' 카테고리의 다른 글

ARM 리눅스 커널 3.0 포팅(Porting the Linux kernel 3.0 for ARM Architecture)  (0) 2016.06.23
커널컴파일  (0) 2015.04.17
systemcall  (0) 2015.04.15
스와퍼(Swapper)프로세스  (0) 2015.04.15
schedule()함수  (0) 2015.04.15

+ Recent posts