시스템 콜
System call
왜 필요할까?
가장 단순하게 어떤 프로세스든지 I/O나 다른 장치에 관한 여러 작업을 원하는 대로 두면 어떨끼?
모든 프로그램은 디스크 전체를 덮어쓰거나 파일에 접근할 수 있게 된다. 파일 권한 확인하는 코드도 높은 가능성으로 무용지물이 되어버릴 가능성이 크다. 그래서 우리는 제한된 모드인 User mode와 kernal 모드로 프로세서의 모드를 나눠서 사용한다!
User mode
User mode는 실행되느 코드가 할 수 있는 것이 제한된 모드이다. 예를 들어, I/O 요청을 할 수 없다. 만약 User mode에 있는데 I/O 요청을 날리면 프로세서가 예외를 발생시키고 OS가 프로세스를 종료시킬 가능성이 높다.
Kernal mode
커널 모드는 OS(Kernal)이 실행되는 모드이다. 여기서 제한된 명령을 실행시킬 수 있다.
System Call
그럼 애플리케이션 단에서 우리는 디스크에서 파일을 읽는 것과 같은 제한된 명령을 어떻게 사용할 수 있을까?
System Call이다!
System Call은 커널이 파일 시스템에 접근하거나, 프로세스를 생성 및 삭제하거나, 다른 프로세스와 통신하거나, 더 많은 메모리를 할당하는 등의 중요한 기능은 사용자 프로그램에 노출한다.
이 System Call 사용해서 사용자 프로그램도 제약을 우회하여 하드웨어에 접근하거나 중요한 시스템 리소스를 관리하는 작업을 수행할 수 있다.
이처럼 System Call을 통해 커널이 사용자 프로그램에 안전하게 시스템 리소스를 사용할 수 있게 된다.
System Call이 실행되려면?
System Call을 실행하려면 Trap 명령어를 실행해야 한다. Trap 명령어는 동시에 커널로 점프하고 권한 수준을 커널 모드로 높인다. 커널로 들어오면, 시스템은 이제 필요한 특권 작업을 수행할 수 있으며(허용된 경우), 호출 프로세스를 위해 필요한 작업을 수행한다. 작업이 끝나면 OS는 특수한 리턴 프롬 트랩(return-from-trap) 명령어를 호출하여 호출한 사용자 프로그램으로 돌아가면서 동시에 권한 수준을 사용자 모드로 낮춘다.
뭘 실행시키지?
일단 Trap이 발생하여 커널 모드까지 왔다. 근데 여기서 뭘 해야 할지 어떻게 알까?
해결책 1. 점프할 주소를 지정해준다. (Bad)
프로시저를 호출할 때처럼 점프할 주소를 지정할 수는 없다!
프로그램 내에서 특정 함수나 코드 블록을 실행하기 위해 해당 코드의 시작 주소로 점프할 수 있게 되면 프로그램이 커널 내부의 임의의 위치로 점프할 수 있게 되어 매우 큰 문제가 될 수 있다.
해결책 2. 안전한 주소들을 모아둔 Trap Table을 참조한다 (Good)
대신, System Call이 발생하면 Trap Table이 사용된다. 이것은 OS가 부팅될 때 설정하는 테이블이다.
OS는 부팅될 때 커널 모드로 동작하는데 이 테이블에 각 인터럽트와 예외 상황, 그리고 System Call에 대응하는 핸들러(특정 코드의 시작 주소)를 정의해둔다.
System Call을 할 때 프로세서는 사용자 프로그램이 지정한 주소로 점프하는 방식이 아니라 트랩 테이블에 정의된 안전한 위치로 점프하여 커널 코드가 실행되도록 한다.
호출 과정
- [준비 단계] 부팅 시에 Trap Table 설정
- System Call 명령어 실행
- 커널 모드 전환 및 핸들러 실행
- 시스템 호출 종료 후 사용자 모드 복귀
면접 질문 예상해보기
System Call이란 무엇이며, 왜 필요한가요?
System Call은 사용자 프로그램이 운영체제의 커널 기능에 접근할 수 있도록 하는 인터페이스입니다. 일반적으로 사용자 프로그램은 사용자 모드에서 실행되는데 이 모드에서는 파일 시스템 접근, 네트워크 통신, 프로세스 관리 등의 작업을 직접적으로 수행할 수 없습니다. 이때 우리는 시스템 호출로 이러한 작업을 요청할 수 있습니다.
System Call이 필요한 이유는
첫째로 보안을 유지하기 위해서입니다. 사용자 모드에서는 직접 하드웨어를 조작할 수 없도록 하고 시스템의 안정성과 보안을 보호합니다.
둘째로 운영체제의 자원을 효율적으로 관리하기 위해서입니다. System Call을 통해 운영체제가 자원에 대한 접근을 제어하고 여러 프로그램이 동일한 자원을 충돌 없이 사용할 수 있도록 해줍니다.