Kernel Architecture Overview
OSXDEV
Mac OS X는 매킨토시 유저와 개발자 커뮤니티에게 향상된 안정성과 성능, 강화된 네트워크 기능, 객체기반 시스템 프로그래밍 인터페이스, 산업 표준의 향상된 지원과 같은 다양한 잇점을 제공한다.
Mac OS X를 만들면서, 애플은 핵심 Mac OS 운영체제를 완전히 다시 설계했다. Mac OS X의 기반을 형성하는 것은 커널이다. 그림 3-1에 Mac OS X 아키텍처가 묘사되있다.
커널은 Mac OS X에 와서 선점형(preemption), 메모리 보호, 향상된 성능, 발전된 네트워킹 기능, 매킨토시 파일시스템(Extended 와 Standard)과 다른 파일시스템(UFS, ISO 9660, 그밖에)을 동시지원, 객체지향적 API 와 그 밖에 향상을 이루었다. 선점형(preemption)과 메모리 보호의 두가지 기능은 커널을 더욱 강력하고 안정성있는 환경으로 만들어 주었다.
Mac OS 9에서는 어플리케이션들이 프로세서 시간을 공유하기 위해 서로 협력해야 했다. 비슷하게, 모든 어플리케이션 하나의 컴퓨터 메모리 공간을 공유했다. Mac OS 9은 협력적(cooperative) 멀티태스킹 환경이다. 어떤 어플리케이션이 협력하지 않는다고 해도, 모든 프로세스의 응답은 서로 타협된다. 반면에, 멀티미디어 분야와 같은 실시간 어플리케이션은 예측 할 수 있고, 시간에 민감한 특성이 보장되어야 할 필요가 있다.
이와 반대로, Mac OS X은 선점형 멀티태스킹 환경이다. Mac OS X에서는 커널이 어플리케이션간의 협력을 강제로 처리하고, 시간 공유를 위해서 프로세스를 스케쥴링한다(선점형-preemption). 이런 특성은 실시간 처리를 필요로 하는 어플리케이션의 실행을 가능하게 한다.
Mac OS X에서는 일반적으로 프로세스들이 메모리를 공유하지 않는다. 대신 커널이 각각의 프로세스에 대해 고유한 메모리 공간을 할당해 주고, 이러한 메모리 공간에 대한 접근을 제어한다. 이것은 어떤 어플리케이션이 우연히 다른 어플리케이션의 주소 공간에 접근하여 잘못된 값을 써버리게 되는 것을 방지해준다(보호-protection). 메모리 크기가 더 이상 중요하지 않다. Mac OS X에 포함된 가상 메모리 시스템으로, 각각의 어플리케이션은 4GB의 고유의 메모리 공간을 갖게 된다.
모든 어플리케이션은 유저 공간에서 실행된다. 하지만 이것이 프로세스가 같은 메모리 공간을 사용한다는 것을 말하는 것이 아니다. 유저 공간은 단순히 유저레벨 어플리케이션이 사용하는 모든 메모리 공간을 가리키는 말이다. 커널은 커널 공간이라 불리는 자기 자신의 메모리 공간을 별도로 가지고 있다. Mac OS X에서는 어떤 어플리케이션도 시스템 소프트웨어(커널)의 메모리 공간을 직접적으로 수정할 수 없다.
유저 프로세스는 Mac OS 9에서처럼 기본으로 메모리를 서로 공유할 수 없어도, 프로세스간 커뮤니케이션이나 메모리 공유(sharing)는 여전히 가능하다. 예를 들면, 커널은 프로세스간에 어느정도의 정보 공유를 가능하게 하는 공유 라이브러리, 프레임워크, POSIX 공유 메모리와 같은 풍부한 기능을 제공하고 있다. Mach 메세징은 다른 접근으로 이를 구현하는데, 메모리를 한 프로세스에서 다른 메모리로 전달해 준다. Mac OS 9과 달리, 프로그래머가 명시적으로 지정하지 않았다면 메모리 공유는 불가능하다.
목차 |
[편집] Darwin
Mac OS X 커널은 오픈 소스 프로젝트이다. 커널과 그 밖의 MacOS의 핵심 부분을 통틀어서 Darwin이라 부른다. Darwin은 Mac OS X의 기반에 깔려있는 많은 기술들을 기반으로 한 완전한 운영체제이다. 그러나 Darwin은 애플의 Quartz, QuickTime, Cocoa, Carbon, OpenGL 같은 그래픽이나 어플리케이션 계층을 포함하지 않는다.
그림 3-2는 Darwin과 Mac OS X의 관계에 대해서 보여주고 있다. 둘 다 같은 커널에서 세워졌지만, Mac OS X는 Core Servies, Application Services, QuickTime, 그리고 Classic, Carbon, Cocoa, Java(JDK) 어플리케이션 환경을 추가했다. Darwin과 Mac OS X 모두 BSD의 명령행(command-line) 어플리케이션 환경을 포함하고 있다. 그러나 Mac OS X에서는 명령행 환경의 사용이 요구되지 않으며, 사용자가 접근하기 전까지 감춰져 있다.
Darwin은 BSD, Mach 3.0, 그리고 애플의 기술에 기반하고 있다. 가장 좋은것은 Darwin은 오픈 소스 기술이라는 것이다. 이것은 개발자가 소스코드에 완전히 접근 할 수 있다는 것을 의미한다. 그래서 Mac OS X의 써드 파티 개발자들은 Darwin 코어 시스템 소프트웨어 개발 팀의 일부가 될 수 있다. 개발자들은 애플이 핵심 운영 시스템을 가지고 무엇을 하는지 볼 수 있고, 코드를 자신의 상품에 적용할 수 있다. 자세한 사항은 Apple Public Source License (APSL)을 참고하길 바란다.
Mac OS X와 Darwin이 같은 소프트웨어를 통해 만들어졌기 때문에, 개발자들은 Mac OS X와 다윈에서 동시에 실행되는 저수준의 소프트웨어를 만들 수 있다. 유일한 차이점은 소프트웨어가 어플리케이션 환경과 상호작용하는 방식이다.
Darwin은 많은 검증된 기술을 기반으로 만들어졌다. 많은 부분이 FreeBSD (4.4BSD 버젼으로 향상된 네트워킹, 성능, 보안, 호환성을 제공한다) 로 부터 도입되었다. Mach 과 같은 그 밖의 부분은 이전에 사용되었던 Apple의 MkLinux 프로젝트와, Mac OS X Server, NeXT의 기술로 부터 도입되었다. 코드의 대부분이 플랫폼에 독립적이다. 핵심(core) 운영체제의 모든 코드는 소스코드 형태로 얻을 수 있다.
Darwin의 핵심 기술은 몇가지 이유로 선택되었다. Mach는 메모리 관리와, 프로세스간 통신(IPC), 그 밖의 저수준의 운영체제 기능을 깨끗하게 추상화한다. 최근의 빠른 하드웨어 환경의 변화에 있어서, Mach는 운영체제 계층을 하드웨어로부터 깔끔하게 분리시켜 준다.
BSD는 신중히 설계되었고, 많은 기능을 포함하며 충분히 성숙하였다. 실제로, 오늘날의 많은 상용 UNIX와 UNIX 류의 운영체제는 많은 양의 BSD 코드를 포함하고 있다. BSD 는 또한 산업 표준 API들을 제공한다.
Apple에서 설계하고 만든 I/O Kit과 Network Kernel Extensions(NKEs)와 같은 새로운 기술들은 객체지향 프로그래밍 모델같은 향상된 기능이 주는 이점을 활용할 수 있다. Mac OS X는 이러한 새로운 기술들과 오랜 시간동안 사용되어 검증된 산업 표준을 결합하여 더욱 안정되고, 믿을 수 있고, 유연하고, 확장가능한 운영체제가 되었다.
[편집] 아키텍쳐
Darwin 과 Mac OS X의 기반 계층은 그림 3-3에서 보이는 것 처럼 몇가지 아키텍쳐 요소들로 구성되어 있다. 이것들이 합쳐져서 커널 환경을 이루게 된다.
중요: Mac OS X 에서는 '커널' 이라는 용어를 여러분들이 흔히 알고 있는 것과 조금 다르게 사용한다.
"전통적인 운영체제 용어로서 커널은 추가적인 운영체제 서비스를 구현하기 위해 필요한 오직 최소한의 기능만을 제공하는 작은 핵심 소프트웨어이다." - The Design And Implementation of the 4.4 BSD Operating System, McKusick, Bostic, Karels, and Quarterman, 1996.
비슷하게, 전통적인 Mach기반 운영체제에서는, 커널은 Mach 마이크로커널을 가르키며, Mach가 좀 더 많은 작업을 하는데 필요한 추가적인 저수준의 코드는 무시한다.
그러나 Mac OS X 에서는 커널 환경(environment)은 Mach 커널 이외에도 많은 것을 포함하고 있다. Mac OS X 커널 환경은 Mach 커널, BSD, I/O Kit, 파일 시스템, 네트워크 콤포넌트를 포함하고 있다. 보통 이것들을 합쳐서 커널이라 부른다. 각각의 컴포넌트들은 다음의 섹션에서 간단히 설명하도록 하겠다. 저 많은 정보가 필요하면, 특정 컴포넌트를 다룬 챕터를 참조하거나, 참고 자료에 나열된 문서를 보기 바란다.
Mac OS X는 3개의 기본이 되는 요소(Mach, BSD, I/O Kit)를 포함하고 있어서, 어떤 주요한 작업을 수행하는데 3가지 종류의 API가 있는 경우가 많다. 보통 여러분의 코드가 할 작업을 고려하여 알맞는 커널 요소의 API를 선택하는 것이 좋다. 이 챕터의 나머지 부분은 Mach, BSD, 그리고 I/O Kit을 설명하고, 그 요소들이 제공하는 기능의 개요를 제공한다.
[편집] Mach
Mach는 CPU 사용과 메모리 같은 프로세서 자원을 관리하고, 스케쥴링을 처리하며, 메모리 보호를 제공한다, 그리고 나머지 운영체제 계층에 메세지 중심의 기반 구조를 제공한다.
- untyped interprocess communication (IPC)
- remote procedure calls (RPC)
- scheduler support for symmetric multiprocessing (SMP)
- real-time 서비스 지원
- 가상 메모리(virtual memory) 지원
- pagers 지원
- 모듈화된 아키텍쳐
Mach에 대한 일반적인 정보는 "Mach Overview"(링크) 챕터에 나와있다. 스케쥴링에 관한 정보는 “Mach Scheduling and Thread Interfaces.”(링크) 챕터에 나와있다. VM 시스템에 관한 정보는 “Memory and Virtual Memory.”(링크)에 나와있다.
[편집] BSD
Mach 계층 위에 있는 BSD 계층은 "OS 적인" API와 서비스를 제공한다. BSD 계층은 BSD 커널(주로 FreeBSD)에 기반하고 있다. BSD 요소는 다음과 같은 기능을 제공한다.
- 파일 시스템
- 네트워킹 (hardware device level 제외)
- UNIX 보안(security) 모델
- syscall 지원
- 프로세스 ID와 시그널을 포함한 BSD 프로세스 모델
- FreeBSD 커널 APIs
- 많은 POSIX APIs
- pthreads (POSIX threads) 커널 지원
- The BSD component is described in more detail in the chapter “BSD Overview.”
BSD 요소는 “BSD Overview"(링크) 챕터에서 더 자세히 다룬다.
[편집] Networking
Mac OS X의 네트워크 작업은 BSD의 향상된 네트워크 기능 덕택에 Network Address Translation (NAT)와 방화벽(firewalls) 같은 현대적인 기능을 제공하고 있다. 네트워크 요소는 다음과 같은 기능을 제공한다.
- 4.4BSD TCP/IP 스택과 소켓(socket) APIs
- IP와 DDP (AppleTalk transport) 모두 지원
- multihoming
- routing
- multicast 지원
- server tuning
- packet filtering
- Mac OS Classic 지원 (through filters)
“Network Architecture.”(링크)에서 네트워킹에 대해서 더 자세히 다루고 있다.
[편집] File Systems
Mac OS X는 HFS, HFS+, UFS, NFS, ISO 9660과 그 밖의 것들을 포함하는 다양한 종류의 파일 시스템을 지원하고 있다. 기본 파일시스템은 HFS+ 이고, Mac OS X는 HFS+, UFS, ISO, NFS, and UDF를 부팅 드라이브의 파일시스템으로 사용할 수 있다. Mac OS X 파일 시스템의 향상된 특성으로 향상된 가상 파일 시스템(VFS) 설계가 있다. VFS는 계층화된 아키텍쳐를 제공한다 (파일 시스템이 스택처럼 쌓일 수 있다). 파일 시스템 요소는 다음과 같은 기능을 제공한다.
- UTF-8 (Unicode) 지원
- 이전 버젼의 Mac OS X 보다 향상된 성능
“File Systems Overview.”(링크)에서 더 많은 내용을 다루고 있다.
[편집] I/O Kit
I/O Kit는 여러 디바이스 종류를 지원하여, 간편한 드라이버 개발을 위한 프레임워크를 제공한다. I/O Kit은 C++를 좀 더 단순화시킨 것으로 구현된 객체지향 I/O 아키텍쳐이다. I/O Kit 프레임워크는 더 모듈화되고, 확장가능하다. I/O Kit 요소는 다음과 같은 기능을 제공한다.
- true plug and play
- 동적인 장치 관리(dynamic device management)
- 동적 드라이버 로딩 (필요에 따라 로딩)
- 이동가능한 시스템은 물론 데스크탑 시스템의 전원 관리
- multiprocessor capabilities
"I/O Kit Overview"(링크)에서 더 자세한 내용을 다루고 있다.
[편집] Kernel Extensions
Mac OS X는 커널 확장(kernel extension) 매커니즘을 제공하여, 커널을 다시 컴파일 할 필요 없이 코드를 동적으로 커널 영역으로 로드할 수 있도록 하고 있다. 이 로드되는 코드들을 일반적으로 plug-in 이라 하며, Mac OS X 커널 환경에서는 kernel extension 또는 KEXT라고 한다.
KEXT가 모듈화와 동적 로딩 모두를 제공하기 때문에, 이것은, 사용자 영역(user space)에 내보내지지(exported) 않을 인터페이스에 대한 접근을 요구하는 독립된 서비스를 위한 자연스러운 선택이다. 커널 환경의 많은 요소들이 서로 작동 방식은 다를지라도 이 확장 메커니즘을 지원하고 있다.
예를 들어, 새로운 네트워크 기능 중 몇가지는 network kernel extension(NKE)의 사용을 포함하고 있다. 이것에 관한 내용은 "Network Architecture.”(링크)에서 다룬다.
동적으로 새로운 파일 시스템을 추가하는 것도 VFS KEXT에 기반하고 있다. I/O Kit안에 있는 장치 드라이버와 장치 패밀리들도 KEXT를 사용하여 구현되었다. KEXT는 드라이버 제작, 새로운 불륨(volume) 포맷이나 네트워크 프로토콜 지원을 위한 코드 작성을 더욱 쉽게 해준다. KEXT에 관한 내용은 “Kernel Extension Overview.”(링크)에서 다룬다.







