J'apprends les pilotes de périphérique et la programmation du noyau. Selon le livre de Jonathan Corbet, il n'y a aucune main()
fonction dans les pilotes de périphérique.
J'ai donc deux questions:
- Pourquoi n'avons-nous pas besoin d'une
main()
fonction dans les pilotes de périphérique? - Le noyau lui-même a-t-il une
main()
fonction?
Quelqu'un peut m'expliquer cela?
linux-kernel
drivers
Quelqu'un
la source
la source
Réponses:
Dans les programmes d’espace utilisateur,
main()
est le point d’entrée du programme appelé par le code d’initialisation de la bibliothèque lorsque le fichier binaire est exécuté. Le code du noyau n'a pas le luxe de s'appuyer sur libc, car libc lui-même repose sur l'interface syscall du noyau pour l'allocation de mémoire, les E / S, la gestion des processus, etc.Cela dit, l’équivalent de
main()
dans le code du noyau eststart_kernel()
, qui est appelé par le chargeur de démarrage après avoir chargé l’image du noyau, l’a décompressée en mémoire et configuré le matériel essentiel ainsi que la pagination de la mémoire.start_kernel()
effectue la majeure partie de la configuration du système et engendre finalement le processus init.Le point d’entrée des modules du noyau Linux est une fonction init enregistrée auprès du noyau en appelant la
module_init()
macro. La fonction init du module enregistré est ensuite appelée par le code du noyau via lado_initcalls()
fonction au démarrage du noyau.la source
main
méthode en C. (C’est une idée fausse bien trop répandue selon laquelle le système d’exploitation appelle directementmain
, ce qui n’est pas le cas et est encore moins le cas, par exemple, en C ++.) I ' d vous donner un autre upvote si je pouvais juste pour ça.Le noyau n'a pas de
main
fonction.main
est un concept du langage C. Le noyau est écrit en C et en assembleur. Le code d'entrée du noyau est écrit par assembly.La séquence de démarrage est organisée comme suit:
initrd
). Ensuite, le code à une adresse est exécuté.init
processus), fait passer le contexte de la CPU de l’anneau 0 à l’anneau 3 et démarre le processus init (l’identificateur de processus est 1). Maintenant, le démarrage du noyau est terminé!init
programme exécute tous les scripts d'initialisation. Tous les services sont démarrés. Shell s'appelle. Les utilisateurs peuvent se connecter.La
main
fonction est une fonction C. En réalité, la méthode principale n’est pas le point d’entrée des programmes C. Le runtime C appelle plusieurs fonctions auparavantmain
. GCC a une fonctionnalité d'extension: les constructeurs. Les fonctions déclarées "constructeur" sont appelées avantmain
.Par exemple:
Cette macro provient du projet qemu.
la source
initrd.img
N’EST PAS l’image du noyau. C'est un ensemble de modules chargés par le noyau au démarrage. Les images du noyau portent généralement des noms commençant par "vmlinuz" mais diffèrent de distro en distro.Il existe par exemple une fonction main () dans arch / x86 / boot / main.c pour préparer le système à passer du mode réel au mode protégé, mais les autres architectures ne disposent pas d'un tel code. Voici un bon aperçu du fonctionnement du démarrage du noyau Linux 2.6.x sur une plate-forme x86. Cela vaut vraiment la peine de le lire.
Selon le document HOWTO relatif au développement du noyau Linux , le noyau Linux est
ce qui selon la norme C BTW signifie que
la source