안녕하세요 허언증입니다.!!
1.System call이란?
System call이란? 운영체제가 제공하는 서비스를 사용자가 이용할 수 있도록 해준다. 유닉스에선 표준 System call 세트가 정해져 있으며, 쉽게 설명하면 유저가 응용프로그램을 이용해 명령을 OS에게 "이것 좀 처리해줘" 하는 것이다.
2.System call의 구조
운영체제는 크게 커널모드(Kernel Mode)와 사용자모드(User Mode)로 나뉘어 구동된다. 커널 모드는 모든 시스템 메모리 접근 가능하며, 모든 CPU명령 실행이 가능하다. 반면 사용자 모드는 사용자 애플리케이션 실행. 하드웨어 직접 접근 불가. System call 호출 시 일시적으로 커널모드로 전환. 커널영역의 기능을 사용자모드가 접근하게 도와준다. 운영체제에서 프로그램이 구동되는데 있어 파일을 읽어 오거나, 파일을 쓰거나, 혹은 화면에 메시지를 출력하는 등 많은 부분이 커널 모드를 사용한다. System call은 이러한 커널 영역의 기능을 사용자 모드가 사용 가능하게, 즉 프로세스가 하드웨어에 직접 접근해서 필요한 기능을 사용할 수 있게 해준다. 통상적으로 시스템 콜은 여러 종류의 기능으로 나뉘어져 있다. 각 시스템 콜에는 번호가 할당되고 시스템 콜 인터페이스는 이러한 번호에 따라 인덱스 되는 테이블을 유지된다. [그림1]은 open() System call을 호출 했을 때 운영체제에서 어떻게 처리되는지를 보여준다. open()함수 뿐 아니라 현재 프로세스의 종류할 때 사용하는 exit(), 자식 프로세스의 생성할 때 fork(), 파일을 지정자로부터 일기,쓰기할 때 read()/write() 함수등이 존재한다.
3.System call 사용 목적
이들은 시스템 헤더파일인 syscall.h와 unistd.h에 정의되어 있다. 그리고 System call() 함수를 직접 실행시켜서 사용하는 방법도 있지만, 표준 라이브러리를 통한 포장 함수에 의해 호출하는 방법도 있다. [그림2] 참고
System call을 왜 사용하는 건가? 이유는 간단하다. User가 애플리케이션으로 운영체제의 치명적인 데이터를 수정/삭제하는 권한을 막기 위해서다. 직접적인 하드웨어 요청이나 기타 시스템요청은 OS가 제공하는 System call을 통해 호출하도록 제공한다. 만약 유저 애플리케이션이 System call을 호출하여 사용하면 해당 애플리케이션은 커널모드로 잠시 전환되는 작업을 거치게 된다.
4.System call 매개변수 전달 방식 /System call 종류
필요한 기능이나 시스템 환경에 따라 System call이 발생할 때 좀 더 많은 정보가 필요할 수 있다. 그러한 정보가 담긴 매개변수를 운영체제에 전달하기 위해서는 대략 3가지 정도의 방법이 있다. (1)매개변수를 CPU 레지스터 내에 전달한다. 이 경우에 매개변수의 갯수가 CPU 내의 총 레지스터 개수보다 많을 수 있다. (2)위와 같은 경우에 매개변수를 메모리에 저장하고 메모리의 주소가 레지스터에 전달된다. (3)매개변수는 프로그램에 의해 스택(stack)으로 전달(push) 될 수도 있다. 비교적 (1)의 경우는 CPU 레지스터의 공간이 부족하면 누락이 될 수 있기 때문에 선호를 잘 하지 않고 (2),(3)번 방식을 선호한다.
System call은 다섯 가지의 범주로 나눌 수 있다. 프로세스 제어, 파일조작, 장치조작, 정보 유지보수, 통신과 보호 첫 번째로 프로세스 제어에서이 기능은 끝내기, 중지, 적재,실행, 프로세스 생성, 메모리할당 등이 있다. 파일조작은 파일생성,삭제, 열기,닫기, 읽기,쓰기,위치변경 등이 있다. 장치관리는 논리적으로 부착 또는 분리 장치 속성 획득이 있다. 정보 유지에는 시간과 날자 획득 프로세스 파일 장치 속성의 획득 및 설정이 있다. 통신에는 통신 연결의 생성 제거 메시지의 송,수신 등이 있다.
5.System call 세부 동작원리
User AI Program을 실행하게 printf()가 실행이 됩니다. library 함수인 printf() 호출하게 되고 이는 내부에 write()라는 system call 함수를 재차 호출합니다. 이렇게 호출된 write() library 함수(aka system call 함수)를 wrapper 함수라고 하며, 이상의 과정을 system call wrapper routine이라고 합니다. 이 library 함수는 CPU내에 있는 범용 register 중의 하나인 eax register에 write() 함수에 할당되어 있는 고유한 번호인 4를 넣습니다.
다음으로 0x80을 인자로 트랩(trap)을 걸게 됩니다. 커널은 트랩 번호인 0x80(Intel CPU에서...)을 IDT(Interrupt Descriptor Table)에 검색하여 이에 해당하는 system_call()을 엔트리(ENTRY)에서 호출합니다. 이 함수는 eax(=4) 값을 index로 sys_call_table을 탐색합니다. 현재 eax register에 들어있는 4값으로 sys_write의 포인터 값을 받아 sys_write()함수를 호출하게 됩니다.
'# OS > [ Linux ]' 카테고리의 다른 글
[허언증/리눅스] 가상 파일시스템(VFS - Virtual FileSystem) / 슈퍼블록(SuperBlock) (0) | 2020.04.17 |
---|---|
[허언증/리눅스] 프로세스 U-area/proc table 이란? (feat. linux) (0) | 2020.04.02 |
[허언증/리눅스] Linux 네임서버 구축 (DNS서버) (0) | 2020.03.13 |
[허언증/리눅스] Linux 네임서버 개념 및 구조 (DNS서버) (0) | 2020.03.13 |
[허언증/리눅스] 캐싱 전용 네임 서버 설치 및 접속 (linux) (0) | 2020.03.12 |