Le syscall est utilisé pour demander un service à partir du noyau. Pour MIPS, le numéro de service/code doit être transmis dans $v0 et les arguments sont passés dans quelques-uns des autres registres. Par exemple, pour imprimer nous pourrions faire:
li $v0, 1
add $a0, $t0, $zero
syscall
Dans ce cas, 1 est le code de service pour l'impression entier. La deuxième instruction exécute efficacement une copie de $t0 $a0, qui est désigné registre où l'argument est tenue ( dans ce cas, l'entier à être imprimé ). Une liste des services et des arguments correspondants: http://courses.missouristate.edu/KenVollmar/Mars/Help/SyscallHelp.html
Il devient beaucoup plus évident lorsque vous sortez le contexte d'un émulateur comme MARS ou SPIM où les appels système sont quelque peu artificielle. Sur une vraie machine MIPS, vous pouvez l'utiliser de contrôle de transfert du noyau d'invoquer une fonction spécifique.
Par exemple, c'est un programme "hello world" en MIPS 32 bits de l'assemblée pour une machine linux (je suis sûr à 95% que c'était sur un mipsel installer, non pas que cela importe beaucoup pour cette question)
# CS341L Fall 2008
# Lab Exercise #1
# Matthew J. Barrick <[email protected]>
#include <asm/regdef.h>
#include <sys/syscall.h>
.data
hello: .asciz "Hello World\n"
length: .word 12
.text
.globl main
.ent main
main:
li a0, 1
la a1, hello
lw a2, length
li v0, SYS_write
syscall
move v0, zero
jr ra
.end main
Ce qui correspond de très près à la C du code (si vous avez de la difficulté à suivre le MIPS de l'assemblée).
D'abord noter que les en-têtes sont inclus pour donner les registres des noms symboliques (asm/regdef.h) et un en-tête qui va tirer dans les noms symboliques pour les appels système (sys/syscall.h) si nous n'avons pas à consulter les appels par numéro. Les conventions pour la réalisation d'un système d'appel ici sont à peu près la même que l'appel d'une fonction, la charge d'un# registre avec des arguments, puis on charge le système d'appel nous voulons dans $v0 et invoquer syscall. SYS_write correspond à la base write(2) la fonction pour linux/unix (1 étant la norme).
Nous sommes donc dire que le noyau d'écrire pour le descripteur de fichier 1 (stdout), la chaîne bonjour, en utilisant des octets de longueur. Sur linux, vous pouvez voir les syscalls(2) pour tous les différents appels disponibles, mais ils correspondent assez bien les fonctions de base que le noyau offre et (g)de la libc soit enroule ou se construit à partir de programmes C/C++.
Linux (et la plupart des systèmes unix-aime le 4BSD route) ont une fonction syscall(2), qui est effectivement la même chose.
Une fois que vous commencez à faire des trucs plus complexe, vous allez trouver vous-même en enveloppant les syscall invoquant en fonctions pratiques, ou encore mieux, appeler le correspondant de la libc versions (étonnamment facile à faire, mais une autre discussion).
Le syscall est utilisé pour demander un service à partir du noyau. Pour MIPS, le numéro de service/code doit être transmis dans $v0 et les arguments sont passés dans quelques-uns des autres registres. Par exemple, pour imprimer nous pourrions faire:
Dans ce cas, 1 est le code de service pour l'impression entier. La deuxième instruction exécute efficacement une copie de $t0 $a0, qui est désigné registre où l'argument est tenue ( dans ce cas, l'entier à être imprimé ). Une liste des services et des arguments correspondants:
http://courses.missouristate.edu/KenVollmar/Mars/Help/SyscallHelp.html
OriginalL'auteur Mike Kwan
Il devient beaucoup plus évident lorsque vous sortez le contexte d'un émulateur comme MARS ou SPIM où les appels système sont quelque peu artificielle. Sur une vraie machine MIPS, vous pouvez l'utiliser de contrôle de transfert du noyau d'invoquer une fonction spécifique.
Par exemple, c'est un programme "hello world" en MIPS 32 bits de l'assemblée pour une machine linux (je suis sûr à 95% que c'était sur un mipsel installer, non pas que cela importe beaucoup pour cette question)
Ce qui correspond de très près à la C du code (si vous avez de la difficulté à suivre le MIPS de l'assemblée).
D'abord noter que les en-têtes sont inclus pour donner les registres des noms symboliques (asm/regdef.h) et un en-tête qui va tirer dans les noms symboliques pour les appels système (sys/syscall.h) si nous n'avons pas à consulter les appels par numéro. Les conventions pour la réalisation d'un système d'appel ici sont à peu près la même que l'appel d'une fonction, la charge d'un# registre avec des arguments, puis on charge le système d'appel nous voulons dans $v0 et invoquer syscall. SYS_write correspond à la base write(2) la fonction pour linux/unix (1 étant la norme).
Nous sommes donc dire que le noyau d'écrire pour le descripteur de fichier 1 (stdout), la chaîne bonjour, en utilisant des octets de longueur. Sur linux, vous pouvez voir les syscalls(2) pour tous les différents appels disponibles, mais ils correspondent assez bien les fonctions de base que le noyau offre et (g)de la libc soit enroule ou se construit à partir de programmes C/C++.
Linux (et la plupart des systèmes unix-aime le 4BSD route) ont une fonction syscall(2), qui est effectivement la même chose.
Une fois que vous commencez à faire des trucs plus complexe, vous allez trouver vous-même en enveloppant les syscall invoquant en fonctions pratiques, ou encore mieux, appeler le correspondant de la libc versions (étonnamment facile à faire, mais une autre discussion).
OriginalL'auteur D'Nabre