2016-04-06 1 views
3

J'ai une extension de noyau OSX qui fonctionne et que je voudrais charger automatiquement au démarrage le plus tôt possible. Le kext utilise KAUTH pour surveiller l'accès sur un chemin spécifique donc il me semble qu'il n'y aura rien qui demandera qu'il soit chargé dans le noyau. Dans ce cas, le copier dans /Library/Extensions (au moins depuis Yosemite c'est le chemin recommandé pour les extensions tierces) ne résoudra pas mon problème.Chargement d'OS X kext au début du processus de démarrage

Est-il possible d'y parvenir, que ce soit ou non en modifiant le code ou par une configuration auxiliaire?

J'ai déjà lu sur l'utilisation d'un démon launchd pour utiliser kextload afin de charger l'extension, comme spécifié dans this question, mais dans mon cas, je veux qu'il soit chargé le plus tôt possible.

Mise à jour:
J'utilise une extension du noyau "générique" (lié avec la bibliothèque BSD) et non un I/O une base de Kit. Je veux que mon extension soit chargée avant de commencer launchd.

+0

Salut, j'ai le même problème, sauf que je veux aussi mon kext à charger en mode de démarrage en toute sécurité .. Votre pilote chargé dans le coffre-fort bien ? – Zohar81

+0

Je peux également charger le pilote en mode de démarrage sécurisé, grâce à la clé 'OsBundleRequired' définie dans le fichier' Info.plist'. J'utilise actuellement 'Root' mais je me rappelle avoir travaillé avec d'autres valeurs. Choisissez ce qui vous convient le mieux parmi l'une des valeurs mentionnées dans la [documentation] (https://developer.apple.com/library/content/documentation/Darwin/Conceptual/KEXTConcept/Articles/infoplist_keys.html) – MathPlayer

+0

quand vous dites " mode sans échec "voulez-vous dire le mode de récupération?parce que j'ai vu que lors du chargement du mode de récupération (presser la commande + R au démarrage), mon kext ne trouve même pas dans '/ Library/Extensions' – Zohar81

Répondre

4

Vous ne dit pas explicitement dans la question, mais je en déduire du contexte que vous utilisez une extension du noyau « générique » (contrairement à un kit I/O basé un)? Ils ne sont chargés que parce qu'un autre kext en dépend, ou parce qu'ils sont explicitement chargés via kextutil/kextload ou l'API KextManager.

Contraste cela kexts Kit E/S, qui sont chargés à la demande lorsque l'un de leurs dictionnaires de personnalité correspond à un service enregistré dans le registre IO. Ceci est généralement pour piloter des périphériques spécifiques, mais divers services système non matériels utilisent le mécanisme pour faire correspondre le nub 'IOResources' (documentation) qui apparaît au début du démarrage afin que tous les kexts le listant comme fournisseur pour une personnalité soient également chargés au démarrage.

Donc, la solution serait de modifier votre kext pour fournir une IOService qui correspond à la IOResources nub. Le service lui-même n'a pas vraiment besoin de faire quoi que ce soit si votre composant userspace utilise déjà une autre interface pour communiquer avec le kext.

Si vous ne voulez pas changer le code du kext lui-même, vous pourriez créer un kext factice qui fait cela, mais déclare votre principale kext comme une dépendance. Cette dernière méthode n'est pas particulièrement élégante, mais devrait fonctionner si, pour une raison quelconque, la modification du kext existant n'est pas possible. (Bien que vous aurez probablement besoin de modifier le info.plist)

+0

Oui, j'essaie d'utiliser une extension de noyau générique et pas un en fonction du kit d'E/S, je vais mettre à jour la question. Assez intéressant, même si je crée une extension fictive de kit d'E/S qui liste dans le fichier 'Info.plist' mon fichier kext générique comme une dépendance, le chargement est fait après le lancement de launchd, contrairement à ce que j'essaie d'obtenir. – MathPlayer

+1

Pour que votre kext soit ajouté au noyau prelinked, vous pouvez abuser de la propriété OSBundleRequired. Cela indique au système d'exploitation qu'il est requis pour le démarrage; normalement utilisé par les pilotes de périphérique de stockage, etc. Voir https://developer.apple.com/library/mac/documentation/Darwin/Conceptual/KEXTConcept/Articles/infoplist_keys.html pour plus de détails. – pmdj

+0

J'étais conscient de la propriété 'OSBundleRequired'. J'ai résolu mon problème en changeant l'extension à un kit d'E/S basé avec le jeu de propriétés mentionné en conséquence. J'ai eu quelques problèmes avec le nommage, il semble que le nom du dictionnaire 'IOKitPersonality' soit requis pour être identique au nom de l'extension. – MathPlayer

0

Si le fichier kext est dérivé de IOKit et réside dans /Library/Extensions, effacez le cache et il sera automatiquement chargé au démarrage. Vous videz le cache en appelant

kextcache -f -update-volume/
+0

@TheDarkNight J'ai déjà essayé de reconstruire le cache en utilisant la commande 'kextcache' que vous avez mentionnée, avec et sans enlever tout le contenu de'/System/Library/Caches/com.apple.kext.caches' avant d'exécuter la commande, aucun des combinaisons travaillées. – MathPlayer

+0

Il est conçu pour fonctionner de cette façon. Avez-vous vérifié les journaux du système pour voir s'il signale des problèmes au sujet du chargement de votre kext? – TheDarkKnight

+0

Ceci ne fonctionnera que si le kext est basé sur la correspondance du kit d'E/S. Je vais écrire une réponse séparée pour expliquer plus en détail. – pmdj