728x90
https://yummy0102.tistory.com/484
우선 시스템 콜의 이해도를 높이기 위해 유튜브 영상을 통해 공부했다!
🖐 들어가기 전에
- 운영체제는 인터럽트 구동식이다
- 즉, 인터럽트가 발생하여 신호를 보내는 구조이다
- 운영체제처럼 규모가 큰 프로그램이 모두 메모리에 올라간다면 한정된 메모리 공간의 낭비가 심하다
- 따라서 항상 필요한 부분만을 전원이 켜질 때 메모리에 올리고 그렇지 않은 부분은 필요할 때 메모리에 올리게 된다
- 이 때 항상 메모리에 상주하는 운영체제의 부분을 커널이라고 한다
- POSIX : 이식 가능 운영체제 인터페이스
커널 (Kernel)
- 파일 입출력, 프로세스 관리 등과 같이 운영체제의 기능을 담당한다
- 그러나 일반 사용자(사용자 모드)는 커널에 접근할 수 없기 때문에 원칙적으로 파일 입출력, 프로세스 생성 등 커널의 기능을 사용하지 못한다
- 커널의 기능을 사용하기 위해 운영체제에서 시스템 콜(system call)을 제공한다
커널 모드 (Kernel mode)
- 프로세스의 특권 레벨로 프로세서의 모든 명령을 처리하며 시스템의 자원이나 하드웨어를 직접적으로 엑세스하여 컨트롤할 수 있는 모드
- 실제 장치 드라이버나 운영체제 프로그램이 구동하는 모드
사용자 모드 (User mode)
- 일반 응용 프로그램이 동작하는 비특권 모드
- 시스템의 자원이나 하드웨어를 직접적으로 컨트롤할 수 없으며, 이를 하기 위해서는 System call (시스템 콜)을 사용해야 한다
시스템 콜 (System Call)
- 사용자와 커널 사이의 통로
- 운영체제의 커널이 제공하는 서비스에 대해 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스
- 시스템 콜은 위와 같은 커널 영역의 기능을 사용자 모드(User mode)가 사용 가능하게 한다
- 시스템 콜은 커널과 사용자 사이의 인터페이스 역할을 하는 것으로 쉘(Shell)에서 명령어나 서브 루틴 형식으로 운영체제의 기능을 호출할 수 있다
- 즉, 사용자가 직접 커널에 접근을 할 수 없기 때문에 시스템 콜을 활용해야 한다
- 보통 시스템 콜을 사용하기보다 해당 시스템 콜을 사용해서 만든 각 언어별 라이브러리(API)를 사용한다
- 이 때 API는 운영체제의 기능을 호출하는 함수이다
- 즉, 사용자 프로세스가 소프트웨어 인터럽트를 통해 커널을 이용하기 위한 서비스를 요청하는 하나의 방법이다
- System call은 내부 인터럽트(소프트웨어 인터럽트, trap)의 한 종류로 볼 수 있다
System Call의 목적
- 우리가 일반적으로 사용하는 프로그램은 '응용 프로그램'이다
- 유저레벨의 프로그램은 유저레벨의 함수들만으로는 많은 기능을 구현하기 힘들다
- 따라서 커널의 도움을 반드시 받아야 한다
- 커널(kernel)에 관련된 것은 커널 모드로 전환한 후에야 해당 작업을 수행할 권한이 생긴다
- 커널 모드를 통한 작업은 반드시 시스템 콜을 통해 수행하도록 되어 있다
- 시스템 콜은 추상화된 하드웨어 인터페이스(커널의 기능)를 유저 프로세스에게 제공한다
- 시스템의 보안과 안전성을 보장한다
- 가상화된 유저 프로세스와 시스템이 소통할 수 있는 유일하고 공통적인 소통 수단이다
- 즉, 커널의 기능을 사용하기 위해 운영체제에서 제공하는 인터페이스이다!
System Call의 이해
- 우리는 표준 라이브러리 함수를 사용한다
- 예를 들어 printf 함수를 사용 시에 우리는 입출력 장치를 이용해야 한다
- 이 때 반드시 OS, 즉 커널의 도움이 필요하다
- 거의 모든 Program들은 user mode에서만 동작할 수 없다
- 결국 OS의 service(kernel mode)가 필요하다
- printf 함수를 사용하면 내부적으로 시스템 콜(write())를 이용해서 kernel에 도움을 받아서 리턴 받은 후 terminal에 출력한다
System Call의 기능
- 사용자 모드에 있는 응용 프로그램이 커널의 기능을 사용할 수 있도록 한다
- 시스템 호출 시 사용자 모드에서 커널 모드로 변경된다
- 커널에서 시스템 호출을 처리하면 커널 모드에서 사용자 모드로 돌아가 작업을 계속 진행한다
System Call 호출 방식
1. 쉘(Shell)
- 운영체제는 쉘을 통해서 사용자 인터페이스를 제공한다
- 즉, 쉘을 사용자가 운영체제 기능과 서비스를 조작할 수 있도록 인터페이스를 제공하는 프로그램이다
- 쉘은 터미널 환경(CLI)와 GUI 환경, 두 종류로 나뉜다
2. API (Application Programming Interface)
- 운영체제는 사용자 뿐만 아니라 응용프로그램을 위해서도 인터페이스를 제공한다
- 응용프로그램에서 프로그래밍 언어를 통해 운영체제에 무언가를 요청할 수 있기 때문에 API라는 형태로 응용 프로그램을 위한 인터페이스를 제공해준다
- API는 함수로 제공된다 (ex. C언어의 open() 함수)
- 보통은 종류별로 묶어 라이브러리 형태로 제공한다
- API는 각 언어별 운영체제 기능 호출 인터페이스 함수이다
System Call의 동작
- 운영체제는 제공하는 시스템 콜에 대한 연결고리 역할을 하는 시스템 콜 인터페이스를 제공한다
- 시스템 콜에 할당된 번호에 따라 시스템 콜 인터페이스는 색인되는 테이블을 유지한다
- 시스템 콜 인터페이스는 필요한 시스템 콜을 호출하고, 시스템 콜의 상태와 반환 값을 돌려준다
- 따라서 사용자는 시스템 콜이 어떻게 구현되고 실행 중 무슨 작업을 하는지 알 필요가 없다
System Call의 동작 순서
- 사용자 프로세스가 시스템 콜을 요청하면 커널 모드로 변경된다 (User mode -> Kernel mode)
- 커널은 내부적으로 각각의 시스템 콜을 구분하기 위해 기능별로 고유번호를 할당하고, 번호에 해당하는 제어 루틴을 커널 내부에 정의한다
- 커널은 요청받은 시스템 콜에 대응하는 기능 번호를 확인한다
- 커널은 그 번호에 맞는 서비스 루틴을 호출한다
- 서비스 루틴을 모두 처리하고 나면 커널 모드에서 사용자 모드로 전환된다
System Call의 동작 (Linux)
- 사용자 프로세스 -> 시스템 콜 호출 -> lib.a -> 0x80 인터럽트 발생 -> 커널에서 처리
- user process에서 시스템 콜 호출 시
- C 라이브러리에서 fork 시스템 콜의 고유번호 '2'를 eax 레지스터에 저장한 후 0x80 인터럽트 발생
- 0x80 인터럽트는 소프트웨어 인터럽트인 trap이다
- 인터럽트 발생 시 user mode에서 kernel mode로 전환된다
- 커널은 IDT에서 0x80 주소를 통해 인터럽트가 시스템 콜에 의해 발생된 것을 알게 된다
- IDT(Interrupt Discriptor Table) : trap에 대한 정보를 table로 가지고 있다
- system_call() 함수에는 호출된 시스템 콜 번호와 레지스터들을 스택에 저장하고 올바른 시스템 콜 번호인지 검사 후 sys_call_table에서 시스템 콜 번호에 해당하는 함수를 호출한다
- 함수가 종료되면 user process로 반환된다
System Call의 매개변수
필요한 기능이나 시스템 환경에 따라 시스템 콜이 발생할 때 좀 더 많은 정보가 필요할 수 있다
이러한 정보가 담긴 매개변수를 운영체제에 전달하는 방법은 다음과 같다
- 레지스터를 통한 전송
- 매개변수를 CPU 레지스터 내에 전달한다
- 이 경우에 매개변수의 개수가 CPU 내의 총 레지스터 개수보다 많을 수 있다
- 매개변수가 레지스터로 직접 전달되지만, 레지스터 크기보다 더 많은 매개변수가 존재하므로 좋지 않은 방법이다
- 블록 or 테이블을 통한 전송
- 매개변수를 메모리 내의 블록이나 테이블에 저장하고 해당 메모리의 주소가 레지스터에 전달된다
- 스택을 통한 전송
- 매개변수는 프로그램에 의해 스택(stack)으로 전달(push)될 수 있다
- 매개변수는 프로그램에 의해 스택에 넣어지고 운영체제에 의해 꺼내진다
2, 3번의 경우 전달되는 매개변수의 개수나 길이에 제한이 없기 때문에 몇몇 운영체제에서 선호하는 방식이다
System Call 유형
- 프로세스 제어 (Process Control)
- fork()
- exit()
- wait()
- 끝내기(end), 중지(abort)
- 적재(load), 실행(execute)
- 프로세스 생성(create process)
- 프로세스 속성 획득과 설정(get process attribute and set process attribute)
- 시간 대기(wait time)
- 사건 대기(wait event)
- 사건을 알림(signal event)
- 메모리 할당 및 해제 : malloc, free
- 파일 조작 (File Manipulation)
- open()
- read()
- write()
- close()
- 파일 생성(create file), 파일 삭제(delete file)
- 열기(open), 닫기(close)
- 읽기(read), 쓰기(write), 위치 변경(reposition)
- 파일 속성 획득 및 설정(get file attribute and set file attribute)
- 장치 관리 (Device Management)
- ioctl()
- read()
- write()
- 장치를 요구(request devices), 장치를 방출release device)
- 읽기, 쓰기, 위치 변경
- 장치 속성 획득, 장치 속성 설정
- 장치의 논리적 부착(attach) 또는 분리(detach)
- 정보 유지 (Information Maintenace)
- getpid()
- alarm()
- sleep()
- 시간과 날짜의 설정과 획득(time)
- 시스템 데이터의 설정과 획득(date)
- 프로세스 파일, 장치 속성의 획득 및 설정
- 통신 (Communication)
- pipe()
- shm_open()
- mmap()
- 통신 연결의 생성, 제거
- 메시지의 송신, 수신
- 상태 정보 전달
- 원격 장치의 부착 및 분리
- 보호 (Pretection)
- chmod()
- umask()
- chown()
- 권한(Permission) 설정
💡 정리
- 운영체제는 사용자 인터페이스를 제공하기 위해 쉘 프로그램을 제공한다
- 운영체제는 응용 프로그램이 운영체제 기능을 요청할 수 있도록 시스템 콜을 제공한다
- 보통 시스템 콜을 직접 사용하기보다는 해당 시스템 콜을 사용해서 만든 각 언어별 라이브러리 API를 사용한다
- API는 각 언어별 운영체제 기능 호출 인터페이스 함수이며, 시스템 콜은 운영체제 기능을 호출하는 함수이다
참고)
https://luckyyowu.tistory.com/133
https://choiyeonho903.tistory.com/58
https://luckyyowu.tistory.com/133
https://limjunho.github.io/2021/05/11/SystemCall.html
728x90
'야미스터디 > OS' 카테고리의 다른 글
[OS] 커널 (Kernel) 📌 (0) | 2022.08.26 |
---|---|
[OS] 인터럽트와 시스템 콜 (0) | 2022.08.24 |
[OS] Critical Section 📌 (0) | 2022.08.05 |
[OS] 세마포어와 뮤텍스 📌 (0) | 2022.07.24 |
[OS] 교착 상태 (Dead Lock) 📌 (0) | 2022.07.21 |
댓글