IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

KTHREAD, ETHREAD en Kernel-Land


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 125
    Points : 41
    Points
    41
    Par défaut KTHREAD, ETHREAD en Kernel-Land
    Bonjour, depuis quelques temps je suis plongé dans les entrailles de windows, mais je n'arrive à comprendre certaines choses (attention, post surtout destiné aux experts). Notamment, je me demande à quoi sert concrétement les structures kernel KTHREAD, ETHREAD dans le cas d'une exécution kernel-mode "only", j'entends par là, un driver par exemple. Puisque ces structures sont censées (d'après moi) décrirent des threads user-land après qu'il y ait eu passage en kernel-land (ex: lors d'un appel system) ; que sont'ils censés décrire lors d'exécution en kernel mode seulement (driver), puisqu'il n'y est plus question de thread user-land dès lors ?

    J'espère avoir été asse clair :s

    PS: sinon, que désigne-t-on exactement par Kernel Thread ? La continuation d'exécution d'un thread userland en mode kernel ?

    Merci

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par touronster Voir le message
    Puisque ces structures sont censées (d'après moi) décrirent des threads user-land après qu'il y ait eu passage en kernel-land (ex: lors d'un appel system) ;
    Non, chaque thread sous windows est représenté par une structure ETHREAD contenant l'ID processus, messages LPC, heures de créations etc + un champs pointant une structure KTHREAD contenant entre autre, tous les champs nécessaire à un basculement de contexte (adresse de base et supérieur de pile noyau, cumul des temps processeur, dispatcher, ordonancement...).
    Ainsi, quand basculement de contexte il y a, même d'un thread user à un thread user, la structure KTHREAD est mise à jour et il en va de même d'un thread noyau à un thread noyau.
    Cordialement.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  3. #3
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Bonjour,
    je ne pense pas que la gestion des processus (à ce niveau) soit influancé par la zone mémoire à partir duquel celui-ci est executé.
    Si on prend l'exemple "simple" d'un listage de processus, sans ETHREAD ni KTHREAD, pas d'accès à l'EPROCESS et donc tu brises la liste doublement chainée permettant de lister les processus.

    Après, je ne suis pas un pro ...
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 125
    Points : 41
    Points
    41
    Par défaut
    Ce qui m'intrigue c'est dans le cas d'un thread noyau, caractérisé notamment par sa structure KTHREAD, sur quoi pointe son champ TEB ?
    Un thread noyau possède aussi un TEB en user-land ?

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne suis pas expert de Windows en mode kernel, mais qu'appelles-tu exactement un thread noyau ?

    Est-ce simplement un thread qui ne passe jamais en mode User, ou y a-t-il vraiment des différences plus significatives ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 125
    Points : 41
    Points
    41
    Par défaut
    Je dirais simplement un thread qui ne passe jamais en mode User. C'est aussi assez flou pour moi, les threads noyau, pour ça que je demande quelques infos dessus. Parce que apparement tous les threads (user & noyau) possèdent un KTHREAD, et le champ TEB de KTHREAD pointe sur du userland, je me demandais alors si tout thread (user & noyau) possédait une structure TEB en userland ?

    Merci, je repasserais voir demain.

  7. #7
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Citation Envoyé par touronster Voir le message
    Parce que apparement tous les threads (user & noyau) possèdent un KTHREAD
    Oui c'est exact.

    et le champ TEB de KTHREAD pointe sur du userland
    Oui mais uniquement pour un thread créé en user-land.

    je me demandais alors si tout thread (user & noyau) possédait une structure TEB en userland ?
    Non ! Les threads créés depuis l'espace kernel ne peuvent avoir de TEB (PTEB = NULL).

    Il est extrêmement compliqué de créer un thread kernel (plus exactement : un thread créé depuis le kernel par un driver) qui va tourner dans le contexte du processus et avoir accès aux données du processus. Ne pas oublier que pour un thread, tout est une histoire de "contexte". Extrêmement compliqué pour la simple et bonne raison qu'il y a trop de chose à faire au niveau user land (allocation de la page du TEB, init du TEB, allocation de la pile du thread user-land, protection de la page de pile, initialisation du contexte (CONTEXT) du thread, etc.).

    Les worker threads kernel sont fait pour rester cantonnés au kernel et tourner dans le contexte "system" pas dans le contexte d'un processus.

    [edit]

    Tiens j'y pense, il existe bien une fonction qui fait tout cela (init d'un thread user-land depuis le kernel), mais... elle n'est pas exportée par le kernel : il s'agit de RtlCreateUserThread(). A voir pour ceux que ça pourrait intéresser.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 125
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par Neitsa Voir le message
    Bonjour,



    Oui c'est exact.



    Oui mais uniquement pour un thread créé en user-land.



    Non ! Les threads créés depuis l'espace kernel ne peuvent avoir de TEB (PTEB = NULL).

    Il est extrêmement compliqué de créer un thread kernel (plus exactement : un thread créé depuis le kernel par un driver) qui va tourner dans le contexte du processus et avoir accès aux données du processus. Ne pas oublier que pour un thread, tout est une histoire de "contexte". Extrêmement compliqué pour la simple et bonne raison qu'il y a trop de chose à faire au niveau user land (allocation de la page du TEB, init du TEB, allocation de la pile du thread user-land, protection de la page de pile, initialisation du contexte (CONTEXT) du thread, etc.).

    Les worker threads kernel sont fait pour rester cantonnés au kernel et tourner dans le contexte "system" pas dans le contexte d'un processus.

    [edit]

    Tiens j'y pense, il existe bien une fonction qui fait tout cela (init d'un thread user-land depuis le kernel), mais... elle n'est pas exportée par le kernel : il s'agit de RtlCreateUserThread(). A voir pour ceux que ça pourrait intéresser.
    Yep ! Merci

Discussions similaires

  1. Que pensez vous du nouveau kernel 2.6 ?
    Par GLDavid dans le forum Administration système
    Réponses: 58
    Dernier message: 02/08/2004, 15h45
  2. Quelles sont les distibutions avec le kernel 2.4.x.x?
    Par barucca dans le forum Administration système
    Réponses: 7
    Dernier message: 01/04/2004, 15h44
  3. Le kernel version 2.6.3-mdk mal reconnu
    Par christophe D dans le forum Administration système
    Réponses: 5
    Dernier message: 23/03/2004, 10h03
  4. Kernel panic
    Par GLDavid dans le forum Administration système
    Réponses: 5
    Dernier message: 12/03/2004, 22h11
  5. Upgrade kernel 2.4 vers 2.6 sur MDK9.2
    Par Sph@x dans le forum Administration système
    Réponses: 14
    Dernier message: 02/02/2004, 18h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo