= Laboratorio di Sistemi Operativi = [[TOC(noheading)]] == Lezione 1: Introduzione == === Slide === * '''Turno 1 (4 Marzo 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab01.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab01-handout.pdf Versione stampa]) * '''Turno 2 (6 Marzo 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab01b.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab01b-handout.pdf Versione stampa]) === Programmi === * Accesso diretto alla macchina fisica `mioboot-nobios-simple.asm` {{{ bits 16 ; 16 bit real mode org 0x7C00 ; origine indirizzo 0000:7C00 start: mov ax, 0xb800 ; text video memory mov ds, ax mov eax, 10 write: cmp eax, 0 jz end mov byte [eax], 'm' mov byte [eax+1], 0x0F ; attrib = white on black sub eax, 2 jmp write end: hlt times 510-($-$$) db 0 ; 0-padding dw 0xAA55 }}} {{{ #!sh nasm -l mioboot-nobios-simple.lst -o mioboot-nobios-simple.img mioboot-nobios-simple.asm qemu mioboot-nobios-simple.img }}} * Uso dei servizi del BIOS `mioboot.asm` {{{ bits 16 ; 16 bit real mode org 0x7C00 ; origine indirizzo 0000:7C00 start: cld ; clears direction flag (index regs incremented) mov si, boot call message working: mov si, work call message call waitenter jmp working message: lodsb ; carica un byte da [DS:SI] in AL e inc SI cmp al, 0 jz done mov ah, 0x0E ; write char to screen in text mode mov bx, 0 ; BH page number BL foreground color int 0x10 ; write AL to screen (BIOS) jmp message done: ret boot: db "Loading unuseful system...." , 10, 13, 0 work: db "I've done my unuseful stuff!" , 10, 13, 0 cont: db "Hit ENTER to continue...", 10, 13, 0 wow: db "Great! Hello world!" , 10, 13, 0 waitenter: mov si, cont call message mov ah, 0 int 0x16 ; Wait for keypress (BIOS) cmp al, 'm' jz egg cmp al, 'b' jz basic cmp al, 13 jnz waitenter ret egg: mov si, wow call message jmp waitenter basic: int 0x18 ; basic (BIOS) hlt times 510-($-$$) db 0 dw 0xAA55 }}} {{{ #!sh nasm -l mioboot.lst -o mioboot.img mioboot.asm qemu mioboot.img # con qemu -d in_asm potete vedere (in /tmp/qemu.log) il codice eseguito dalla macchina virtuale: per la maggior parte istruzioni del BIOS }}} * Programma che esegue il codice letto da standard input exec.c {{{ #!c #include int main() { unsigned char buf[1024]; void (*ptr)(); int n; unsigned int eax; // leggi il codice da eseguire da standard input n = read(0, buf, 1024); // forza il codice a ritornare dalla chiamata a funzione (0xC3 = ret) buf[n] = '\xc3'; // esegui il codice letto come se fosse una funzione ptr = (void(*)()) buf; ptr(); // stampa il valore del registro EAX __asm__("mov %%eax, %0" : "=m"(eax)); printf("EAX: %.8x\n", eax); return 0; } }}} {{{ gcc -o exec exec.c echo -ne "\xB8\x11\x22\x33\x44" | ./exec echo -n "ciao" | ./exec ... }}} === Link === * [http://nasm.sourceforge.org NASM ] * [http://www.drpaulcarter.com/pcasm/ PC Assembly Language, by Paul A. Carter] * [http://www.intel.com/products/processor/manuals/ Manuali Intel] * [http://fabrice.bellard.free.fr/qemu_0.10.0-1_i386.deb QEmu] * [http://homes.dico.unimi.it/sisop/qemu-0.9.0-win32.zip QEmu 0.9.0 per windows] * [http://homes.dico.unimi.it/sisop/qemu_0.10.0-1_i386.deb QEmu 0.10 per Linux (Debian & Ubuntu)] * [http://homes.dico.unimi.it/~sisop/qemu/minix3-full.qcow Immagine Qemu MINIX 3.1.2a con Vim, ssh, ecc.] ---- == Lezione 2 == === Slide === * '''Turno 1 (11 Marzo 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab02.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab02-handout.pdf Versione stampa]) * '''Turno 2 (13 Marzo 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab02b.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab02b-handout.pdf Versione stampa]) === Esercizi === ==== {{{fork}}} ==== {{{ #!c /* un programma che "forca" un nuovo processo */ #include #include #include int main(void){ int x = fork(); if (x < 0){ perror("Errore nella fork:"); exit(1); } else { if (x != 0){ while(1){ sleep(1); printf("Processo padre (Figlio: %d)\n", x); } } else { while(1) { printf("Processo figlio (%d)\n", x); sleep(1); } } } return 0; } /* da compilare con un comando del tipo 'cc -o prova prova.c' */ /* Per terminare Ctrl-C */ }}} ==== Exit status ==== {{{ #!c #include #include int main(int argc, char **argv) { int i; if (argc != 2) return -1; return atoi(argv[1]); } /* da compilare con un comando del tipo 'cc -o prova prova.c' */ /* Per verificare l'exit status: ./prova ; echo $? */ }}} ==== Esecuzione in sequenza e parallelo ==== {{{ #!c #include #include int main(void){ int i = 0; for (i=0; i<10; ++i){ sleep(1); printf("%d: %d\n", getpid(), i); } return 0; } }}} {{{ #!sh # In sequenza ./hello ; ./hello # In parallelo ./hello & ./hello echo $? }}} ==== Cosa fa? ==== {{{ #!sh /usr/bin/touch piripacchio while /bin/ls piripacchio; do /usr/bin/sleep 2 /bin/echo ciao done & ( /usr/bin/sleep 10 ; /bin/rm piripacchio ) }}} Consultate il manuale! {{{ #!sh man man man touch man ls man 1 sleep # man 3 sleep รจ il manuale della funzione della libreria C man echo man rm }}} ==== Uso del {{{for}}} e {{{if}}} ==== {{{ #!sh for i in dog cat fish; do if ls /bin/$i; then echo Trovato $i; else echo $i non trovato; fi; done }}} {{{ #!sh man test for i in dog cat fish; do if test -f /bin/$i; then echo Trovato $i; else echo $i non trovato; fi; done }}} === Link === * [http://jrmiii.com/attachments/Vim.pdf Vi cheat sheet] * [http://homes.dico.unimi.it/~sisop/qemu/minix3-full.qcow Immagine Qemu MINIX 3.1.2a con Vim, ssh, ecc.]