[App 개발] OS X 를 지원하지 않는 기종을 위한 커널 해킹 (3)
본문
PatchedNVRAM.kext 뿐만 아니라 여러 개의 드라이버들을 고치거나 새로 만들어야 합니다. 대략 45,000 줄의 코드 분량의, 모두 30개의 커널 익스텐션을 손보아야 합니다.
미 지원 컴퓨터들을 위하여 필요한 모든 커널 익스텐션을 작성해 준다 하더라도 아직은 어려운 부분이 남아 있습니다. Mac OS X 는 인스톨 CD 를 이용해서 설치해야 하는데, 당연히 미 지원 드라이버들은 CD 에 들어있지 않지요. 따라서 인스톨 CD 를 이용한 일반적인 인스톨 방법으로는 커널 패닉을 맞을 수 밖에 없습니다 (커널은 디바이스 트리의 루트인 ApplePlatformExpertDevice 와 "platform expert" 드라이버를 연결해 줄 수 없기 때문입니다).
이를 해결하는 방법은 여러가지 있습니다. 그 중 한 가지는, 지원하는 컴퓨터에서 인스톨을 한 다음, 필요한 드라이버를 첨부해서, 하드디스크를 떼어다가 미 지원 컴퓨터에 이식하는 것입니다. Mac OS X 는 인스톨 과정에 사용된 컴퓨터를 가리지 않기 때문에 이 방법이 가능합니다. 하지만, 이 방법은 번거롭기도 하며, 이 방법을 시도하려는 사람들이 이것 때문에 새 컴퓨터를 사게 만들고 싶지 않습니다.
미 지원 컴퓨터에 OS X 를 설치하기 위해 제가 맨 먼저 시도했던 방법은, 먼저 인스톨 CD 를 하드디스크 파티션에 복사한 다음, 파티션을 부팅 가능하게끔 변경하여, 그 파티션으로 부팅하여 설치하는 방법이었습니다. 가능한 방법이긴 합니다만, 이를 위해서는 14 단계의 복잡한 과정을 거쳐야 하며, 파티션을 따로 두 개 준비해 두어야 합니다.
좀 더 편한 방법을 찾기 위해서 Mac OS X 의 부팅 과정에 대한 연구가 필요했습니다. Mac OS X 의 부팅 과정은 모두 네 가지 부분으로 나눌 수 있습니다.
* 오픈 펌웨어가 NVRAM 으로부터 필요한 패치를 읽는다
* 오픈 펌웨어가 BootX 를 읽는다
* BootX 는 루트 장비를 연결하기 위한 커널 및 커널 익스텐션을 읽는다
* 커널은 루트 장비를 마운트하고 시스템 시작 단계를 준비한다.
결론적으로 우리에게 필요한 일은 커널이 인스톨 CD 를 루트 장비로 인식하도록 하는 일입니다. 그리고 이것이 원래 인스톨 프로세스가 실제 하는 일입니다. 그리고 BootX 가 커널 및 커널 익스텐션을 CD 로부터 읽게 해야 하며, 동시에 CD 에 없는 몇 가지 커널 익스텐션을 읽게끔 해야 합니다.
부팅 과정을 나누어 제어할 수 있는 세 가지 변수가 NVRAM 에 존재한다는 것을 알아냈습니다. "boot-device" 변수는 오픈 펌웨어가 BootX 를 읽어들일 드라이브 위치를 저장하는 변수입니다. 기본적으로 BootX 는 boot-device 로부터 커널과 커널 익스텐션을 읽어들입니다. 그런데, 만약 "boot-file" 이 지정되어 있으며 BootX 는 boot-device 대신 boot-file 로부터 커널과 커널 익스텐션을 읽어들입니다. 그렇게 되면 커널은 boot-file 이 있던 파티션을 루트 장치로 이용합니다. 하지만 이것도 역시 "boot-command" 변수를 이용해서 다른 루트 장치를 지정할 수 있습니다. 따라서, 이러한 변수들을 이용하면 필요에 따라서 부팅 과정을 미세 조정할 수 있습니다.
다음과 같은 방법을 이용하였습니다. 먼저 인스톨 CD 로부터 커널과 커널 익스텐션을 타겟 파티션의 임시 장소에 복사합니다 (사용자가 Mac OS X 를 설치하려는 파티션입니다). 그 다음 수정된 커널 익스텐션을 CD 에서 복사한 커널 익스텐션 위치에 같이 복사해 넣습니다. 그리고 "boot-device" 변수를 인스톨 CD 를 가리키게 합니다, BootX 가 필요로 하니까요. 하지만 "boot-file" 변수는 커널과 커널 익스텐션을 복사해 둔 타겟 볼륨의 장소를 가리키게 합니다. 마지막으로 "boot-command" 변수를 다시 CD 를 가리키게 합니다. 이렇게 해서 부트 프로세스는 CD 로 시작하게 되고, 커널과 커널 익스텐션을 타겟 볼륨에 복사한 다음, 다시 CD 를 루트 장치로 돌아오게 됩니다.
이 시점에서 저는 이 과정을 관리하는 프로그램을 작성하였습니다 (이 프로그램이 결국 XPostFacto 가 됩니다). 이 프로그램은 클릭 세 번만 하면 됩니다 (타겟 볼륨을 선택하고, 인스톨 CD 를 선택한 다음, Install 버튼을 누릅니다). 나머지 과정은 모두 자동으로 됩니다. 프로그램은 볼륨과 오픈 펌웨어 경로 지정 등을 관리하고, NVRAM 을 억세스하며, 유저 인터페이스와 프레퍼런스를 관리하고, 커널 익스텐션을 설치하고 업데이트 하는 등의 일을 합니다. 원래는 Mac OS 9 에서만 동작하였으나, 결국 OS X 로 포팅되었습니다.
커널과 커널 익스텐션을 인스톨 CD 로부터 복사하는 것은 쉬웠습니다만, 애플측은 더 이상 커널 익스텐션을 인스톨 CD 에 넣어두지 않고, 그 대신 인스톨 CD 는 익스텐션 캐시(Extensions.mkext)를 부팅용으로 이용하고, 그 다음 진짜 커널 익스텐션을 아카이브로부터 가져옵니다. 물론 익스텐션 캐시를 타겟 볼륨에 복사한 다음 "boot-file" 로 지정할 수도 있지요. 하지만 BootX 는 커널 익스텐션 캐시와 외부 익스텐션을 같이 읽어들이지는 않습니다. 캐시를 쓰거나 진짜 익스텐션을 쓰거나 둘 중에 하나를 택합니다. 그렇지 않고서야 캐시를 쓸 이유가 없겠죠?
다행스럽게도 BootX 자체도 오픈 소스이며, 따라서 우리가 원하는 대로 동작하지 않는다면, 우리가 원하는 동작을 하게끔 바꾸어주면 됩니다. 그래서 저는 미 지원 기종 설치를 할 경우 CD 에서 복사한 익스텐션 캐시와 필요한 외부 커널 익스텐션을 동시에 읽게끔 BootX 를 개조하여 컴파일하였습니다. 이제 boot-device 변수를, 제가 만든 커스텀 BootX 를 실행할 수 있도록 타겟 볼륨으로 지정하였습니다.
Mac OS X 의 유연한 부팅 프로세스 덕분에 Mac OS X 인스톨 CD 를 개조하지 않고서도 미 지원 기종에서 부팅할 수 있게 되었습니다.
최신글이 없습니다.
최신글이 없습니다.
댓글목록 0