2010-05-03 7 views
10

Je veux juste demander, je sais que les appels système standart sous Linux sont effectués par une instruction int pointant vers la table des vecteurs d'interruption. Je suppose que c'est similaire sur Windows. Mais, comment appelez-vous certaines routines système spécifiques de niveau supérieur? Par exemple, comment dites-vous Windows pour créer une fenêtre? Je sais que ceci est géré par le code dans la DLL, mais qu'est-ce qui s'est réellement passé au niveau de l'assembleur-instruction? Est-ce que la routine dans dll appelle le logiciel interrompu par une instruction int, ou y at-il une approche différente pour gérer cela? Merci. Faire un appel Win32 pour créer une fenêtre n'est pas vraiment lié à une interruption.Les appels système sur Windows

Répondre

5

L'application cliente est déjà liée au fichier .dll qui fournit l'appel qui expose l'adresse à utiliser par le lieur. Puisque vous posez la question sur la différence dans le mécanisme d'appel, je limite la discussion ici aux appels Win32 qui sont disponibles pour n'importe quelle application par opposition aux appels au niveau du noyau ou aux pilotes de périphériques. Au niveau du langage assembleur, ce serait la même chose que n'importe quel autre appel de fonction puisque la plupart des appels Win32 sont des appels au niveau de l'utilisateur qui effectuent en interne les appels de noyau nécessaires. L'éditeur de liens fournit l'adresse de la fonction Win32 comme cible pour une sorte d'instruction de branchement, les spécificités dépendront du compilateur.

[Éditer] On dirait que vous avez raison sur les interruptions et les int. table de vecteur. CodeGuru a un bon article avec les détails du système d'exploitation sur le fonctionnement des appels du noyau NT. Lien:
http://www.codeguru.com/cpp/w-p/system/devicedriverdevelopment/article.php/c8035

+1

Oui, je sais que DLL a les appels nécessaires à l'intérieur, je l'ai écrit. Mais fondamentalement tout ce que je demande est: A la routine de dll pour dessiner un syscalls de Windows sous la forme d'interruptions de logiciel, ou, sinon, comment dit-il au noyau de Windows pour faire une fenêtre? Pour autant que je sache, vous ne pouvez pas passer de l'espace de votre programme à un autre moyen que celui de l'instruction int de la limite de l'anneau. –

+0

b-gen-jack-o-neill: AFAIK le noyau n'est pas responsable de la gestion des fenêtres. –

+2

Sur les nouveaux processeurs, les instructions sysenter/sysexit sont utilisées au lieu d'émettre une interruption logicielle avec l'instruction INT. Le concept est le même, c'est un moyen de passer en mode noyau. Cependant, une fenêtre n'est pas gérée dans le noyau, vous ne trouverez pas d'appel système CreateWindow, mais plutôt d'autres appels système, y compris la communication avec d'autres processus - comme un gestionnaire de fenêtres – nos

3

L'API Win32 est une couche qui s'exécute en mode utilisateur (anneau 3). Windows utilisait également une couche API OS/2 et POSIX, mais ils sont tombés en désuétude et ont été supprimés. Le gestionnaire de fenêtres est un code en mode utilisateur pur, aucun appel de noyau n'est impliqué. Seuls les appels d'API qui utilisent les ressources du noyau (CreateThread, VirtualAlloc, etc.) appellent le système d'exploitation "réel" (ntdll.dll) et piègent dans l'anneau 0 avec une interruption logicielle (int 0x2e).

+2

Ce n'est pas toute l'histoire. Depuis NT4 le gestionnaire de fenêtres a été dans le modèle de noyau (win32k.sys) et il a tout un tas de syscalls pour l'appeler. Même avant cela, il vivait dans CSRSS, et vous deviez appeler le noyau pour y accéder (en utilisant LPC) donc il y avait encore un appel de noyau impliqué. En outre, Windows n'a pas utilisé int 0x2e pour passer en mode noyau pendant un certain temps. Cela dépend de l'architecture sur laquelle vous êtes, mais généralement, maintenant, il utilise sysenter pour entrer en mode noyau sur x86. – Stewart

Questions connexes