미닉스 3

**미닉스 3**(Minix 3)는 작고 유닉스 계열의 운영체제이다. BSD-3-Clause 라이선스로 배포되며 이전 버전인 미닉스 1, 2의 후속 프로젝트이다.

이 프로젝트의 주요 목표는 사용자 개입 없이 실시간으로 오류를 감지하고 복구하여 시스템이 결함 허용적이 되도록 하는 것이다. 이 시스템의 주요 용도는 임베디드 시스템과 교육으로 구상되었다.

, 미닉스 3는 IA-32 및 ARM 아키텍처 프로세서를 지원한다. 또한 Bochs, VM웨어 워크스테이션, 마이크로소프트 버추얼 PC, 오라클 버추얼박스 및 QEMU와 같은 에뮬레이터나 가상 머신에서도 실행할 수 있다. 파워PC 아키텍처로의 포팅이 개발 중이다. 배포판은 라이브 CD로 제공되며 라이브 USB 설치를 지원하지 않는다. 프로젝트는 2018년 후반부터 활동이 중단되었고, 최신 릴리스는 2017년 3.4.0 rc6이지만, 미닉스 3 토론 그룹은 여전히 활발하다.

미닉스 3는 스카이레이크 및 카비레이크 프로세서와 함께 사용되는 ME 11 도입을 시작으로 인텔의 플랫폼 컨트롤러 허브에 있는 인텔 관리 엔진(ME) OS에 영감을 주었다고 여겨진다. Minix는 인텔 ME에서 사용되기 때문에 X86/AMD64 프로세서에서 Microsoft Windows, 리눅스, macOS보다 더 많이 설치되어 가장 널리 사용되는 OS였을 수 있다는 논쟁이 있었다.

## 프로젝트 목표
[섬네일|[모놀리식 커널 및 마이크로커널 기반 운영 체제의 구조]]

타넨바움에 따르면 드라이버는 일반 프로그램보다 약 3~7배 더 많은 버그를 가지고 있으며 전체 시스템을 다운시킬 수 있는 모놀리식 커널 기반 시스템의 특성을 반영하여 미닉스 3는 "안정적이고 자가 복구하며 다중 서버를 지원하는 유닉스 클론" 운영 체제를 만드는 것을 목표로 한다.

이를 달성하기 위해 커널에서 실행되는 코드는 최소화되어야 하며, 파일 서버, 프로세스 서버 및 각 장치 드라이버는 별도의 사용자 모드 프로세스로 실행된다. 각 드라이버는 시스템의 일부인 환생 서버(reincarnation server)에 의해 신중하게 모니터링된다. 드라이버가 이 서버의 핑에 응답하지 않으면 드라이버는 종료되고 새 드라이버 복사본으로 교체된다.

모놀리식 시스템에서는 드라이버의 버그가 전체 커널을 쉽게 충돌시킬 수 있다. 미닉스 3에서는 이러한 일이 발생할 가능성이 훨씬 적다.

## 역사

미닉스 3는 2005년 10월 24일 앤드루 타넨바움이 ACM (Association for Computing Machinery) Symposium Operating Systems Principles 컨퍼런스 기조연설에서 공개적으로 발표했다. 여전히 타넨바움과 우드헐의 교과서 새 버전의 예시로 사용되지만, "리소스가 제한된 임베디드 컴퓨터와 높은 신뢰성이 요구되는 애플리케이션에서 심각한 시스템으로 사용할 수 있도록" 전면적으로 재설계되었다.

2000년부터 Minix가 라이선스된 것과 동일한 BSD-3-Clause 라이선스로 처음 출시되었다. 2005년 후반에 저작권 소유자가 변경되고 네 번째 조항이 추가되었다.

## 신뢰성 정책
미닉스 3의 주요 목표 중 하나는 신뢰성이다. 아래에서는 신뢰성을 향상시키는 더 중요한 원칙 중 일부를 설명한다.

### 커널 크기 줄이기
리눅스 및 FreeBSD와 같은 모놀리식 운영 체제와 Windows와 같은 하이브리드 운영 체제는 수백만 줄의 커널 코드를 가지고 있다. 반면 미닉스 3는 약 6,000줄의 실행 가능한 커널 코드를 가지고 있어, 코드에서 문제를 더 쉽게 찾을 수 있다.

### 버그 격리
모놀리식 커널에서는 장치 드라이버가 커널 내에 상주한다. 따라서 새로운 주변 장치가 설치될 때, 알 수 없고 신뢰할 수 없는 코드가 커널에 삽입된다. 드라이버의 한 줄의 나쁜 코드가 시스템 전체를 다운시킬 수 있다.

대신 미닉스 3에서는 각 장치 드라이버가 별도의 사용자 모드 프로세스이다. 드라이버는 특권 명령을 실행하거나 페이지 테이블을 변경하거나 임의의 입출력(I/O)을 수행하거나 절대 메모리에 쓸 수 없다. 이러한 서비스에는 커널 호출을 해야 하며 커널은 각 호출의 권한을 확인한다.

### 드라이버의 메모리 접근 제한
모놀리식 커널에서 드라이버는 어떤 메모리 워드에도 쓸 수 있으므로 실수로 사용자 프로그램을 손상시킬 수 있다.

미닉스 3에서는 사용자가 예를 들어 파일 시스템에서 데이터를 기대할 때, 누가 어떤 주소에서 접근할 수 있는지 알려주는 디스크립터를 생성한다. 그런 다음 이 디스크립터의 인덱스를 파일 시스템에 전달하고, 파일 시스템은 이를 드라이버에 전달할 수 있다. 파일 시스템 또는 드라이버는 커널에 디스크립터를 통해 쓰도록 요청하여 버퍼 외부의 주소에 쓰는 것을 불가능하게 만든다.

### 잘못된 포인터에서 생존
드라이버 내에서 잘못된 포인터를 역참조하면 드라이버 프로세스가 충돌하지만, 시스템 전체에는 영향을 미치지 않는다. 환생 서버는 충돌한 드라이버를 자동으로 다시 시작한다. 일부 드라이버(예: 디스크 및 네트워크)의 경우 사용자는 복구를 알아차리지 못하지만, 다른 드라이버(예: 오디오 및 프린터)의 경우 알아차릴 수 있다. 모놀리식 커널에서 드라이버의 잘못된 포인터를 역참조하면 일반적으로 시스템 충돌로 이어진다.

### 무한 루프 제어
드라이버가 무한 루프에 빠지면 스케줄러가 점차 우선순위를 낮추어 유휴 상태가 될 때까지 기다린다. 결국 환생 서버는 드라이버가 상태 요청에 응답하지 않는 것을 확인하고, 루프를 도는 드라이버를 종료하고 다시 시작한다. 모놀리식 커널에서는 루프를 도는 드라이버가 시스템을 멈추게 할 수 있다.

### 버퍼 오버플로로 인한 손상 제한
미닉스 3는 내부 통신을 위해 고정 길이 메시지를 사용하며, 이는 특정 버퍼 오버플로 및 버퍼 관리 문제를 제거한다. 또한 많은 익스플로잇은 버퍼를 오버런하여 프로그램이 공격자가 제어하는 메모리(일반적으로 오버런된 버퍼)를 가리키는 덮어씌워진 스택 반환 주소를 사용하여 함수 호출에서 반환하도록 속여 작동한다. 미닉스 3에서는 명령어 및 데이터 공간이 분리되어 (읽기 전용) 명령어 공간의 코드만 실행될 수 있으므로 이 공격이 완화된다. 이를 실행 공간 보호라고 한다. 그러나 합법적으로 실행 가능한 메모리를 악의적인 방식으로 실행하는 공격(return-to-libc, 반환 지향형 프로그래밍)은 이 완화로 방지되지 않는다.

### 커널 함수 접근 제한
장치 드라이버는 커널 호출을 통해 커널 서비스(예: 사용자 주소 공간으로 데이터 복사)를 얻는다. 미닉스 3 커널은 각 드라이버가 호출할 수 있는 권한이 있는 호출을 지정하는 비트맵을 가지고 있다. 모놀리식 커널에서는 모든 드라이버가 권한 여부에 관계없이 모든 커널 함수를 호출할 수 있다.

### I/O 포트 접근 제한
커널은 또한 각 드라이버가 접근할 수 있는 입출력 포트를 알려주는 테이블을 유지한다. 따라서 드라이버는 자신의 I/O 포트에만 접근할 수 있다. 모놀리식 커널에서는 버그가 있는 드라이버가 다른 장치에 속한 I/O 포트에 접근할 수 있다.

### OS 구성 요소와의 통신 제한
모든 드라이버와 서버가 다른 모든 드라이버 및 서버와 통신할 필요는 없다. 따라서 프로세스별 비트맵은 각 프로세스가 보낼 수 있는 대상을 결정한다.

### 죽거나 아픈 드라이버 부활
환생 서버라는 특수 프로세스는 주기적으로 각 장치 드라이버에 핑을 보낸다. 드라이버가 죽거나 핑에 올바르게 응답하지 못하면 환생 서버(드라이버 및 서버의 부모 프로세스)가 오작동하는 구성 요소를 종료하고 새 복사본으로 교체한다. 이러한 방식으로 시스템은 실행 중인 프로그램에 영향을 주지 않고 자동으로 자가 복구된다. 오작동하는 드라이버를 감지하고 교체하는 것은 사용자 작업 없이 자동으로 이루어진다. 이 기능은 현재 디스크 드라이버에서는 작동하지 않지만, 다음 릴리스에서는 시스템이 랜덤 액세스 메모리(RAM)에 섀도잉되는 디스크 드라이버까지 복구할 수 있게 될 것이다. 드라이버 복구는 실행 중인 프로세스에 영향을 미치지 않는다.

### 인터럽트 및 메시지 통합
인터럽트가 발생하면 낮은 수준에서 적절한 드라이버로 전송되는 알림으로 변환된다. 드라이버가 메시지를 기다리고 있으면 즉시 인터럽트가 발생하고, 그렇지 않으면 다음에 메시지를 받기 위해 `RECEIVE`를 할 때 알림이 발생한다. 이 스키마는 중첩된 인터럽트를 제거하고 드라이버 프로그래밍을 더 쉽게 만든다.

## 아키텍처
섬네일|400px|Minix 3 아키텍처

보시다시피, 최하위 레벨에는 약 4,000줄의 코드(주로 C로 작성되었고 약간의 어셈블리어가 포함됨)로 이루어진 마이크로커널이 있다. 이것은 인터럽트, 스케줄링 및 메시지 전달을 처리한다. 또한 승인된 서버와 드라이버가 호출할 수 있는 약 30개의 커널 호출 API를 지원한다. 사용자 프로그램은 이러한 호출을 할 수 없다. 대신 POSIX 시스템 호출을 발행하여 서버에 메시지를 보낼 수 있다. 커널 호출은 인터럽트 설정 및 주소 공간 간 데이터 복사와 같은 기능을 수행한다.

다음 레벨에는 장치 드라이버가 있으며, 각 드라이버는 별도의 사용자랜드 프로세스로 실행된다. 각 드라이버는 디스크나 프린터와 같은 I/O 장치를 제어한다. 드라이버는 I/O 포트 공간에 접근할 수 없으며 I/O 명령을 직접 발행할 수 없다. 대신 커널 호출을 통해 쓸 I/O 포트 목록과 쓸 값을 제공해야 한다. 이를 수행하는 데 약간의 오버헤드(일반적으로 500ns)가 있지만, 이 방식은 커널이 권한을 확인할 수 있도록 하여 예를 들어 오디오 드라이버가 디스크에 쓸 수 없도록 한다.

그 다음 레벨에는 서버가 있다. 여기에 거의 모든 운영 체제 기능이 위치한다. 사용자 프로세스는 예를 들어 파일 서버에 파일을 열고, 닫고, 읽고, 쓰라는 메시지를 보내 파일 서비스를 얻는다. 차례로 파일 서버는 디스크를 제어하는 디스크 드라이버에 메시지를 보내 디스크 I/O를 수행한다.

핵심 서버 중 하나는 환생 서버이다. 이 서버의 역할은 다른 모든 서버와 드라이버의 상태를 주기적으로 확인하는 것이다. 구성 요소가 올바르게 응답하지 않거나, 종료되거나, 무한 루프에 빠지면 환생 서버(드라이버와 서버의 부모 프로세스)는 오작동하는 구성 요소를 종료하고 새 복사본으로 교체한다. 이런 식으로 시스템은 실행 중인 프로그램에 방해받지 않고 자동으로 자가 치유된다.

현재 환생 서버, 프로세스 서버 및 마이크로커널은 신뢰 컴퓨팅 기반의 일부이다. 이들 중 어느 하나라도 실패하면 시스템이 충돌한다. 그럼에도 불구하고 리눅스 및 윈도우 시스템에서와 같이 300만~500만 줄의 코드에서 약 2만 줄로 신뢰 컴퓨팅 기반을 줄이면 시스템 신뢰성이 크게 향상된다.

## 미닉스 3와 이전 버전의 차이점

섬네일|여러 유닉스 계열 시스템 간의 관계 다이어그램

미닉스 1.0, 1.5, 2.0은 사람들이 운영 체제 설계에 대해 배우는 것을 돕는 도구로 개발되었다.

1987년에 출시된 Minix 1.0은 12,000줄의 C와 일부 x86 어셈블리어로 이루어져 있었다. Minix 1.0의 커널, 메모리 관리자, 파일 시스템 소스 코드는 책에 인쇄되어 있다. 타넨바움은 원래 당시 사용 가능했던 IBM PC 및 IBM PC/AT 마이크로컴퓨터와 호환되도록 Minix를 개발했다.

1991년에 출시된 Minix 1.5는 마이크로채널 IBM PS/2 시스템에 대한 지원을 포함했으며, 모토로라 68000 및 SPARC 아키텍처로도 포팅되어 아타리 ST, 코모도어 아미가, 애플 매킨토시 및 썬 마이크로시스템즈 SPARCstation 컴퓨터 플랫폼을 지원했다. 썬OS에서 사용자 프로세스로 실행되는 Minix 버전도 제공되었다.

1997년에 출시된 Minix 2.0은 X86 및 Solaris 호스팅 SPARC 아키텍처에서만 사용할 수 있었다. 프리예 대학교 연구원 두 명이 Minix-vmd를 만들었고, 가상 메모리와 X 윈도 시스템(X11) 지원을 추가했다.

미닉스 3도 마찬가지이며, 많은 최신 도구와 많은 유닉스 애플리케이션을 갖춘 최신 운영 체제를 제공한다. 타넨바움 교수는 다음과 같이 말했다:

Minix 2 출시 이후 커널 구조에도 많은 개선이 이루어져 시스템이 더욱 안정적이 되었다.
[upright=1.1|섬네일|right|Equinox Desktop Environment (EDE)와 함께 [X 윈도 시스템(X11)을 실행하는 Minix 3.1.7]]
Minix 버전 3.1.5는 2009년 11월 5일에 출시되었다. 이 버전에는 X11, 이맥스, vi, cc, GCC, 펄, 파이썬, 암키스트 셸, Bash, Z 셸, FTP 클라이언트, SSH 클라이언트, 텔넷 클라이언트, Pine, 그리고 400개 이상의 다른 일반적인 유닉스 유틸리티 프로그램이 포함되어 있다. X11의 추가로 이 버전은 텍스트 전용 시스템에서 벗어나는 전환점을 마련했다. 이 버전의 또 다른 기능은(향후 버전에서 개선될 예정) 장치 드라이버 충돌에 시스템이 견딜 수 있고, 많은 경우 실행 중인 프로세스에 영향을 주지 않고 자동으로 교체되는 기능이다. 이러한 방식으로 Minix는 자가 복구 능력이 있으며 높은 신뢰성이 요구되는 애플리케이션에 사용될 수 있다.

미닉스 3.2.0은 2012년 2월에 출시되었다. 이 버전에는 클랭 컴파일러, 실험적인 대칭형 다중 처리 지원, Procfs 및 Ext2 파일 시스템 지원, GNU 디버거(GDB) 등 많은 새로운 기능이 포함되어 있다. NetBSD의 여러 부분도 부트로더, libc 및 다양한 유틸리티 및 기타 라이브러리를 포함하여 릴리스에 통합되었다.

미닉스 3.3.0은 2014년 9월에 출시되었다. 이 릴리스는 x86 외에 ARM 아키텍처를 지원하는 첫 번째 버전이다. 또한 수천 개의 NetBSD 패키지를 즉시 실행할 수 있는 NetBSD 사용자랜드를 지원한다.

## 마스코트
섬네일|Minix 3의 마스코트 로키 라쿤.
**로키 라쿤**은 Minix 3의 마스코트이다.

## MINIXCon
MINIXCon은 Minix와 관련된 강연, 노력 및 연구를 공유하는 컨퍼런스이다.

2016년에 한 번 개최되었다. MINIXCon2017은 제출된 강연 부족으로 취소되었다.

## 같이 보기

* MINIX 파일 시스템
* Xinu
* xv6
* 운영체제 커널 비교
* 컴퓨팅 마스코트 목록
* :분류:컴퓨팅 마스코트

## 내용주

## 각주

## 참고 자료

*
* Building a dependable operating system: fault tolerance in MINIX 3 by Jorrit N. Herder (PDF)
* Reorganizing Unix for Reliability by Jorrit N. Herder, Herbert Bos, Ben Gras, Philip Homburg, and Andrew S. Tanenbaum (PDF)
* Modular system programming in MINIX 3 by Jorrit N. Herder, Herbert Bos, Ben Gras, Philip Homburg, and Andrew S Tanenbaum (PDF)
* J. N. Herder et al., Modular System Programming in MINIX 3, ;Login, April 2006 (PDF)
* Pablo A Pessolani. MINIX4RT: A Real-Time Operating System Based on MINIX 
* Building Performance Measurement Tools for the MINIX 3 Operating System, by Rogier Meurs (PDF)
* Design and implementation of the MINIX virtual file system (PDF)
* Reference manual for MINIX 3 Kernel API (PDF)
* Towards a true microkernel operating system (PDF)
* Construction of a Highly Dependable Operating System (PDF)
* Minix 3 and the microkernel experience: Smart Kernel by Rüdiger Weis (PDF)
* Safe and Automatic Live Update by Cristiano Giuffrida (PDF)

## 외부 링크

*
*

분류:컴퓨팅 플랫폼
분류:2005년 소프트웨어
분류:마이크로커널
분류:읽기 전용 매체로 부팅 가능한 운영체제