Forum Linux.noyau de l'appel systeme au mode noyau

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
3
4
fév.
2019

Bonjour à tous,

voila quand je fais un appel systeme en C, mon code assembleur va placer dans un registre quel type d'appel systeme je fais, puis à l'instruction suivante lancer l'instruction (processeur x86) :
int 80h

quand le processeur voit cette instruction, il fait un saut en mémoire pour aller au niveau du code ou se trouve le noyau ? puis le code noyau fait son taff et met dans un registre la réponse de l'appel systeme qui était demandé. Il redonne la main au processus utilisateur, et le processus utilisateur va lire le registre ou se trouve la réponse ?

voila merci pour vos explications

  • # Ça n’a pas changé depuis…

    Posté par  . Évalué à 8.

    Salut,
    Ça fonctionne comme ça depuis les années 80 et probablement même avant.

    Quand tu fais l’instruction int 80h, tu déclenches une interruption logicielle. Le CPU va regarder la table d’interruption, et exécuter le code à l’adresse indiquée dans la table.
    C’est presque comme si tu appelais une fonction via un pointeur dans une globale. La principale différence, c’est que l’instruction int modifie les flags du CPU, et permet de sortir du mode utilisateur pour passer dans le mode superviseur. Il y a une instruction spéciale pour le retour qui restitue les flags du CPU.

    Comme il y a un unique point d’entrée, la première chose à faire et de savoir quel service tu veux utiliser. Le paramètre est (il me semble) dans le registe AX (EAX, RAX). En fonction du service, les autres paramètres sont rangé dans les autres registres.

    Si tu trouves des vieux livres sur le DOS et les PC d’avant. Ça te donnera une idée de ce qui se passe, à la protection mémoire et quelques autres trucs près.

  • # c'est quoi le noyau

    Posté par  . Évalué à 1.

    merci beaucoup pour ta réponse je comprend mieux.

    en faite le noyau c'est pas vraiment un processus, c'est juste des instructions qui sont en mémoire et dès qu'il y a une interruption ou un compteur qui se déclenche, il y a un saut d'adresse en ram qui correspond à l'interruption utilisé. Ca permet ainsi de simplifier le travail du developper car il ne touche pas aux périphériques. c'est bon ce que je dis ?

    Et donc tout le code du noyau est toujours en RAM ?

    • [^] # Re: c'est quoi le noyau

      Posté par  . Évalué à 2.

      Ce qu’on appelle noyau, c’est la partie du système d’exploitation qui gère la machine. Généralement, tout est en RAM. Certains driver peuvent être sur le disque dur et être chargés à la volée, comme un driver de tablette graphique.

      Le noyau gère ta RAM, l’organisation de tes disques, il ordonnance tes processus, gère les verrous, etc.

      Pour résumer, le noyau fait l’interface entre le logiciel et les composants de l’ordinateur.

      Tu devrais commencer par la gestion d’un ordinateur, le sujet est vaste, et il se complexifie au fil des années.

    • [^] # Re: c'est quoi le noyau

      Posté par  (Mastodon) . Évalué à 5.

      en faite le noyau c'est pas vraiment un processus

      A vérifier mais il me semble bien qu'il y a aussi des processus dans le noyau.

      Tapes un ps -ef et tu vas avoir une tartine de processus entre crochets, ils sont exécutés dans l'espace noyau.

      Chez moi (j'ai coupé, il y en a 165 !) :

      root         2     0  0 18:02 ?        00:00:00 [kthreadd]
      root         3     2  0 18:02 ?        00:00:00 [rcu_gp]
      root         4     2  0 18:02 ?        00:00:00 [rcu_par_gp]
      root         6     2  0 18:02 ?        00:00:00 [kworker/0:0H-kblockd]
      root         8     2  0 18:02 ?        00:00:00 [mm_percpu_wq]
      root         9     2  0 18:02 ?        00:00:00 [ksoftirqd/0]
      root        10     2  0 18:02 ?        00:00:00 [rcu_preempt]
      root        11     2  0 18:02 ?        00:00:00 [rcuc/0]
      root        12     2  0 18:02 ?        00:00:00 [rcub/0]
      ...
      

      En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

    • [^] # Re: c'est quoi le noyau

      Posté par  . Évalué à 4.

      en faite le noyau c'est pas vraiment un processus, c'est juste des instructions qui sont en mémoire

      Alors c'est pas vraiment un processus non, mais c'est pas non plus une simple "bibliothèque standard" inerte qui attend d'être appelée par le user-land.

      Tu as tout un tas de thread noyaux qui sont en charge de la gestion de ton système, le plus trivial à appréhender pour un novice étant l'ordonnanceur qui a la difficile tâche d'attribuer du temps de travail aux différents processus user-land.

      Pour te faire une idée, tout les processus nommés [k-qqchose] dans un ps aux sont en fait des threads kernels.

      • [^] # Re: c'est quoi le noyau

        Posté par  (site web personnel) . Évalué à 3.

        Tu as tout un tas de thread noyaux qui sont en charge de la gestion de ton système, le plus trivial à appréhender pour un novice étant l'ordonnanceur qui a la difficile tâche d'attribuer du temps de travail aux différents processus user-land.

        L'ordonnanceur du noyau n'est pas vraiment un processus non plus. Ce dernier est en général appelé par le processeur lui même à intervalle régulier via une interruption, elle même générée via un timer configuré par le noyau dans ce but.

        L'essentiel du travail du noyau est effectué par appel du matériel via une interruption (changer le processus à exécuter, lire les données venant du port Ethernet, etc.) ou par un des processus pour afficher quelque chose à l'écran, lire ou écrire quelque chose depuis l'espace de stockage, envoyer des données par le réseau, récupérer la date courante, etc.

        • [^] # Re: c'est quoi le noyau

          Posté par  . Évalué à 1.

          Merci Renault pour ta réponse, mais tu sembles dire que tout est géré par les interruptions via des timers ou des appels systemes, mais alors a quoi sert les processus kworker ?

          • [^] # Re: c'est quoi le noyau

            Posté par  . Évalué à 3.

            Quand on est sous IT (sous interruption), un certain nombres de choses sont bloqués, les interruptions moins prioritaire ne s’active plus, etc.
            Dans un système aussi complexe que les systèmes d’aujourd’hui Linux/Windows/Haïku/etc. On essaye de faire le moins de traitement possible sous IT. La solution en général, c’est de créer des threads légés noyau. Ces derniers tente de prendre un sémaphore de type mutex, et sont bloqués. Lors de l’arrivé d’une IT, le code de l’interruption va libérer le sémaphore et sortir. L’ordonnanceur va voir qu’une tâche très prioritaire vient d’être libéré et l’exécuter immédiatement.

            • [^] # Re: c'est quoi le noyau

              Posté par  . Évalué à 1.

              je ne sais pas si j'ai bien compris :
              Si plusieurs processus sont exécutés par les processeurs, les processus ne peuvent pas passer en meme temps en mode noyau, c'est chacun son tour ?

              • [^] # Re: c'est quoi le noyau

                Posté par  . Évalué à 3.

                Non, ils peuvent y aller ensemble, les parties qui ont besoin d’être exclusives sont protégées par des mutex.
                Je parlais des interruptions matérielles, c’est à dire, quand une carte d’extension à besoin de l’attention du CPU. Par exemple la réception d’un message réseau qui doit être transféré dans la RAM avant qu’un autre n’arrive.

                Pour le reste, beaucoup de chose vont dépendre de l’OS concerné. Il y a plein d’implémentation possible, en fonction du besoin de ton OS. Les OS généraliste sont réentrant, un petit OS dans l’embarqué ne le sera pas forcément.

                Après, je n’ai pas les compétences pour te détailler l’implémentation de ces mécanismes dans Linux.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.