시스템 콜이란?
응용 프로그램에서 OS에게 "이것좀 처리해주세요" 하면서 부르는 것.
즉, 커널에서 사용자에게 제공하는 함수를 호출하라 이런 기능으로 쓰이는 것이다.
시스템 콜을 활용하면 굳이 로우레벨 언어에 대한 이해가 없더라도 손쉽게 프로그래밍을 할 수 있다.
(그래서 지금 우리처럼 고급언어로만 코딩을 하는 시대에 이르렀지..)
소프트웨어 인터럽트에는 고유한 번호가 존재한다.
커널에서 시스템콜의 기능에 따라 구분짓기 위해 고유하게 붙여놓은 번호인데,
커널은 이 번호를 보고 그에 따른 서비스 루틴을 수행한다.
시스템 콜은 "소프트웨어 인터럽트"의 한 종류이다.
위에서 설명한 기능별로 구분지은 고유번호는 IDT(Interrupt Descriptor Table)이라는 곳에 저장된다.
인터럽트가 일어나면, IDTR이라는 레지스터에 IDT를 가르키는 위치가 명시되어 있다.
그걸 보고 IDT에서 인터럽트 종류를 확인하고 처리한다.
우리가 공부하는 시스템콜은 IDT에서 0x80의 고유번호를 갖는다.
시스템콜이 일어나는 과정을 순서대로 나열하자면,
1. 응용프로그램에서 소프트웨어 인터럽트가 일어난다.
2. C 라이브러리 (libc.a)에서 기능에 따른 시스템콜 고유번호가 레지스터에 저장되고 0x80 인터럽트를 건다. (system call)
3. 커널은 IDT 엔트리를 참조하여 알맞는 서비스 루틴을 수행한다.
위 그림의 예제에서는 0x80의 인터럽트 즉, 시스템 콜을 수행하면서
시스템 콜 테이블의 4번, write함수를 호출해달라 이말이다.
(아까 시스템콜은 커널이 사용자에게 제공하는 함수를 호출해달라는 것이라고 설명했었다.)
참고: https://wiki.kldp.org/KoreanDoc/html/EmbeddedKernel-KLDP/idt.html
'IT 그리고 정보보안 > Knowledge base' 카테고리의 다른 글
C언어 컴파일 과정 (0) | 2021.04.18 |
---|---|
Shell 실행 함수 종류 (0) | 2021.04.18 |
리눅스 find 명령어 활용 (0) | 2021.04.18 |
SFX (Self-extracting file) Archive (0) | 2021.04.18 |
리눅스 서버 구동 과정 (0) | 2021.04.18 |