[App 개발] Mac OS X 커널의 내부 (3)
본문
XNU 가 i386 을 지원하기 시작한 것은 90 년대 중반 OpenStep 으로 판매되기 시작할 때부터이지만, Mac OS X 에 적용된 것은 애플이 인텔 프로세서를 채택한 2005/2006 년도부터입니다. 그리고 64 비트 맥 프로가 소개된 2006년도부터 x86_64 (AMD64, Intel64, EM64T, x64 등) 가 XNU 에 추가되었습니다. 하지만 XNU 는 64 비트 커널은 아닙니다. XNU 는 64 비트 유저 모드 응용프로그램을 지원하지만, 본체는 32 비트입니다. 32 비트 커널을 64 비트로 포팅하는 것은 큰 작업이므로 인텔 맥이 출시된 2006년 1월(이때까지 애플은 32비트 i386 버젼을 부지런히 마무리) 부터 맥 프로가 출시된 8월까지의 기간동안은 시간이 촉박했습니다.
인텔 32 비트와 64 비트 컴퓨터에 대응하는 커널 이미지는 한 가지입니다. 두 종류 기종 모두 이 이미지를 32 비트 보호 모드에서 32 비트 프로세스로 읽으며, 만약 64 비트 지원 기능을 발견하였을 시 커널은 롱 모드 호환 모드로 전환합니다. 이 모드는 32 비트 코드를 지원하면서 64 비트 코드로의 전환이 가능합니다. 이렇게 해서 전체 커널 코드는 32 비트이면서 64 비트 유저 어드레스 공간을 처리할 스텁과, 64 비트 코드를 처리할 syscall 과 트랩을 보유합니다. 그리고 64 비트 처리 가능한 32 비트 커널의 장점으로서, 32 비트 KEXT 를 손쉽게 지원할 수 있으며, 커널 코드 대부분에 걸쳐 32 비트 포인터를 사용함으로써 메모리를 적게 사용합니다. 이 점은 커널이 확장 x86_64 레지스터를 사용하지 못하므로 32 비트 어드레스 공간에 한정된다는 단점이 되기도 합니다.
하지만 다른 일반적인 32 비트 운영체제인 리눅스나 윈도우, BSD 등은 메모리 공간을 유저용 2기가, 커널용 2기가 (2/2) 혹은 유저옹 3기가, 커널용 1기가 (3/1) 등으로 나누어 쓰고 있지만, i386/x86_64 버젼 XNU 는 메모리를 4/4 로 활용합니다. 커널이 사용하는 메모리 공간은 유저 데이터가 어드레스를 매핑하지 않고, 반대로 유저 코드가 동작하는 공간에는 커널이 어드레스를 매핑하지 않습니다. 따라서 커널과 유저 모두 4기가바이트 어드레스 공간을 활용할 수 있지만, 이 방식은 유저와 커널 간의 데이터 교환에는 약간 덜 효율적입니다. 하지만 이렇게 함으로써 커널 모드는 더 많은 디바이스를 메모리 공간에 위치시킬 수 있으며 (메모리를 많이 사용하는 비디오카드 같은 경우), 더 많은 메모리를 관리할 수 있으므로, 향후 진정한 64 비트 커널이 필요할 경우 메모리 한계를 쉽게 확장할 수 있습니다.
- iPhone
Mac OS X 는 32/64 비트 PowerPC, i386/x86_64 인텔 맥, i386 기반의 애플TV 셋탑 박스, 그리고 아이폰과 아이팟 터치에서 구동됩니다. 아이폰과 아이팟 터치는 ARM 프로세서를 장착하고 있습니다. 이 기계들을 위해서 XNU 와 Mac OS X 유저 공간의 일부가 ARM 으로 포팅되었습니다. ARM 커널은 모든 KEXT 를 지원하지 못하다는 점과 보안장치가 되어 있다는 점만 제외하면 대부분은 PowerPC 나 i386/x86_64 버젼과 동일합니다.
- XNU 의 장점
비록 XNU 는 다른 운영체제보다 확장성이 좋거나 잘 정리된 것은 아니지만 (지속적으로 발전하고 있음), 상당히 세련된 아이디어와 특장점을 지닌 최신 UNIX 입니다.
* 커널 익스텐션 ABI 가 지난 수 차례 업그레이드를 통해서 안정화되었습니다.
* Fat/universal 바이너리 기술로 인스톨 CD 한 장으로 서로 다른 아키텍쳐의 프로세서에, 동일한 종류의 파일과 디렉토리를 남발하지 않으면서 운영체제를 설치할 수 있게 되었습니다. 게다가 서드 파티 응용프로그램 개발자들도 여러 종류의 아키텍쳐에 대응하는 단일 소프트웨어 파일을 배포할 수 있습니다.
* I/O-Kit 은 코드를 통째로 복사하지 않고 드라이버 코드를 재사용할 수 있습니다.
* KEXT 캐시는 부팅 시간을 단축시키는 말끔한 방법입니다.
* Mach, BSD, I/O-Kit 의 깔끔한 분할 덕분에 코드 관리 비용이 적게 듭니다.
* 강력한 Mach Message API 는 유저 모드 응용프로그램에 유용합니다.
* Mac OS X 10.5 레오파드의 i386 포팅으로부터, OS X 는 AT&T UNIX 코드를 이용하지 않는 완전 POSIX 기준에 적합한 운영체제가 되었습니다.
- 오픈 소스와 해킹
애플은 운영체제의 마이너 업데이트 (10.5.0, 10.5.1 등) 때마다 오픈 소스 라이센스 하의 모든 시스템 컴포넌트의 소스코드를 공개하였습니다. 이것은 GUI 를 제외한 시스템 전체를 의미합니다. 그 중의 절반은 일반 오픈 소스 프로젝트(bash 나 perl 등)의 패치판이며, 나머지 절반은 BSD 형식 라이센스와 유사한 Apple Public Source License (APSL) 하에서 배포되는 애플이 제작한 코드입니다. 이렇게 해서 표준 BSD 라이센스와 OpenSolaris CDDL 과 호환성을 갖게 합니다. 하지만 애플 외 개발자들이 참여할 수 있는 실시간 소스 저장소같은 것이 마련되어 있지 않으므로, APSL 컴포넌트 개발에 직접 참여할 수 있는 오픈 소스 커뮤니티는 존재하지 않습니다. 하지만 오픈 소스는 다른 측면에서 유용합니다. KEXT 개발자들이 쉽게 디버깅을 할 수 있고, 정부나 교육기관이 보안 기능을 추가한다든지 하는 고유의 버젼을 개발할 수 있고, 다른 회사나 대학들이 판매나 연구 목적으로 커널에 기능을 첨가할 수 있습니다 (SEDarwin, L4/Darwin).
하지만 애플의 오픈 소스는 완전한 오픈을 의미하지 않습니다. XNU 소스 코드에는 대부분의 ARM 관련 내용이 빠져있고, 인텔과의 계약에 의하여 공개를 거부한 부분도 있습니다. 하지만 오픈 소스로 컴파일된 커널은 고유 코드를 만들어 대체할 수 있습니다.
- 정리
* OS X 커널은 Mach 가 나입니다. OS X 커널은 XNU 이며, Mach 와 BSD 그리고 I/O-Kit 으로 구성됩니다.
* OS X 커널은 마이크로 커널이 아닙니다. Mach 커널은 다른 프로젝트에서 마이크로 커널로 활용되어 왔습니다만, XNU 는 BSD 와 대부분의 드라이버를 커널 모드에 갖고 있는 전형적인 단일 커널입니다.
* OS X 커널은 FreeBSD 기반이 아닙니다. 커널의 BSD 부분은 4.4BSD 기반이며, 약간의 코드를 FreeBSD 와 NetBSD 등에서 가져왔습니다. 한편, 유저 공간의 유닉스 툴들은 대부분 FreeBSD 코드입니다.
* OS X 커널은 C++ 로 작성되지 않았습니다. I/O-Kit 은 C++ 의 축약형으로 작성되었습니다만, Mach 와 BSD 는 C 로 작성되었습니다.
* OS X 커널은 64 비트가 아닙니다. 64 비트 PowerPC 나 인텔 프로세서에서 64 비트 유저 공간의 응용프로그램을 지원하지만, 커널 자체는 32 비트 모드로 동작하며 4 GB 어드레스 공간 한계가 존재합니다.
* OS X 커널은 오픈 소스이지만 애플 외부에 실시간 소스 공유 장소는 없습니다. 그리고 소스 코드를 모두 다 배포한 것은 아닙니다. 하지만 컴파일해서 시스템에 적용할 수 있습니다.
* OS X 커널은 유닉스입니다, 하지만 OS X 10.5 레오파드, 그 중에서 32 비트 i386 에만 해당합니다. 이 버젼은 POSIX 적합성 테스트를 통과했기 때문에 OpenGroup 의 UNIX 트레이드마크를 사용할 수 있습니다.
최신글이 없습니다.
최신글이 없습니다.
댓글목록 2
hongjuny님의 댓글
번역이 부드럽지 못해서 죄송합니다. 그래도 대략의 뜻은 다 통할 것으로 믿습니다. ^^
이성훈님의 댓글
아주 잘 읽었습니다.
내용의 전달도 거의(99%) 다 전달이 되었습니다.
좋은내용 감사합니다.