Pagina 1 di 1

Aggiunta System Calls in MINIX

Inviato: dom 13 ago 2006, 10:46
da RobertoDG
Ciao a tutti. Qualcuno sa elencarmi i passaggi completi da eseguire all'interno del kernel di MINIX 3.1.2 per poterci aggiungere delle system call funzionanti?
Grazie :)

Inviato: lun 14 ago 2006, 14:13
da chrix

Codice: Seleziona tutto

realizzare una system call addizionale per minix
Il prototipo รจ 
int getpids(pid_t *current_pid, pid_t *parent_pid); 
Scrivere un programma di test, che verifica che la syscall funzioni. Inizialmente non compila. Il programma apre un albero di processi di 4 livelli e verifica il funzionamento di getpids() confrontando i risultati con getpid(2) e getppid(2). Per esempio: 
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <getpids.h>

#include <assert.h>
#include <stdio.h>

#define N 4

void assert_getpids_works(void) {
  pid_t expected_me = getpid();
  pid_t expected_parent = getppid();
  pid_t actual_me, actual_parent;

  int result = getpids(&actual_me, &actual_parent);
  assert(0 == result);
  assert(actual_me == expected_me);
  assert(actual_parent == expected_parent);
}

main(void) {
  int i;

  assert_getpids_works();

  for (i=0; i<N; i++) {
    if (0 == fork()) {
      assert_getpids_works();
      return 0;
    } else {
      int status;
      wait(&status);
    }
  }
  printf("OK\n");
  return 0;
}
Aggiungere src/include/getpids.h con il prototipo di getpids(). Installare gli header 
cd src/tools
make includes
Ricompilare il prog di test. Il programma compila, ma fallisce il link. 
Modificare lo header di sistema src/include/minix/callnr.h. 
Aggiungere il sorgente lato userspace in lib/other/_getpids.c, usando come modello lib/posix/_getpid.c . Inizialmente deve restituire dei numeri fasulli, tipo 999. Per esempio: 
#include <lib.h>
#include <getpids.h>

PUBLIC pid_t getpids(pid_t *current, pid_t *parent)
{
  *current = *parent = 999;
  return 0;
}
Aggiungere il nostro file a Makefile.in. Eseguire 
    make Makefile
    make
  Installare tutte le librerie 
cd src/lib
make all install
Verificare che il prog di test ora compila, ma le assert falliscono 
Modificare /usr/src/servers/pm/{proto.h,table.c,Makefile} 
Aggiungere un file sorgente a /usr/src/servers/pm; modificare il Makefile 
cd src/tools; make install 
occorre modificare anche servers/fs/table.c per tener conto della nostra nuova syscall 
Verificare che il programma di test ora funzioni correttamente