2011-11-05 19 views
12

¿Puede alguien decirme/señalarme cualquier referencia a cómo agregar una llamada al sistema/utilidad en XV6¿Cómo puedo añadir una llamada al sistema/utilidad en xv6

búsqueda exhaustiva en Google era inútil y la piratería por las malas tampoco fue productivo hasta ahora.

el libro de referencia también no tienen ningún ejemplo del mundo hola a comenzar con cualquier ayuda muy apreciada

Respuesta

39

Para añadir una llamada al sistema que puede ser llamada en el caparazón de xv6, por lo que debiera algo con los cinco archivos

  • sysproc.c agregar la aplicación real de su método aquí
  • syscall.h definen la posición del vector llamada al sistema que se conectan a su aplicación
  • user.h definir la función que se puede llamar a través de la cáscara
  • syscall.c externa definir la función que conectan la carcasa y el núcleo, utilizar la posición definida en syscall.h para añadir la función para el vector de llamada al sistema
  • usys.S utilizar la macro para definir conectar la llamada del usuario a la función de llamada al sistema

  • defs.h añadir una declaración adelantada para su nueva llamada al sistema

  • sysfunc.h añadir el nuevo gestor de llamadas del sistema en este archivo también como "int sys_newsystemcall (void)"
+3

¿Qué hay de defs.h? –

+0

Usted es Reut, defs.h también es obligatorio. – itzhaki

5

Explicaré un ejemplo simple al agregar una llamada al sistema en xv6.

Supongamos que tiene que agregar una llamada al sistema para obtener el tamaño de espacio de direcciones del programa de usuario en ejecución. Puede nombrar su llamada al sistema como getmysize() y llamar a esta llamada del sistema desde un programa de usuario.

Puede escribir su programa de usuario de la siguiente manera. Deje que el nombre del programa sea myprog.c Supongo que sabe cómo agregar un programa de usuario a xv6. Así que me saltearé mencionar estos pasos aquí porque estará fuera del tema.

#include "types.h" 
#include "stat.h" 
#include "user.h" 

int main(void){ 
    printf(1,"The size of my address space is %d bytes\n", getmysize()); 
    exit(); 
} 

Este programa está escrito con el propósito de demostrar el funcionamiento de sólo la llamada del sistema.

Ahora agregaremos nuestra llamada al sistema a xv6.

Primero agregue la siguiente línea al final del archivo syscall.h.

#define SYS_getmysize 23 

Tenga en cuenta que el 23 aquí podría cambiar según el número proporcionado antes de la línea que va a agregar en el archivo. Es decir, si el número de llamada del sistema es 22 en la línea antes de la línea que va a agregar, su línea debería tener el número 23. Así de simple.

Ahora agregue las siguientes líneas al archivo syscall.c.

extern int sys_getmysize(void); 

y en el conjunto de llamadas al sistema, añada la siguiente línea en.

[SYS_getmysize] sys_getmysize, 

En el archivo sysproc.c, que es donde va la aplicación de la llamada al sistema si se trata de una llamada al sistema relacionada con el manejo del proceso o la administración de la memoria, realice la implementación de nuestra llamada al sistema de la siguiente manera.

int 
sys_getmysize(void) 
{ 
    return proc->sz; 
} 

Ahora en el usys.S archivo, agregue la línea,

SYSCALL(getmysize) 

A continuación, en el archivo user.h, añadir lo siguiente. Así es como su programa de usuario ve su llamada al sistema.

int getmysize(void); 

Ok. Ahora está listo para ejecutar su programa de usuario y ver cómo se ejecuta su llamada al sistema.

Cuando ejecuta myprog.c que llama a su llamada al sistema, el tamaño del espacio de direcciones de este mismo programa se devolverá de acuerdo con lo que hemos implementado aquí.

Cuestiones relacionadas