[OS] System Call 이란?

이신영·2024년 8월 12일
0

OS

목록 보기
1/1
post-thumbnail

시스템콜은 왜 생긴걸까?

운영 체제는 하드웨어 자원을 효율적이고 안전하게 관리하기 위해 설계되어 있다. 하지만 사용자의 프로그램이 직접 하드웨어에 접근할 경우, 시스템의 보안과 안정성에 위험이 발생할 수 있다.

예를 들어, 한 프로그램이 메모리의 중요한 부분을 임의로 변경하거나, 다른 프로그램의 자원을 무단으로 사용할 수 있다면, 시스템 전체가 불안정해질 수 있다.

이 문제를 해결하기 위해 운영 체제는 사용자의 프로그램이 하드웨어 자원에 직접 접근하지 않고, 운영 체제의 커널을 통해 간접적으로 접근할 수 있는 방법을 제공하는데, 이것이 바로 시스템 콜이다!

시스템 콜을 통해 사용자 프로그램은 커널이 제공하는 안정적이고 보안이 강화된 인터페이스를 통해서만 시스템 자원에 접근할 수 있게 된다.

사용자 프로그램 : 컴퓨터 시스템 내에서 제어 프로그램의 관할 아래 실행되는 프로그램 일반적으로 사용자 모드에서 실행된다.


시스템콜의 역할

시스템 콜은 사용자의 프로그램과 운영 체제의 커널 사이에 존재하는 인터페이스다. 사용자 프로그램이 요청하는 작업을 커널이 수행하도록 지시하여 프로그램이 시스템 자원을 사용할 수 있게 된다. 시스템 콜은 애플리케이션이 하드웨어와 상호작용할 수 있는 유일한 통로이다.

보안과 안정성

시스템 콜을 사용하면, 운영 체제가 사용자의 요청을 안전하게 처리하고 필요한 권한이 없을 경우 요청을 거부할 수 있다. 또한, 커널 모드에서만 접근할 수 있는 자원(예: 메모리, CPU, 디스크)에 대한 직접적인 접근을 제한함으로써 시스템의 안정성을 보장할 수 있다.

추상화와 편의성

시스템 콜은 하드웨어에 대한 복잡한 세부 사항을 추상화하여, 프로그램 개발자가 하드웨어를 직접 다루지 않아도 되도록 해준다. 예를 들어, 파일 시스템을 사용하는 경우, 개발자는 open, read, write 등의 시스템 콜을 통해 파일을 읽고 쓸 수 있으며, 실제 디스크에 어떤 식으로 데이터가 저장되는지에 대해 알 필요가 없다.


시스템콜의 종류

  1. 파일 조작: 파일을 생성, 삭제, 읽기, 쓰기 등을 할 때 사용된다.
    예시) open, read, write, close

알쓸신잡) Unix나 Linux는 특히 디렉터리나 다른 프로그램도 파일로 처리한다. 철학 자체가 "Everything is a File"이기 때문이다. 이는 다양한 자원에 일관된 방식으로 접근할 수 있게 하여 시스템의 단순성과 일관성을 유지해준다.

  1. 프로세스 제어: 프로세스 관리와 관련된 작업을 수행한다.
    예시) fork, exec, exit

fork : 새로운 프로세스를 생성
exec : 새로운 프로그램으로 현재 프로세스를 교체

  1. 하드웨어와 디바이스 간 통신: 하드웨어 디바이스와의 통신을 처리한다.
    예시) ioctl : I/O 디바이스를 제어하거나 데이터를 전송

ioctl은 매우 유연한 시스템 콜로, 다양한 디바이스와의 통신을 가능하게 한다. 예를 들어, 네트워크 인터페이스 카드의 설정을 변경하거나, 터미널의 속성을 조정할 수 있다.

  1. 프로세스 간 통신: 프로세스 간 통신을 처리한다.
    예시) getpid, pipe, signal

프로세스 간 통신(IPC)은 멀티프로세스 환경에서 필수적이다. pipe를 사용하면 한 프로세스에서 다른 프로세스로 데이터를 전달할 수 있으며, signal을 통해 특정 이벤트를 알릴 수 있다.


시스템콜의 작동 방식

시스템 콜은 사용자의 프로그램에서 호출되면, CPU에 의해 운영 체제의 커널 모드로 전환되어 커널이 해당 요청을 처리한다. 시스템 콜이 완료되면, 결과가 사용자 프로그램에 반환되고, 다시 사용자 모드로 돌아가게 된다.

  1. 시스템 콜 호출: 사용자 프로그램이 시스템 콜을 호출하면, 해당 시스템 콜 번호가 CPU 레지스터에 저장되고, CPU는 사용자 모드에서 커널 모드로 전환된다.

  2. 시스템 콜 번호 확인: 커널은 레지스터에 저장된 시스템 콜 번호를 확인한다.

  3. 시스템 콜 테이블 참조: 커널은 시스템 콜 테이블에서 해당 번호에 대응하는 핸들러 함수를 찾는다.

  4. 핸들러 실행: 해당 핸들러 함수가 실행되어, 시스템 콜이 요청한 작업이 수행된다.

  5. 결과 반환: 작업이 완료되면 커널은 결과를 사용자 모드로 반환하고, CPU는 다시 사용자 모드로 전환된다.

CPU가 사용자 모드에서 커널 모드로 전환될 때, 이 전환 과정에서 문맥교환(Context-Switching)이 일어난다.

왜 유저모드와 커널모드를 구분해야할까?

주로 보안이나 안정성을 보장해야하기 때문이고 관리가 편하다는 생각이다.

  • 보안: 사용자가 실행하는 프로그램이 시스템의 중요한 자원이나 데이터에 직접 접근하지 못하도록 함
  • 안정성: 커널 모드에서만 중요한 시스템 자원에 접근할 수 있도록 하여, 시스템 전체가 안정적으로 운영될 수 있게 함

그럼 시스템 콜 간에 구분은 어떻게 이루어질까?

위의 동작과정에서 시스템콜 번호로 인해 구분된다.

1. 시스템 콜 번호 (System Call Number)

각 시스템 콜은 고유한 시스템 콜 번호를 가지고 있다. 시스템 콜을 호출할 때 CPU 레지스터(주로 eax, rax 등의 레지스터)에 저장되고, 커널은 이 번호를 통해 어떤 시스템 콜이 호출되었는지를 식별할 수 있다.

예시: 리눅스에서 syscall을 사용하여 시스템 콜을 호출할 때, write 시스템 콜은 1번, read 시스템 콜은 0번 등으로 미리 정의되어 있다.

2. 시스템 콜 테이블 (System Call Table)

운영체제 커널은 시스템 콜을 효율적으로 처리하기 위해 시스템 콜 테이블을 사용한다. 이 테이블은 시스템 콜 번호와 해당 시스템 콜을 처리하는 함수 포인터 간의 매핑을 유지한다.

그림의 예시로는 사용자 프로그램에서 fork() 함수를 호출하면, 이 함수는 시스템 콜 번호 2를 CPU의 eax 레지스터에 로드한 후 int 0x80 명령을 통해 커널 모드로 전환되며, 커널은 sys_call_table에서 해당 번호를 참조하여 sys_fork() 함수를 호출해 새로운 프로세스를 생성한 뒤 결과를 반환하게된다.

profile
후회하지 않는 사람이 되자 🔥

0개의 댓글