2010-05-03 22 views
10

Voglio solo chiedere, so che le chiamate di sistema standard in Linux vengono eseguite da istruzioni int che puntano nella tabella vettoriale di interrupt. Presumo che questo è simile su Windows. Ma come chiamate alcune routine di sistema specifiche di livello superiore? Ad esempio, come si dice a Windows di creare una finestra? So che questo è gestito dal codice della DLL, ma cosa è realmente accaduto a livello di assemblatore? La routine in dll chiama il software interrotto dall'istruzione int, oppure esiste un approccio diverso per gestirlo? Grazie.Chiamate di sistema su Windows

risposta

5

Effettuare una chiamata Win32 per creare una finestra non è realmente correlata a un interrupt. L'applicazione client è già collegata al file .dll che fornisce la chiamata che espone l'indirizzo per il linker da utilizzare. Poiché stai chiedendo la differenza nel meccanismo di chiamata, sto limitando la discussione qui a quelle chiamate Win32 che sono disponibili per qualsiasi applicazione al contrario delle chiamate a livello di kernel o dei driver di dispositivo. A livello di linguaggio assembly, sarebbe uguale a qualsiasi altra chiamata di funzione poiché la maggior parte delle chiamate Win32 sono chiamate a livello utente che effettuano internamente le chiamate necessarie al kernel. Il linker fornisce l'indirizzo della funzione Win32 come destinazione per una sorta di istruzione di ramificazione, le specifiche dipendono dal compilatore.

[Modifica] Sembra che tu abbia ragione sugli interrupt e sull'int. tabella vettoriale. CodeGuru ha un buon articolo con i dettagli del sistema operativo su come funzionano le chiamate del kernel NT. Collegamento:
http://www.codeguru.com/cpp/w-p/system/devicedriverdevelopment/article.php/c8035

+1

Sì, so che dll ha le chiamate necessarie all'interno, l'ho scritto. Ma in sostanza tutto ciò che chiedo è: la routine dll per disegnare un windows syscalls sotto forma di interrupt software, o, in caso contrario, come fa a dire a windows windows di creare una finestra? Per quanto ne so, non puoi passare dallo spazio in cui il tuo programma è in esecuzione in un altro modo rispetto all'istruzione int per il limitaion ringl. –

+0

b-gen-jack-o-neill: AFAIK il kernel non è responsabile della gestione delle finestre. –

+2

Sui processori più recenti, vengono utilizzate le istruzioni sysenter/sysexit invece di emettere un interrupt software con l'istruzione INT. Il concetto è lo stesso, è un modo per passare alla modalità kernel. Tuttavia, una finestra non è gestita nel kernel, non troverete una chiamata di sistema CreateWindow, ma è costruita su numerose altre chiamate di sistema, compresa la comunicazione con altri processi, come ad esempio un gestore di finestre – nos

3

L'API Win32 è un livello che viene eseguito in modalità utente (squillo 3). Windows utilizzato anche per supportare un livello API OS/2 e POSIX ma sono caduti in disuso e sono stati rimossi. Il window manager è puro codice in modalità utente, non sono coinvolte chiamate del kernel. Solo le chiamate API che utilizzano le risorse del kernel (CreateThread, VirtualAlloc, ecc.) Chiameranno nel sistema operativo "reale" (ntdll.dll) e trap nel ring 0 con un interrupt software (int 0x2e).

+2

Questa non è tutta la storia. Dal momento che NT4 il window manager è stato nel modello del kernel (win32k.sys) e ha un sacco di syscalls per chiamarlo. Ancor prima, viveva in CSRSS e dovevi richiamare il kernel per raggiungerlo (usando LPC), quindi c'era ancora una chiamata al kernel. Inoltre, Windows non ha usato int 0x2e per entrare in modalità kernel per un po '. Dipende dall'architettura in cui ti trovi, ma in genere ora usa sysenter per entrare in modalità kernel su x86. – Stewart

Problemi correlati