2013-07-16 5 views
1

Je construis un noyau personnalisé pour Mac OS (Mountain Lion, Darwin 2050.22.13). Je peux très bien construire le noyau et je peux y ajouter des choses mais il me manque quelque chose.Utilisation du noyau Darwin personnalisé

Pour être bref, voici un exemple de ce que j'essaie de faire.

Disons que je veux ajouter une fonction [my_func (void *)] dire, bsd/kern/kern_fork.c Je peux ajouter un fichier inclure et le coller dans osfmk/bsd et changer le Makefile pour que le nouveau fichier .h est maintenant copié dans BUILD/obj/RELEASE_X86_64/EXPORT_HDRS/

J'ai également ajouté le nom de la fonction à config/BSDKernel.exports. Je peux voir la fonction avec son symbole dans/mach_kernel, donc cela semblerait bien.

Maintenant, voici la partie difficile. Ce n'est pas difficile en soi mais je ne peux pas le comprendre. Ce que je veux faire, c'est être capable de faire un appel à ma fonction à partir d'un kext que j'écris aussi. Fondamentalement, ce serait une sorte d'API privée pour moi.

Mon kext compile bien mais quand je cours kextload/kextutil il se plaint qu'il ne peut pas trouver le symbole my_func.

(noyau) kxld [com.blah.foo.kext]: Les symboles suivants ne sont pas résolus par cette kext (noyau) kxld [com.blah.foo.kext]: _my_func

kextlibs retours: pour toutes les architectures: com.apple.kpi.libkern = 12.3

pour x86_64: 1 symbole ne se trouve pas dans une bibliothèque kext

la question est de savoir comment puis-je faire pour que ma fonction (s) visible à mon kext (s)? Merci!

Répondre

1

Je crois que les symboles de BSDKernel.exports se retrouvent dans l'indicateur de performance clé com.apple.kpi.bsd, vous devez donc l'ajouter à votre dictionnaire OSBundleLibraries dans info.plist de kext. Je ne suis pas sûr à 100% que c'est tout ce que vous devez faire, alors laissez-nous savoir si cela ne fonctionne pas.

Mise à jour:

Les indicateurs de performance intégrés sont effectivement représentés par des pseudo-kexts dans le répertoire "Plugins" de System.kext. Donc, pour le KPI BSDKernel, c'est /System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/ Peut-être que cela doit être mis à jour en nature?

make all ne semble pas générer automatiquement un nouveau System.kext. Cependant, il existe une grande section dédiée à System.kext dans config/Makefile, et elle semble faire partie des cibles d'installation. make install pourrait faire l'affaire. Ou, si vous êtes méfiant de ce (que je suis), cela semble être la ligne cruciale:

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

En d'autres termes, faire une sauvegarde de votre System.kext, puis copiez BUILD/obj/RELEASE_X86_64/BSDKernel.symbolset sur /System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/BSDKernel et essayer démarrage

Bonne chance!

+0

Merci! Je pensais la même chose au début, mais cela ne semble pas poser de problème. Voici une partie de mon Info.plist dans le kext qui utiliser la fonction (s): OSBundleLibraries \t \t com.apple.kpi.libkern \t \t 10,8 \t \t com .apple.kpi.bsd \t \t 10,8 \t \t com.apple .kpi.mach \t \t 10,8 \t --- Il doit y avoir quelque chose que je ne fais pas. Assez drôle, en regardant les fichiers xxxx.exports je peux voir les apis exportés comme current_task() et ma propre API n'est dans aucun de ces fichiers. –

+0

J'ai mis à jour ma réponse avec une autre théorie. J'espère que vous pouvez l'obtenir pour travailler avec ça. En passant, 10.8 dans OSBundleLibraries se réfère au nombre de Darwin - 10.8 signifie OSX 10.6.8, pas Mountain Lion (c'est 12.0). Juste au cas où ce n'était pas clair. – pmdj

+0

Merci! Je vais essayer quelques fois, je l'espère, aujourd'hui. Je publierai une mise à jour dès que j'aurai commencé à travailler. Je documente ce genre de choses au fur et à mesure. –

1

Grâce à pmjordan, j'ai réussi à faire fonctionner cela. Il a fallu un peu d'effort mais ça semble être bon maintenant.

Les OSBundleLibraries ressemble maintenant à ceci:

<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> 

La commande GCC ressemble à ceci:

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 

Dans config/BSDKernel.exports: _my_func

Dans osfmk/bsd, J'ai bdsfoo.h [qui a un extern int my_func (void)]

Pour construire le noyau:

make ARCH_CONFIGS=X86_64 KERNEL_CONFIGS=RELEASE VERBOSE=YES 

Une fois mach_kernel est copié/

cp BUILD/obj/RELEASE_X86_64/BSDKernel.symbolset /System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext/ BSDKernel

Ce fut le chaînon manquant, encore une fois grâce à pmjordan

reboot. Construis mon kext et kextload, le succès!

+0

Cool, heureux que vous l'ayez trié! Bon à savoir au cas où je devrais le faire moi-même à l'avenir. :-) – pmdj

Questions connexes