🐝 시스템 콜
System calls: 시스템 콜, 시스템 호출
운영체제는 커널 모드와 사용자 모드로 나뉘어 구동
- CPU는 사용자 애플리케이션이 시스템을 손상시키는 것을 방지하기 위해 2가지 모드 제공
- CPU에 있는 Mode bit로 모드를 구분하여 0은 커널모드, 1은 사용자모드로 나뉨
- 커널 모드: 파일 읽기/쓰기/출력
- 커널: 운영체제 부분 중 메모리에 상주하는 것 > 운영체제의 핵심적인 부분
- 사용자 모드: 사용자 애플리케이션 코드 실행, 사용자가 접근할 수 있는 영역에 제한 있음, 하드웨어 접근 안됨 (시스템 콜 필요)
시스템 콜: 운영체제의 커널이 제공하는 서비스에 대해 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스 (사용자가 커널 자원을 사용할 수 있도록 만들어 놓은 함수)
- 사용자 프로그램이 특권 명령의 수행이 필요할 때 운영체제에게 특권 명령의 대행 요청
- 프로세스가 하드웨어에 직접 접근해서 필요한 기능을 사용
- 주로 여러 종류의 기능으로 나뉘어짐
- 각 시스템 콜에 번호 할당 > 시스템 콜 인터페이스는 번호에 따라 인덱스 되는 테이블 유지
- 운영체제는 커널 영역에서 해당 인덱스가 가리키는 주소에 저장되어있는 루틴 수행
- 작업 완료 후 CPU에게 인터럽트 발생시켜 수행 완료 알림
🐝 시스템 콜 예시
open()
> open("data.txt".O_RDONLY);
- eax 레지스터에 시스템 콜 번호를 넣고
- EAX, Extended Accumulator Register:
- 산술 등 논리 연산 수행
- 함수의 반환값이 이 레지스터에 저장
- ebx 레지스터에는 시스템 콜에 해당 인자값을 넣고
- EBX, Extended Base Register: pointer to data in the DS segment
- 예시에서는
("data.txt".O_RDONLY")
가 인자임
- 소프트웨어(내부) 인터럽트 명령을 호출하면서 0x80 값을 넘겨줌
int 0x80
명령어는 마지막에 항상 들어감
- CPU가 제공하는 OP code 중 int와 인터럽트의 번호를 넣어주는 것
- 0x80이 시스템 콜의 번호 의미
- 인터럽트는 내부의 코드와 별개로 외부에서 실행되지만 해당 명령어를 통해 내부 코드 안에서 강제 실행 가능
시스템 콜 작동 과정
응용프로그램에서 시스템 콜을 호출하면 0x80 인터럽트 발생
0x80 값을 넘겨주면 무엇이 일어나는가?
- 해당 인터럽트를 받으면 CPU는 사용자 모드를 커널 모드로 변경함 > 시스템 자원 접근 가능
- IDT (Interrupt Descriptor Table)에 접근
- IDT는 인터럽트의 번호와 해당 번호에 맞는 코드가 들어있는 주소 포함
- 0x80값을 넘겼기 때문에 IDT에서 해당 주소 (함수)를 찾아 실행
- 이 함수에
system_call()
함수가 저장되어 있음
system_call()
함수 실행 > eax로부터 받은 시스템 콜 번호에 해당 함수를 호출함 (ebx로 받은 인자값 같이 넘겨줌)
- 커널 모드에서 호출한 함수 실행 > 실행 완료 후 사용자 모드로 변경 > 해당 프로세스의 다음 코드 실행
시스템 콜이 발생했을 때 추가적인 정보가 필요하면 이 정보가 담긴 매개변수를 OS에 전달한다
매개 변수 전달 방법:
- 매개변수를 CPU 레지스터에 전달
- 전달해야 하는 매개변수보다 레지스터의 수가 작을 수 있음 > 적합X
- 매개변수를 연속적(블록)/불연속적(테이블)으로 메모리에 저장해 해당 메모리의 주소를 레지스터에 전달
- 스택에 매개변수를 담음
🐝 시스템 콜 유형
- 프로세스 컨트롤 (Process control)
- 끝내기 (end), 중지 (abort)
- 적재 (load), 실행 (execute)
- 프로세스 생성 (create process)
- 프로세스 속성 획득과 설정 (get process attribute, set process attribute)
- 시간 대기 (wait time, wait event)
- 사건 알림 (signal event)
- 메모리 할당 및 해제 (malloc, free)
- 파일 조작 (File manipulation)
- 파일 생성 (create file), 파일 삭제 (delete file)
- 열기 (open), 닫기 (close)
- 읽기 (read), 쓰기 (write), 위치 변경 (reposition)
- 파일 속성 획득 및 설정 (get/set file attribute)
- 장치 관리 (Device management)
- 장치 요구 (request devices), 장치 방출 (release device)
- 읽기, 쓰기, 위치 변경
- 장치 속성 획득, 장치 속성 설정
- 장치의 논리적 부착 (attach) 또는 분리 (detach)
- 정보 유지 (Information maintenance)
- 시간과 날짜의 설정과 획득 (time)
- 시스템 데이터의 설정과 획득 (date)
- 프로세스 파일, 장치 속성의 획득 및 설정
- 통신 (Communication)
- 통신 연결의 생성, 제거
- 메시지의 송신, 수신
- 상태 정보 전달
- 원격 장치의 부착 및 분리
- 보안
- Permission 획득
- Permission 설정
🐝 운영체제의 Dual Mode
목적: 운영체제 보호
- 사용자와 운영체제는 시스템 자원을 공유함
- 사용자에 제한을 두지 않으면 사용자가 메모리 내의 주요 운영체제 자원을 망가뜨릴 위험
- 운영체제의 원활한 작동/기능을 위해서는 사용자의 시스템 자원 접근을 제한하는 보호 장치가 필수적임
Dual mode operation: 사용자가 접근할 수 없는 모드 (kernel mode)와 사용자가 접근할 수 있는 모드 (user mode)로 나뉨
- 커널 모드: supervisor mode, system mode, privileged mode
- 사용자 모드에서는 불법적인 명령 못함
구조
- 사용자가 사용하는 응용 프로그램은 사용자 모드에서 작동함
- 해당 프로그램이 운영체제에게 시스템 사용을 요청하면 커널모드로 바뀜 > 요청된 시스템 실행 후 다시 사용자 모드로 전환
- Mode bit, 모드 비트: 커널/사용자 모드를 구분짓기 위해 모드비트라고 하는 비트가 컴퓨터의 하드웨어에 추가됨
- 커널모드(0) 또는 사용자 모드(1)를 나타냄
- 모드 비트를 사용해 운영체제를 위해 실행되는 작업고 사용자를 위해 실행되는 작업 구분
🐝 시스템 콜 구분 방법
커널은 내부적으로 시스템 콜 구분을 위해 기능별로 고유 번호 할당 & 그 번호에 해당하는 제어루틴을 커널 내부에 정의
-
시스템 콜이 발생하면 해당 기능번호 확인
-
커널은 인터럽트를 발생시킨 명령을 검사하여 어떤 시스템 호출이 발생했는지 결정
-
이 때 전달된 인자가 사용자 프로그램이 요청하는 서비스 유형을 표시함
-
커널은 인자가 정확하고 합법적인지 검증하고 요청 실행
참고: