Outils pour utilisateurs

Outils du site


issue93:labo_linux_1

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
issue93:labo_linux_1 [2015/03/16 10:14] – [9] auntieeissue93:labo_linux_1 [2015/03/16 15:13] (Version actuelle) andre_domenech
Ligne 7: Ligne 7:
 In this episode, we will also stay within the /proc file-system, and see how it can be used to communicate not only from the kernel to the user, but also the other way around, to input information or commands into the kernel. To illustrate this, I will be writing a simple module that creates a new entry /proc/hostname. When printed, this virtual file will give us our current system hostname. But since the /proc system is bi-directional, this same file can also be written to. When this is done, the text should be received by the kernel and the hostname re-set accordingly.** In this episode, we will also stay within the /proc file-system, and see how it can be used to communicate not only from the kernel to the user, but also the other way around, to input information or commands into the kernel. To illustrate this, I will be writing a simple module that creates a new entry /proc/hostname. When printed, this virtual file will give us our current system hostname. But since the /proc system is bi-directional, this same file can also be written to. When this is done, the text should be received by the kernel and the hostname re-set accordingly.**
  
-Dans le dernier épisode de notre série, nous avons introduit quelques petits changements dans le noyau Linux, en modifiant le code qui produit de l'information sur nos processeurs dans le système de fichiers virtuel /proc. Dans cet épisode final, nous allons essayer de produire du code entièrement nouveau, l'insérer dans le source du noyau, le compiler et exécuter le tout.+Dans le dernier épisode de notre série, nous avons introduit quelques petits changements dans le noyau Linux, en modifiant le code qui produit de l'information sur nos processeurs dans le système de fichiers virtuel /proc. Dans cet épisode final, nous allons essayer de produire du code entièrement nouveau, l'insérer dans le code source du noyau, le compiler et exécuter le tout.
  
 Pour faire cela, au lieu d'ajouter des fonctionnalités au noyau proprement dit, il semble plus facile de créer un nouveau module. C'est plus commode de ne pas avoir à vous soucier de casser le noyau complet et planter votre système - n'oubliez pas de le faire sur un ordinateur qui n'est pas en production ! - et le nouveau module peut simplement être chargé en mémoire puis retiré de nombreuses fois pendant le test. Compiler un seul module prend aussi beaucoup moins de temps qu'un noyau complet. Pour faire cela, au lieu d'ajouter des fonctionnalités au noyau proprement dit, il semble plus facile de créer un nouveau module. C'est plus commode de ne pas avoir à vous soucier de casser le noyau complet et planter votre système - n'oubliez pas de le faire sur un ordinateur qui n'est pas en production ! - et le nouveau module peut simplement être chargé en mémoire puis retiré de nombreuses fois pendant le test. Compiler un seul module prend aussi beaucoup moins de temps qu'un noyau complet.
Ligne 35: Ligne 35:
 • Finally, we should write any callback functions that are to be invoked when operations are executed on the /proc file.** • Finally, we should write any callback functions that are to be invoked when operations are executed on the /proc file.**
  
-CONSTRUCTION D'UN NOUVEAU MODULE+Construction d'un nouveau module
  
 Les étapes de base nécessaires pour construire un module du noyau sont les suivantes : Les étapes de base nécessaires pour construire un module du noyau sont les suivantes :
Ligne 113: Ligne 113:
 Lorsque le module est supprimé de la mémoire (voir en haut à droite), dans notre cas, très peu de ménage est nécessaire : il suffit de retirer l'entrée de /proc avec la fonction « proc_remove ». Comme auparavant, j'ai tendance à fournir beaucoup d'informations de journalisation pour faciliter le débogage. La plupart de ces informations devraient être retirées si ce module passait en production. Lorsque le module est supprimé de la mémoire (voir en haut à droite), dans notre cas, très peu de ménage est nécessaire : il suffit de retirer l'entrée de /proc avec la fonction « proc_remove ». Comme auparavant, j'ai tendance à fournir beaucoup d'informations de journalisation pour faciliter le débogage. La plupart de ces informations devraient être retirées si ce module passait en production.
  
-RÉPONSE AUX LECTURES ET ÉCRITURES DANS L'ENTRÉE DE /proc+Réponses aux lectures et écritures dans l'entrée de /proc
  
 Comme dans la partie précédente de cette série, la réponse quand un utilisateur lit l'entrée dans /proc est divisée en deux fonctions. La fonction « hostname_proc_open » est la routine de rappel fournie dans « hostname_proc_fops ». Mais elle n'a accès qu'au fichier d'entrées et aux pointeurs d'inodes de /proc. Pour faciliter l'accès, c'est mieux d'utiliser la fonction « single_open » qui fournit un pointeur « m » d'accès séquentiel aux fichiers qui peut ensuite être utilisé avec le « printf » pour écrire une sortie formatée dans le fichier. Le code est en bas à droite. Comme dans la partie précédente de cette série, la réponse quand un utilisateur lit l'entrée dans /proc est divisée en deux fonctions. La fonction « hostname_proc_open » est la routine de rappel fournie dans « hostname_proc_fops ». Mais elle n'a accès qu'au fichier d'entrées et aux pointeurs d'inodes de /proc. Pour faciliter l'accès, c'est mieux d'utiliser la fonction « single_open » qui fournit un pointeur « m » d'accès séquentiel aux fichiers qui peut ensuite être utilisé avec le « printf » pour écrire une sortie formatée dans le fichier. Le code est en bas à droite.
Ligne 132: Ligne 132:
 Responding to writing to our entry is a bit more complex. Data written by the user process will be accessible by the “user_data” pointer, and the number of characters available to use will be in “len”. But this data is within a user-space data structure, that must be copied into an equivalent kernel-space table before working on it.** Responding to writing to our entry is a bit more complex. Data written by the user process will be accessible by the “user_data” pointer, and the number of characters available to use will be in “len”. But this data is within a user-space data structure, that must be copied into an equivalent kernel-space table before working on it.**
  
-Notez l'utilisation du mécanisme « utsname » pour récupérer le nom d'hôte actuel de notre système. Comme indiqué dans la page de manuel uname, il n'est en fait pas nécessaire que hostname et  nodename soient identiques pour la conformité POSIX. Toutefois, cela semble être le cas pour Linux.+Notez l'utilisation du mécanisme « utsname » pour récupérer le nom d'hôte actuel de notre système. Comme indiqué dans la page de manuel uname, il n'est en fait pas nécessaire que hostname et nodename soient identiques pour la conformité POSIX. Toutefois, cela semble être le cas pour Linux.
  
 Avec cela en place, l'utilisateur sera en mesure de lire notre entrée dans /proc : Avec cela en place, l'utilisateur sera en mesure de lire notre entrée dans /proc :
Ligne 141: Ligne 141:
 le nom d'hôte du système est actuellement : alan-vaio le nom d'hôte du système est actuellement : alan-vaio
  
-écrivez un nouveau nom dans ce fichier pour modifier le nom d'hôte+écrivez un nouveau nom dans ce fichier pour modifier le nom d'hôte.
  
 Répondre à l'écriture dans notre entrée est un peu plus complexe. Les données écrites par le processus utilisateur seront accessibles par le pointeur « user_data », et le nombre de caractères disponibles sera dans « len ». Mais ces données sont dans une structure de données de l'espace utilisateur, qui doit être recopiée dans une table équivalente de l'espace noyau avant de travailler dessus. Répondre à l'écriture dans notre entrée est un peu plus complexe. Les données écrites par le processus utilisateur seront accessibles par le pointeur « user_data », et le nombre de caractères disponibles sera dans « len ». Mais ces données sont dans une structure de données de l'espace utilisateur, qui doit être recopiée dans une table équivalente de l'espace noyau avant de travailler dessus.
Ligne 177: Ligne 177:
 MODULE_DESCRIPTION("hostname module for Full Circle Magazine");** MODULE_DESCRIPTION("hostname module for Full Circle Magazine");**
  
-Une fois que ceci est en place, n'importe quel utilisateur pourra écrire un texte dans notre entrée et provoquer un changement de nom d'hôte :+Une fois ceci mis en place, n'importe quel utilisateur pourra écrire un texte dans notre entrée et provoquer un changement de nom d'hôte :
  
 echo "notre-nouveau-nom-d-hôte"> /proc/hostname echo "notre-nouveau-nom-d-hôte"> /proc/hostname
Ligne 185: Ligne 185:
 notre-nouveau-nom-d-hôte notre-nouveau-nom-d-hôte
  
-LE CODE SOURCE FINAL DU MODULE+Le code source final du module
  
 Notre module ne compilera pas encore, car j'ai laissé de côté toutes les instructions include qui sont nécessaires pour indiquer les prototypes de fonction. Elles doivent être insérées au début de notre fichier. C'est aussi une bonne idée de passer au compilateur des indications sur ce qu'est ce module, son auteur, et la licence sous laquelle il est distribué : Notre module ne compilera pas encore, car j'ai laissé de côté toutes les instructions include qui sont nécessaires pour indiquer les prototypes de fonction. Elles doivent être insérées au début de notre fichier. C'est aussi une bonne idée de passer au compilateur des indications sur ce qu'est ce module, son auteur, et la licence sous laquelle il est distribué :
Ligne 208: Ligne 208:
 Once we have all the bits and pieces, the final module code can be assembled as follows: http://pastebin.com/5d6KxCRZ** Once we have all the bits and pieces, the final module code can be assembled as follows: http://pastebin.com/5d6KxCRZ**
  
-Cette information sera insérée dans le module lui-mêmeet peut être consultée avec la commande utilitaire « module_info » :+Cette information sera insérée dans le module lui-même et peut être consultée avec la commande utilitaire « module_info » :
  
 $ modinfo hostname.ko $ modinfo hostname.ko
Ligne 235: Ligne 235:
 make modules** make modules**
  
-COMPILER ET INSTALLER LE NOUVEAU MODULE+Compiler et installer le nouveau module
  
 Lorsque notre nouveau module est compilé, il aura besoin d'être lié à des structures et des fonctions de données du noyau existant. La meilleure façon de le faire est d'intégrer le nouveau module dans la structure make existante du code source. Éditez le Makefile dans le même répertoire, et ajoutez : Lorsque notre nouveau module est compilé, il aura besoin d'être lié à des structures et des fonctions de données du noyau existant. La meilleure façon de le faire est d'intégrer le nouveau module dans la structure make existante du code source. Éditez le Makefile dans le même répertoire, et ajoutez :
Ligne 241: Ligne 241:
 obj-m := hostname.o obj-m := hostname.o
  
-Nous pouvons maintenant procéder à la compilation de tous les modules, y compris le notre, en remontant dans le répertoire racine du code source du noyau, et en exécutant make, avec les commandes :+Nous pouvons maintenant procéder à la compilation de tous les modules, y compris le nôtre, en remontant dans le répertoire racine du code source du noyau, et en exécutant make, avec les commandes :
  
 cd ../.. cd ../..
Ligne 321: Ligne 321:
 Kudos to everybody who has participated in developing the Linux kernel for giving it to the world; it is not said often enough.** Kudos to everybody who has participated in developing the Linux kernel for giving it to the world; it is not said often enough.**
  
-Nous sommes maintenant à la fin de notre série en six parties sur la compilation du noyau Linux. Modifier, compiler et installer un noyau est peut-être l'une des activités les plus exigeantes que nous pouvons faire sur notre système d'exploitation favori, mais c'est parfaitement réalisable avec un peu de patience et en traitant ce sujet d'une manière systématique. Bon, un peu d'entêtement peut également aider lorsque les choses ne se passent pas comme prévu les premières fois.+Nous sommes maintenant à la fin de notre série en six parties sur la compilation du noyau Linux. Modifier, compiler et installer un noyau est peut-être l'une des activités les plus exigeantes que nous pouvons faire sur notre système d'exploitation favori, mais c'est parfaitement réalisable avec un peu de patience et en le faisant d'une manière systématique. Bon, un peu d'entêtement peut également aider lorsque les choses ne se passent pas comme prévu les premières fois.
  
-En tout cas, le point principal que je voudrais souligner, c'est que cela peut être fait - non pas par des assistants informatiques et des pirates professionnels, mais par des gens « normaux »... à condition qu'ils choisissent de tenter le coup. Cela va certainement enrichir votre expérience, car vous pourriez finir par apprendre des choses sur votre ordinateur que vous n'aviez jamais soupçonnées. C'est ce qui m'est arrivé en préparant cette série.+En tout cas, le point principal que je voudrais souligner, c'est que cela peut être fait - non pas par des experts en informatique et des pirates professionnels, mais par des gens « normaux »... à condition qu'ils choisissent de tenter le coup. Cela va certainement enrichir votre expérience, car vous pourriez finir par apprendre des choses sur votre ordinateur que vous n'aviez jamais soupçonnées. C'est ce qui m'est arrivé en préparant cette série.
  
-Cela signifie aussi qu'un noyau open-source exécutant un système d'exploitation open-source a de réelles chances d'être vérifié par de nombreux yeux, et que des améliorations soient proposées et mises en œuvre quand c'est nécessaire. Bien que le lecteur puisse choisir de ne pas fouiller le noyau en personne, nous bénéficions tous de la possibilité réellement existante d'une plateforme informatique plus stable et à jour.+Cela signifie aussi qu'un noyau Open Source exécutant un système d'exploitation Open Source a de réelles chances d'être vérifié par de nombreux yeux, et que des améliorations soient proposées et mises en œuvre au besoin. Bien que le lecteur puisse choisir de ne pas fouiller le noyau en personne, grâce à l'existence même de cette possibilité, nous bénéficions tous d'une plateforme informatique plus stable et à jour.
  
 Bravo à tous ceux qui ont participé à l'élaboration du noyau Linux pour l'offrir au monde ; on ne le dit pas assez souvent. Bravo à tous ceux qui ont participé à l'élaboration du noyau Linux pour l'offrir au monde ; on ne le dit pas assez souvent.
  
issue93/labo_linux_1.1426497267.txt.gz · Dernière modification : 2015/03/16 10:14 de auntiee