SystemCall
- system call은 커널에게 I/O 작업을 요청하는 것이다.
- 하드웨어의 mode bit 를 사용하여 커널모드와 유저모드로 나눈다.
- cpu의 mode bit 가 0이면 kernel mode 이며, cpu는 어떤 메모리의 영역이든 접근할 수 있다.
- mode bit이 1이면 user mode로 cpu는 파일에 영향을 주는 명령은 사용이 불가능하다.
특권 명령과 일반 명령이라도 부른다.
- mode bit을 검사하는 과정을 알아보자.
- 우선 PC레지스터로 명령어의 주소를 보낸다.
- 이때 MMU를 통과한다.
- 요청된 명령어의 주소가 로컬 범위 밖이라면 cpu를 빼앗긴다.
- Decode 단계에서 명령어를 파악 및 검사한다.
- 만약 권한을 넘어서면 빼앗긴다.
- 우선 PC레지스터로 명령어의 주소를 보낸다.
사용자 입장 / Source code
컴파일
- 우리가 코드를 짤 때는 I/O 코드를 짠다.
- 사실 컴파일 과정에서 컴파일러가 chmodk 명령을 집어 넣는다.
- 그리고 I/O statements는 바이너리( a.out )에서 보이지 않고 커널에서 존재하게 된다.
change mode (protection) kernel
실행
- chmodk는 privilieged 명령이다.
- 즉 user_mode에서 실행이 불가능하다.
- 이때 cpu 뺏기며 HW trap이 걸리게 된다.
- Cpu state vector를 저장해둔다.
- trap handler가 작동하며 kernel mode로 바뀐다.
- trap handler는 trap을 일으킨 정보를 통해 kernel 함수를 실행한다.
- 이후 cpu 모드를 user_mode로 돌리고, 저장된 state vector 복구한다.
- interrupted 된 address로 복귀한다,
- 모든 프로그램은 두 개의 스택이 필요하다.
- 커널용, 유저용
- 함수 호출 시 사용된다.
System call 흐름 정리
System call 자세히…
system call 흐름
- printf를 하면 라이브러리로 달려간다.
- 라이브러리에서 system call wrapper 함수를 부름 ( write(2) )
- write( ) 에서 system call number를 넘김, 그리고 trap을 발생시킴
- system call number는 정해져 있다. 컴파일러마다 다르다.
여기까지 컴파일러 / 이후 OS
- sys_call()에서 number를 이용해 system call table에서 sys_write( )를 찾아 실행함
정보는 어떻게 교환하는가
- kernel 모드로 변경되면 이때 발생하는 I/O 정보는 어떻게 user 에게 전달 될까?
- kernel 은 user와 달리 모든 메모리에 접근 할 수 있다.
- 즉 kernel은 user의 정보를 얻거나 전달할 수 있다.
- 다음과 같은 함수들을 통해 구현된다.