📝 이중 동작 모드(OS dual-mode-operation)
이미지 출처
이중 동작 모드란 다중 프로그래밍 환경에서 운영체제를 보호하는 보안 기법이다. 응용 프로그램이 운영체제의 자원(메모리, CPU, 하드디스크 등)에 직접 접근하는 것을 방지하기 위해 유저 모드(User mode), 커널 모드(Kernel mode) 두 가지 모드로 분리되어있다. CPU는 두 가지 모드에서 명령어를 실행할 수 있는데 요청에 따라 모드를 전환한다.
유저 모드(User mode)와 커널 모드(Kernel mode)
- 유저 모드
- 일반적인 응용 프로그램은 유저 모드에서 실행된다.
- 프로세스는 자체 가상 주소 공간을 얻는다. (분리된 공간에서 작동하므로 다른 프로세스에 영향을 끼치지 않는다.)
- 시스템 데이터에 제한적으로 접근할 수 있으며, 하드웨어에 직접 접근하는 명령어는 실행할 수 없다.
- 시스템 콜*을 통해 커널 모드로 전환할 수 있다.
- 커널 모드
- 모든 시스템 자원에 접근할 수 있다.
- 프로세스는 단일 가상 주소 공간을 얻는다. (문제가 발생하면 전체 운영체제에 영향을 끼친다.)
시스템 콜(System call)
이미지 출처 - Operating System Concepts 10th
시스템 콜이란 응용 프로그램이 운영체제 서비스를 요청하기 위한 인터페이스로 프로세스 제어, 파일 조작, 장치 관리, 정보 유지, 통신, 보호 등 6가지로 분류된다.
- 프로세스 제어 (Process Control)
- 종료(exit), 중지 (abort)
- 적재(load), 실행(execute)
- 프로세스 생성(create process)
- 프로세스 속성 획득과 설정(get process attribute and set process attribute)
- 시간 대기 (wait time)
- 사건 대기 (wait event)
- 사건을 알림 (signal event)
- 메모리 할당 및 해제 (malloc, free)
- 파일 조작 (File Manipulation)
- 파일 생성 / 삭제 (create, delete)
- 열기 / 닫기 / 읽기 / 쓰기 (open, close, read, wirte)
- 위치 변경 (reposition)
- 파일 속성 획득 및 설정 (get file attribute, set file attribute)
- 장치 관리 (Device Manipulation)
- 하드웨어의 제어와 상태 정보를 얻음 (ioctl)
- 장치를 요구(request device), 장치를 방출 (relese device)
- 읽기 (read), 쓰기(write), 위치 변경
- 장치 속성 획득 및 설정
- 장치의 논리적 부착 및 분리 (attach, detach)
- 정보 유지 (Information Maintenance)
- 시간과 날짜의 설정과 획득 (time)
- 시스템 데이터의 설정과 획득 (date)
- 프로세스 파일, 장치 속성의 획득 및 설정
- 통신 (Communication)
- 통신 연결의 생성, 제거
- 메시지의 송신, 수신
- 상태 정보 전달
- 원격 장치의 부착 및 분리
- 보호 (Protection)
- 파일 권한 변경 (chmod)
- 파일 소유자 변경 (chown)
하드웨어 인터럽트와 소프트웨어 인터럽트
시스템 콜은 인터럽트의 일종으로 인터럽트와 유사한 방식으로 처리된다. 인터럽트란 CPU가 프로그램을 실행 중일 때 입출력 장치에 의한 예외상황이 발생한 경우, 프로세스를 중단하고 마이크로 프로세스를 통해 처리하는 것을 의미한다. 크게 하드웨어 인터럽트와 소프트웨어 인터럽트로 나뉜다.
- 하드웨어 인터럽트
- 전원 이상(Power fail interrupt)
- 기계 고장(Machine Check interrupt)
- 키보드/마우스/프린트/저장장치 등 입출력(I/O interrupt)
- 외부 신호(External interrupt)
- 소프트웨어 인터럽트
시스템 콜의 동작 방식
예를 들어 어떤 응용 프로그램이 하드 디스크 데이터를 읽으려고 하는 상황을 가정해보자.
-
응용 프로그램
응용 프로그램 실행 도중 하드 디스크의 데이터를 읽어야하는 상황이 발생한다.
-
시스템 콜 호출 요청
응용 프로그램이 커널의 서비스를 사용하기 위해 해당 기능을 나타내는 시스템 콜을 호출한다. 이를 위해 레지스터에 시스템 콜의 고유번호를 저장하고 필요한 인자값을 설정한다.
-
인터럽트 발생
응용 프로그램이 시스템 콜을 호출하면, 해당 시스템 콜의 고유번호를 포함한 정보를 갖고 0x80 인터럽트를 발생시킨다. CPU는 유저 모드에서 커널 모드로 전환된다.
-
기존 프로세스 컨텍스트 저장
현재 실행중인 프로세스 상태, 레지스터 값, 메모리 주소 등을 해당 프로세스의 PCB(Process Control Block)에 저장한다. 시스템 콜 처리 이후에 복구하기 위한 단계다.
-
인터럽트 서비스 루틴 실행
커널은 인터럽트 디스크립터 테이블(IDT)을 통해 해당 시스템 콜의 인터럽트 서비스 루틴(ISR)의 주소를 찾아 필요한 작업을 수행한다.
- 사용자 모드 복귀
시스템 콜이 성공적으로 처리되면 커널은 IRET(Interrupt Return) 명령어를 사용하여 커널 모드에서 사용자 모드로 전환하고 응용 프로그램이 시스템 콜을 호출한 위치로 돌아간다.
🔗 참고 링크
링크1
링크2