2013-07-16 12 views
1

Я создаю собственное ядро ​​для Mac OS (Mountain Lion, Darwin 2050.22.13). Я могу построить ядро ​​просто отлично, и я могу добавить материал к нему, но я что-то упустил.Использование пользовательского ядра Darwin

Чтобы все было в порядке, вот пример того, что я пытаюсь сделать.

Давайте предположим, что я хочу, чтобы добавить функцию [my_func (Недействительными *)], чтобы сказать, BSD/Керн/kern_fork.c Я могу добавить включаемый файл и вставить его в osfmk/BSD и изменить Makefile так, что новый .h-файл теперь скопирован в BUILD/obj/RELEASE_X86_64/EXPORT_HDRS/

Я также добавил имя функции в config/BSDKernel.exports. Я могу видеть функцию с ее символом в/mach_kernel, чтобы она выглядела нормально.

Теперь вот сложная часть. Это не сложно, но я не могу понять. То, что я хочу сделать, - это сделать вызов моей функции из kext, который я также пишу. В принципе, для меня это был бы частный API.

Мой kext компилируется отлично, но когда я запускаю kextload/kextutil, он жалуется, что не может найти символ my_func.

(ядро) kxld [com.blah.foo.kext]: Следующие символы нерешенные этого Kext (ядро) kxld [com.blah.foo.kext]: _my_func

kextlibs возвращения: для всех архитектур: com.apple.kpi.libkern = 12,3

для x86_64: 1 символ не найден ни в одной библиотеке Kext

Таким образом, вопрос, как я могу сделать, чтобы моя функция (s) видно к моим kext (s)? Спасибо!

ответ

1

Я считаю, что символы в BSDKernel.exports заканчиваются на com.apple.kpi.bsd KPI, поэтому вам нужно добавить это в свой словарь OSBundleLibraries в info.plist kext. Я не уверен на 100%, это все, что вам нужно сделать, поэтому дайте нам знать, если это не сработает.

Update:

Встроенный КПЭ фактически представлены псевдо-кекстов внутри директории "Plugins" в System.kext. Итак, для BSDKernel KPI это /System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/ Возможно, это нужно обновить в натуральной форме?

make all, похоже, автоматически не создает новый System.kext. Однако есть большой раздел, посвященный System.kext в config/Makefile, и, похоже, это часть целей установки. make install может сделать трюк. Или, если вы осторожны, что (как я), это, кажется, решающая линия:

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

Другими словами, сделать резервную копию System.kext, а затем скопировать BUILD/obj/RELEASE_X86_64/BSDKernel.symbolset над /System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/BSDKernel и попробовать загрузка.

Удачи!

+0

Спасибо! Я думал, что изначально, но это, похоже, не проблема. Вот часть моего Info.plist в Kext, что бы использовать функции (ы): OSBundleLibraries \t \t com.apple.kpi.libkern \t \t 10,8 \t \t ком .apple.kpi.bsd \t \t 10,8 \t \t com.apple .kpi.mach \t \t 10,8 \t --- Там должно быть что-то, что я не делаю. Забавно, глядя на файлы xxxx.exports, я вижу экспортированную apis, такую ​​как current_task(), и мой собственный api не находится ни в одном из этих файлов. –

+0

Я обновил свой ответ другой теорией. Надеюсь, вы сможете заставить его работать с этим. Кстати, 10.8 в OSBundleLibraries относится к числу Дарвина - 10.8 означает OSX 10.6.8, а не Mountain Lion (это 12.0). На всякий случай это было непонятно. – 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> 

ССАГПЗ выглядит следующим образом:

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 

В конфигурации/BSDKernel.exports: _my_func

В osfmk/BSD, У меня есть bdsfoo.h [у которого есть extern int my_func (void)]

Чтобы построить ядро:

make ARCH_CONFIGS=X86_64 KERNEL_CONFIGS=RELEASE VERBOSE=YES 

После mach_kernel копируется/

ф BUILD/объект/RELEASE_X86_64/BSDKernel.symbolset /System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/ BSDKernel

Это недостающее звено, еще раз спасибо pmjordan

перезагрузки. Создайте мой kext и kextload, успех!

+0

Прохладный, рад, что вы его отсортировали! Полезно знать, если я буду делать это сам в будущем. :-) – pmdj

 Смежные вопросы

  • Нет связанных вопросов^_^