2013-07-16 6 views
1

저는 맥 OS 용 커스텀 커널을 만들고 있습니다 (Mountain Lion, Darwin 2050.22.13). 커널을 잘 만들 수 있고 그 커널에 물건을 추가 할 수 있지만 뭔가 빠졌습니다.커스텀 다윈 커널 사용

짧은 것을 유지하기 위해 여기에 제가하려는 일의 샘플이 있습니다.

의 내가 말을 함수 [my_func (무효 *)]을 추가 할 것을 가정 해 봅시다, BSD/컨/kern_fork.c 그 때문에 메이크 파일을 포함하고 osfmk/BSD로 스틱을 추가하고 변경할 수 있습니다 새로운 .h 파일이 이제 BUILD/obj/RELEASE_X86_64/EXPORT_HDRS/

에 복사됩니다.

또한 config/BSDKernel.exports에 함수 이름을 추가했습니다. /mach_kernel에 기호가있는 함수를 볼 수 있으므로 잘 보일 수 있습니다.

자, 여기 까다로운 부분이 있습니다. 그것은 본질적으로 힘들지는 않지만 그것을 이해할 수는 없습니다. 내가하고 싶은 것은 내가 쓰고있는 kext에서 내 함수를 호출 할 수있게하는 것이다. 기본적으로 그것은 나를위한 일종의 비공개 API 일 것입니다.

내 kext는 잘 컴파일되지만 kextload/kextutil을 실행하면 my_func 심볼을 찾을 수 없다는 오류가 발생합니다.

(커널) com.blah.foo.kext] kxld 다음 심볼이 KEXT (커널)로 미해결 kxld [com.blah.foo.kext]

kextlibs 복귀 _my_func : com.apple.kpi.libkern = x86_64의 12.3

: 모든 아키텍처를 들어 1 기호는

그래서 문제는 내 기능 (들)이 볼 수 있도록해야합니까 어떻게 KEXT 어떤 라이브러리에서 찾을 수 없습니다 내 kext (s)에? 감사합니다.

답변

1

BSDKernel.exports의 기호가 com.apple.kpi.bsd KPI로 끝나기 때문에 kext의 info.plist에 OSBundleLibraries 사전에 추가해야합니다. 100 % 확신 할 수있는 것은 아니므로 작동하지 않는지 알려주십시오.

업데이트 :

내장 된 KPI를 실제로 System.kext의 "플러그인"디렉토리 내에서 의사 kexts로 표시됩니다. 그래서 BSDKernel KPI는 /System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/ 일 것입니다. 아마 그 종류를 업데이트해야합니까?

make all은 자동으로 새로운 System.kext을 구축하지 못했습니다. 그러나 System.kext 전용 섹션이 config/Makefile에 있으며 설치 대상의 일부로 보입니다. make install 트릭을 할 수 있습니다. 다음 /System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/BSDKernel 시도를 통해 BUILD/obj/RELEASE_X86_64/BSDKernel.symbolset 복사, 즉

install $(INSTALL_FLAGS) $(OBJROOT)/BSDKernel.symbolset $(DSTROOT)/$(INSTALL_KEXT_DIR)/System.kext/PlugIns/BSDKernel.kext/BSDKernel;   \ 

당신의 System.kext의 백업을 만들 : (나는대로) 해당주의 인 경우 또는,이 중요한 줄 것 같다 부팅.

행운을 빈다.

+0

고마워요! 처음에는 같은 생각 이었지만 문제는 아닌 것 같습니다. 여기에 KEXT 내의 Info.plist의 일부 기능 (들)의 사용을 만들 것이라고입니다 : OSBundleLibraries \t \t com.apple.kpi.libkern \t \t 10.8 \t \t 닷컴 .apple.kpi.bsd \t \t 10.8 \t \t com.apple \t \t \t 10.8 --- 내가 안할거야 무언가가 있어야합니다 .kpi.mach. 재밌는 정도로, xxxx.exports 파일을 보면 current_task()와 같은 내 보낸 api를 볼 수 있으며 내 자신의 API는 해당 파일에 없습니다. –

+0

다른 이론으로 내 대답을 업데이트했습니다. 희망을 가지고 작업 할 수 있기를 바랍니다. 그건 그렇고, OSBundleLibraries의 10.8은 Darwin 숫자를 의미합니다. 10.8은 Mountain Lion (12.0)이 아니라 OSX 10.6.8을 의미합니다. 단지 그 것이 명확하지 않은 경우를 대비하여. – pmdj

+0

감사합니다. 나는 그것을 때때로 희망을 갖고 시험해 볼 것이다. 이 작업을 수행하자마자 업데이트를 게시합니다. 내가 간다고 그 물건을 문서화하고있다. –

1

pmjordan 덕분에 나는이 문제를 해결할 수있었습니다. 약간의 노력을했지만 지금은 좋은 것처럼 보입니다.

OSBundleLibraries 이제 다음과 같습니다

<key>OSBundleLibraries</key> 
    <dict> 
     <key>com.apple.kpi.libkern</key> 
     <string>12.3</string> 
     <key>com.apple.kpi.bsd</key> 
     <string>12.3</string> 
    </dict> 

GCC는 명령은 다음과 같습니다 : 설정/BSDKernel.exports에서

cc -m64 -Xlinker -kext -static -c foo.c -o Contents/MacOS/foo -fno-builtin -nostdlib -lkmod -r -mlong-branch -I/System/Library/Frameworks/Kernel.Framework/Headers -Wall 

: osfmk/BSD에서

_my_func, 나는 bdsfoo.h [extern int my_func (void)]를 가지고있다

make ARCH_CONFIGS=X86_64 KERNEL_CONFIGS=RELEASE VERBOSE=YES 

mach_kernel이/

CP의 BUILD로 복사되면/OBJ/RELEASE_X86_64/BSDKernel.symbolset /System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/ :커널을 빌드하려면

BSDKernel

는이 덕분에 다시

재부팅 pmjordan에 누락 된 링크이었다. 내 kext 및 kextload 빌드 성공!

+0

쿨, 다행 당신은 그것을 분류있어! 미래에이 작업을 직접 수행해야 할 경우를 대비하여 알아두면 좋습니다. :-) – pmdj