목차
1. System Call이란?
•
운영체제에 의해서 제공되는 다양한 서비스를 얻기 위해서 프로그램(개발자들이 만드는, 코딩하는 프로그램)이 사용하는 인터페이스
•
프로그램이 운영체제의 서비스를 받고 싶으면 System Call의 형태로 서비스를 요청해야 함.
◦
운영체제의 서비스: 파일 리드, 프로세스 생성
•
ex) 파일 리드 위해 System Call하는 과정
1.
Procedure Call(System Call api 중 하나)
2.
Procedure에 실제 System Call 수행하는 동작들이 코딩되어 있어 이가 수행됨.
2. 대부분의 CPU의 두 가지 모드: kernel 모드와 user 모드
•
CPU는 어느 순간 둘 중 하나의 모드로 수행됨.
•
CPU 속 PSW의 한 비트가 모드를 컨트롤함. → 모드 변경, 현재 모드 확인
•
kernel 모드
◦
CPU는 자신의 명령어 집합의 어떤 명령어도 수행 가능.
→ 하드웨어의 모든 feature 사용 가능.
◦
운영체제 코드는 일반적으로 kernel 모드에서 수행.
→ 하드웨어에 대한 모든 제어, 접근 가능.
•
user 모드
◦
CPU의 전체 명령어 집합 중 일부분만 수행 가능.
→ 하드웨어의 일부분만 접근 가능.
◦
우리가 만드는 유저 프로그램은 user 모드에서 수행.
•
ex) i/o(입출력)에 관한 명령이나 memory protection에 관한 명령은 보통 user 모드에서 수행 허용되지 않음. kernel 모드에서만 허용됨.
3. 유저 프로그램이 운영체제로부터 서비스 받기 위해 system call 하는 과정 (with 모드 전환)
•
결론) System Call 하면 Kernel로 들어가서 운영체제가 수행됨
1.
Kernel로 들어가기 위해 Trap instruction 수행.
2.
CPU 모드가 User mode에서 Kernel mode로 전환됨.
→ kernel로 trap이 일어남 (Trap into the kernel)
3.
운영체제 코드가 기다리고 있는 특정 주소로 점프해 운영체제 코드 스타트함.
4.
운영체제 수행이 일어남 (OS invoke)
5.
서비스 완료되면 컨트롤 제어가 운영체제에서 유저 프로그램으로 다시 돌아감.
→ 보통 system call했던 다음 명령어쪽으로 제어가 돌아감.
•
Kernel로 trap 일어나는 두 가지 방법
1) 의도적으로 Trap instruction 수행해서 kernel로 trap 일어나기도 하지만,
2) 예외적인 상황으로 인해 하드웨어적으로 trap 일어날 때도 있음.
•
ex) 어떤 수를 0으로 나누려 하면 하드웨어적으로 예외가 발생하면서 kernel로 trap 일어남
4. Procedure library로 system call 하는 방법
•
예시) C프로그램에서 Systeml Call 하는 과정
1.
내 C프로그램(유저 프로그램)으로부터 system call 할 수 있게 하기 위해 Procedure library가 제공됨.
2.
나는 library에 있는 procedure를 call함 (library procedure call).
3.
그러면 procedure 안의 어셈블리 명령어가 실제로 machine dependent한 처리를 해주어 procedure가 실제 System call의 동작들을 하게 됨
•
System call 발생시키는 실질적인 단계는 machine dependent하기 때문에 보통 어셈블리 코드로 작성됨.
◦
library의 procedure 안에 어셈블리 코드로 작성된 부분이 있음.
◦
그 어셈블리어 명령어 중 trap instruction도 들어 있음.
◦
우리는 어셈블리 코드로 작성된 System call을 일으키는 부분을 call해주는(수행하는) library procedure를 call하게 되는 것임.
◦
어셈블리 코드가 수행되면서 실질적인 System call이 일어남.
•
정리) System Call 하는 과정
1.
어떤 프로세스가 user 모드에서 유저 프로그램을 실행하다 파일 리드 같은 시스템 서비스를 필요로 하게 되면 이 프로세스는 제어권을 운영체제로 넘기기 위해 trap instruction이나 system call instruction을 수행함.
2.
CPU 모드가 kernel 모드로 바뀌고 제어권이 운영체제에게 넘어감.
3.
운영체제가 Systeml call을 한 프로세스(calling process)가 무엇을 원하는지 인자들을 보고 확인하고 시스템콜을 처리해줌.
4.
처리 끝나면 유저 프로그램에서 system call을 했던 다음 명령어로 제어를 넘겨줌.
•
system call vs. procedure call(==function call) 차이점
◦
procedure call은 계속 user 모드에서 수행됨.
◦
system call은 하게 되면 user 모드에서 kernel 모드로 바뀌어 운영체제가 실행됨. 운영체제 서비스 다 끝나면 유저 프로그램으로 제어가 돌아가게 되고 모드도 다시 kernel 모드에서 user 모드로 돌아감.
5. System Call의 구체적 예시(System Call이 수행되는 메커니즘)
•
read system call: 같은 이름의 library procedure(라이브러리 함수) read()를 C프로그램에서 호출하여 부름
◦
C프로그램 → count = read(fd, buffer, nbytes) 코드 실행의 결과
▪
인자
•
fd: file
•
buffer : buffer에대한 포인터
•
nbytes : 읽을 bytes 수
•
count: read의 return값으로 실제적으로 읽혀진 byte 수
메모리 전체 그림
▪
과정 (전체적인 흐름만 알고 있으면 됨)
1~3. Read system call을 실제로 하는 read library procedure(라이브러리 함수)를 부르기 위한 준비로 인자들을 스택에 푸쉬해둠
4.
read procedure를 call함. read procedure가 있는 주소로 점프함.
•
read procedure로 제어 넘어감.
•
read procedure에는 실질적으로 read system call을 하는 코드가 어셈블리어로 작성되어 기계어로 컴파일 되어 들어 있음.
5.
read procedure가 read system call의 system call number를 레지스터에 넣어둠
•
system call이 운영체제에 여러 개 있기 때문에 system call마다 붙여진 고유 번호 있음. 여기선 고유 번호가 간단히 code라고 표현됨.
6.
kernel로 trap함.
•
cpu모드가 kernel 모드로 바뀌고 , kernel space의 특정 주소로 점프해 실행 시작함. 운영체제 코드의 특정 주소부터 수행 시작됨.
•
점프해간 곳에 dispatch 코드(운영체제 코드 중 하나)가 기다리고 있음.
7~8. Dispatch 코드는 레지스터에 저장된 system call number에 따라 해당 system call을 처리하는 system call handler를 실행함.
•
system call handler: 실제로 kernel 속에서 read system call을 처리하는 루틴
•
system call handler의 주소들을 담은 테이블을 system call number로 인덱스 해서 찾은 주소로 점프하면 해당 system call의 system call handler 실행됨.
9.
system call handler 실행 완료되면 read procedure의 trap instruction 바로 다음 instruction으로 돌아갈 수 있음.(제어권 넘어감)
•
만일 입력 서비스 받으려 했는데 입력 들어오지 않으면 read procedure(호출자)는 블록됨. 이 경우 운영체제는 실행할 수 있는 다른 프로세스 있나 둘러봄. 나중에 입력 들어오면 블록 풀려서 read procedure로 돌아올 수 있음.
10.
read procedure가 return함. read procedure를 호출한 user program으로 돌아감.
11.
스택을 read 호출 이전 상태로 되돌리기 위해 스택 포인터 증가시킴
6. POSIX system call: library procedure standard
•
unix에서는 각 system call에 대응해서 한 개 정도의 library procedure 가 있음.
◦
ex) read system call에 대응하는 read library procedure 가 있음
◦
유닉스 운영체제의 버전들이 여러 개 생기면서 호환성 문제 생김. → 표준화 필요
•
posix standard는 system call에 대응하는 library procedure 100여개에 대한 표준 제시함.
◦
프로시저의 이름, argument type 같은 것들.
◦
system call 자체에 대한 표준이 아닌, System call을 일으키게 해주는 library procedure의 syntax에 대한 표준임. 꼭 System call 아니어도 됨.
◦
posix procedure call이 system call과 일대일 관계는 아님.
•
posix에서 제공하는 procedure call에 의해 제공되는 서비스는 보통 운영체제가 해야 될 대부분의 일을 규정함.
◦
프로세스 생성 및 종료
◦
파일 create, read, delete
◦
dircetory 관리
◦
I/O(입출력)
•
주요 POSIX system call들 (system call해주는 library procedure들)
◦
pid = fork()
▪
fork를 콜한 프로세스(parent process)와 똑같은 클론 프로세스(child process) 만들어줌.
◦
pid = waitpit()
▪
인자로 명세된 프로세스가 종료되기를 기다림
◦
s = execve()
▪
현재 실행 중인 프로세스가 메모리 상에 코드 데이터가 있는데, 이를 덮어써서 갈아엎음.