시스템 콜은 응용프로그램에서 운영체제에게 어떠한기능(시스템 자원)을 수행해 달라고 하는 하나의 수단이다.
- 저수준 프로그래밍을 몰라도 프로그래밍 가능, 프로그램 호환성이 좋다.
- 사용자 요청을 처리하기전에 인터페이스 수준에서 올바른 요청인지 검사할 수 있으므로 시스템 보완성이 높다.
시스템 콜의 종류 - 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 |