Ritorna indietro

Lezione 7.B - System Call MentOS

Pubblicato il 4/26/22 da – 444 parole

Preparazione per l’esercitazione

  1. Salva il tuo lavoro! Esempio: MentOS/src/process/scheduler_algorithm.c.
  2. Ripristina la repo di lavoro, riportandola allo stato originale con git reset --hard.
  3. Aggiorna la repo di lavoro con git pull
  4. Cambia branch di git utilizzando git checkout --track origin/feature/Feature-DeadlockEsercise.

System Call

Ingredienti

Gli ingredienti sono:

Per esempio:

Struttura delle cartelle per l’esercizio

inc/sys/unistd.h

src/libc/unistd/*.c

inc/system/syscall_types.h

Come funzionano su MentOS

Due esempi di system call

Preparare i registri è un’operazione semplice grazie ad alcune macro (DEF_SYSCALLN dove N è il numero di parametri da passare alle syscall).

Esempio con la open (3 parametri da passare):

int open(const char *pathname, int flags, mode_t mode) {
	ssize_t retval;
	DEFN_SYSCALL3(retval, __NR_open, pathname, flags, mode);
	if (retval < 0)
		errno = -retval, retval = -1;
	return retval;
}

Esempio con la close (1 parametro da passare):

int close(int fd) {
	int retval;
	DEFN_SYSCALL1(retval, __NR_close, fd);
	if (retval < 0)
		errno = -retval, retval = -1;
	return retval;
}

Come posso aggiungere una nuova system call a MentOS?

Assumiamo di avere le seguenti funzioni kernel-side implementate nei file inc/experimental/smart_sem_kernel.h,, src/experimental/smart_sem_kernel.c.

Assumiamo inoltre che abbiamo definito le seguenti funzioni user-side (ma vuote)

Per aggiungere nuove system call, dobbiamo eseguire i seguenti passaggi.

  1. Apri il file inc/system/syscall_types.h e scegli un numero per la tua system call: #define __NR_sem... 190
  2. Apri il file src/system/syscall.c e registra/associa la tua system call e il suo numero all’interno della system call table sys_call_table[__NR_sem_ ...] = (SystemCall)sys_sem_...;
  3. Apri il file src/experimental/smart_sem_user.c e riempi le system call definite a lato utente (prendendo ispirazioni con le altre system call definite a livello utente). Scrivi le system call utilizzando le macro!

Presta attenzione ai nomi delle funzioni che chiami! Il prefisso sys indica una syscall definita a lato kernel.