| 5 | | == Lezione 1: Introduzione == |
| 6 | | |
| 7 | | === Slide === |
| 8 | | |
| 9 | | * '''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]) |
| 10 | | * '''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]) |
| 11 | | |
| 12 | | |
| 13 | | === Programmi === |
| 14 | | |
| 15 | | * Accesso diretto alla macchina fisica export:trunk/mioboot-nobios-simple.asm |
| 16 | | [[IncludeSource(trunk/mioboot-nobios-simple.asm, line_numbers=0)]] |
| 17 | | |
| 18 | | * Uso dei servizi del BIOS export:trunk/mioboot.asm |
| 19 | | [[IncludeSource(trunk/mioboot.asm, line_numbers=0)]] |
| 20 | | |
| 21 | | {{{ |
| 22 | | #!sh |
| 23 | | nasm -l mioboot.lst -o mioboot.img mioboot.asm |
| 24 | | qemu mioboot.img |
| 25 | | # con qemu -d in_asm potete vedere (in /tmp/qemu.log) il codice eseguito dalla macchina virtuale: per la maggior parte istruzioni del BIOS |
| 26 | | }}} |
| 27 | | |
| 28 | | * Programma che esegue il codice letto da standard input export:trunk/exec.c |
| 29 | | [[IncludeSource(trunk/exec.c, line_numbers=0)]] |
| 30 | | |
| 31 | | |
| 32 | | {{{ |
| 33 | | gcc -o exec exec.c |
| 34 | | echo -ne "\xB8\x11\x22\x33\x44" | ./exec |
| 35 | | echo -n "ciao" | ./exec |
| 36 | | ... |
| 37 | | }}} |
| 38 | | |
| 39 | | === Link === |
| 40 | | |
| 41 | | * [http://nasm.sourceforge.org NASM ] |
| 42 | | * [http://www.drpaulcarter.com/pcasm/ PC Assembly Language, by Paul A. Carter] |
| 43 | | * [http://www.intel.com/products/processor/manuals/ Manuali Intel] |
| 44 | | * [http://fabrice.bellard.free.fr/qemu_0.10.0-1_i386.deb QEmu] |
| 45 | | * [http://homes.dico.unimi.it/sisop/qemu-0.9.0-win32.zip QEmu 0.9.0 per windows] |
| 46 | | * [http://www.coresystems.de/%7Epatrick/qemu-0.10.0-bin.zip QEmu 0.10.1 per Windows] |
| 47 | | * [http://homes.dico.unimi.it/sisop/qemu_0.10.0-1_i386.deb QEmu 0.10.1 per Linux (Debian & Ubuntu)] |
| 48 | | * [http://www.puredarwin.org/downloads/qemu-0.10.1.dmg QEmu 0.10.1 per Mac OS X] |
| 49 | | * [http://homes.dico.unimi.it/~sisop/qemu/minix3-full.qcow Immagine Qemu MINIX 3.1.2a con Vim, ssh, ecc.] |
| 50 | | |
| 51 | | ---- |
| 52 | | |
| 53 | | == Lezione 2 == |
| 54 | | |
| 55 | | === Slide === |
| 56 | | |
| 57 | | * '''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]) |
| 58 | | * '''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]) |
| 59 | | |
| 60 | | === Esercizi === |
| 61 | | |
| 62 | | ==== {{{fork}}} ==== |
| 63 | | |
| 64 | | * un programma che "forca" un nuovo processo export:trunk/fork.c |
| 65 | | [[IncludeSource(trunk/fork.c, line_numbers=0)]] |
| 66 | | |
| 67 | | * exit status export:trunk/exit.c |
| 68 | | [[IncludeSource(trunk/exit.c, line_numbers=0)]] |
| 69 | | |
| 70 | | |
| 71 | | ==== Esecuzione in sequenza e parallelo ==== |
| 72 | | |
| 73 | | * programma di prova export:trunk/hello.c |
| 74 | | [[IncludeSource(trunk/hello.c, line_numbers=0)]] |
| 75 | | |
| 76 | | |
| 77 | | |
| 78 | | {{{ |
| 79 | | #!sh |
| 80 | | # In sequenza |
| 81 | | ./hello ; ./hello |
| 82 | | # In parallelo |
| 83 | | ./hello & ./hello |
| 84 | | echo $? |
| 85 | | }}} |
| 86 | | |
| 87 | | ==== Cosa fa? ==== |
| 88 | | |
| 89 | | {{{ |
| 90 | | #!sh |
| 91 | | /usr/bin/touch piripacchio |
| 92 | | while /bin/ls piripacchio; do |
| 93 | | /usr/bin/sleep 2 |
| 94 | | /bin/echo ciao |
| 95 | | done & ( /usr/bin/sleep 10 ; /bin/rm piripacchio ) |
| 96 | | }}} |
| 97 | | |
| 98 | | Consultate il manuale! |
| 99 | | |
| 100 | | {{{ |
| 101 | | #!sh |
| 102 | | man man |
| 103 | | man touch |
| 104 | | man ls |
| 105 | | man 1 sleep # man 3 sleep è il manuale della funzione della libreria C |
| 106 | | man echo |
| 107 | | man rm |
| 108 | | }}} |
| 109 | | |
| 110 | | ==== Uso del {{{for}}} e {{{if}}} ==== |
| 111 | | |
| 112 | | {{{ |
| 113 | | #!sh |
| 114 | | for i in dog cat fish; do if ls /bin/$i; then echo Trovato $i; else echo $i non trovato; fi; done |
| 115 | | }}} |
| 116 | | |
| 117 | | {{{ |
| 118 | | #!sh |
| 119 | | man test |
| 120 | | for i in dog cat fish; do if test -f /bin/$i; then echo Trovato $i; else echo $i non trovato; fi; done |
| 121 | | }}} |
| 122 | | |
| 123 | | === Link === |
| 124 | | |
| 125 | | * [http://jrmiii.com/attachments/Vim.pdf Vi cheat sheet] |
| 126 | | * [http://tnerual.eriogerg.free.fr/vimqrc-it.pdf VIM: Scheda di riferimento rapido] |
| 127 | | * [http://homes.dico.unimi.it/~sisop/qemu/minix3-full.qcow Immagine Qemu MINIX 3.1.2a con Vim, ssh, ecc.] |
| 128 | | * [http://www.pluto.it/files/ildp/HOWTO/Bash-Prog-Intro-HOWTO/Bash-Prog-Intro-HOWTO.html BASH Programming -- Intoduction HOWTO] |
| 129 | | * [http://www.pluto.it/files/ildp/guide/abs/index.html Guida avanzata di scripting BASH] |
| 130 | | |
| 131 | | == Lezione 3 == |
| 132 | | |
| 133 | | === Slide === |
| 134 | | |
| 135 | | * '''Turno 1 (18 Marzo 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab03.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab03-handout.pdf Versione stampa]) |
| 136 | | * '''Turno 2 (20 Marzo 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab03b.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab03b-handout.pdf Versione stampa]) |
| 137 | | |
| 138 | | === Materiale === |
| 139 | | * [UnixShell UNIX Shell: kit di sopravvivenza (in aggiornamento)] |
| 140 | | |
| 141 | | * scrive su stdout(1) gli argomenti ricevuti sulla riga di comando export:trunk/stdout.c |
| 142 | | [[IncludeSource(trunk/stdout.c, line_numbers=0)]] |
| 143 | | |
| 144 | | * scrive su stdout(1)e stderr (2) gli argomenti ricevuti sulla riga di comando export:trunk/stdouterr.c |
| 145 | | [[IncludeSource(trunk/stdouterr.c, line_numbers=0)]] |
| 146 | | |
| 147 | | === Esercizi online con la shell === |
| 148 | | * [http://idea.sec.dico.unimi.it/~lorenzo/SisOp0809/ Esercizi online] |
| 149 | | |
| 150 | | == Lezione 4 == |
| 151 | | |
| 152 | | === Slide === |
| 153 | | |
| 154 | | * '''Turno 1 (25 Marzo 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab04.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab04-handout.pdf Versione stampa]) |
| 155 | | * '''Turno 2 (23 Marzo 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab04b.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab04b-handout.pdf Versione stampa]) |
| 156 | | |
| 157 | | === Programmi === |
| 158 | | |
| 159 | | ==== Esempi con la syscall `clone`, specifica di Linux ==== |
| 160 | | |
| 161 | | * Thread '''senza''' memoria condivisa export:trunk/threads-isolated.c |
| 162 | | [[IncludeSource(trunk/threads-isolated.c, line_numbers=0)]] |
| 163 | | |
| 164 | | * Thread '''con''' memoria condivisa export:trunk/threads-shared.c |
| 165 | | [[IncludeSource(trunk/threads-shared.c, line_numbers=0)]] |
| 166 | | |
| 167 | | * Thread '''con''' memoria condivisa, mutua esclusione ottenuta con Peterson export:trunk/threads-peterson.c |
| 168 | | [[IncludeSource(trunk/threads-peterson.c, line_numbers=0)]] |
| 169 | | |
| 170 | | * Thread '''con''' memoria condivisa, mutua esclusione con TSL export:trunk/threads-tsl.c export:trunk/enter.asm |
| 171 | | [[IncludeSource(trunk/threads-tsl.c, line_numbers=0)]] |
| 172 | | [[IncludeSource(trunk/enter.asm, line_numbers=0)]] |
| 173 | | |
| 174 | | {{{ |
| 175 | | #!sh |
| 176 | | nasm -felf enter.asm |
| 177 | | cc threads-tsl.c enter.o -o threads-tsl |
| 178 | | }}} |
| 179 | | |
| 180 | | * Thread '''con''' memoria condivisa, mutua esclusione ottenuta con semaforo export:trunk/threads-sem.c |
| 181 | | [[IncludeSource(trunk/threads-sem.c, line_numbers=0)]] |
| 182 | | |
| 183 | | {{{ |
| 184 | | #!sh |
| 185 | | cc -o threads-sem threads-sem.c -lrt |
| 186 | | }}} |
| 187 | | |
| 188 | | |
| 189 | | ==== Esempi in Java ==== |
| 190 | | |
| 191 | | * Creazione di thread export:trunk/Basic.java |
| 192 | | [[IncludeSource(trunk/Basic.java, line_numbers=0)]] |
| 193 | | |
| 194 | | * Memoria condivisa export:trunk/Shared.java |
| 195 | | [[IncludeSource(trunk/Shared.java, line_numbers=0)]] |
| 196 | | |
| 197 | | * Memoria condivisa, mutua esclusione ottenuta con `synchronized`, export:trunk/Shared2.java |
| 198 | | [[IncludeSource(trunk/Shared2.java, line_numbers=0)]] |
| 199 | | |
| 200 | | |
| 201 | | * Produttore e consumatore, export:trunk/PC.java |
| 202 | | [[IncludeSource(trunk/PC.java, line_numbers=0)]] |
| 203 | | |
| 204 | | |
| 205 | | * Produttore e consumatore con semafori export:trunk/PCSem.java |
| 206 | | [[IncludeSource(trunk/PCSem.java, line_numbers=0)]] |
| 207 | | |
| 208 | | * Produttore e consumatore con monitor export:trunk/PCMon.java |
| 209 | | [[IncludeSource(trunk/PCMon.java, line_numbers=0)]] |
| 210 | | |
| 211 | | == Lezione 5 == |
| 212 | | |
| 213 | | === Slide === |
| 214 | | |
| 215 | | ==== find, archivi, segnali ==== |
| 216 | | |
| 217 | | * '''Turno 1 (1 Aprile 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab05.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab05-handout.pdf Versione stampa]) |
| 218 | | |
| 219 | | ==== Concorrenza ==== |
| 220 | | |
| 221 | | * '''Turno 2 (3 Aprile 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab05b.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab05b-handout.pdf Versione stampa]) |
| 222 | | |
| 223 | | |
| 224 | | === Programmi === |
| 225 | | |
| 226 | | Vedi Lezione 4 -- Turno 1 |
| 227 | | |
| 228 | | |
| 229 | | == Lezione 6 == |
| 230 | | |
| 231 | | === Slide === |
| 232 | | |
| 233 | | ==== Assembly, primi esperimenti col kernel ==== |
| 234 | | |
| 235 | | * '''Turno 1 (8 Aprile 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab06.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab06-handout.pdf Versione stampa]) |
| 236 | | |
| 237 | | |
| 238 | | ==== Permessi, Make e primi esperimenti con il kernel ==== |
| 239 | | |
| 240 | | * '''Turno 2 (17 Aprile 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab06b.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab06b-handout.pdf Versione stampa]) |
| 241 | | |
| 242 | | === Altro materiale === |
| 243 | | |
| 244 | | * [http://a2.pluto.it/introduzione_al_linguaggio_c.htm Introduzione al linguaggio C] |
| 245 | | |
| 246 | | |
| 247 | | == Lezione 7 == |
| 248 | | |
| 249 | | === Slide === |
| 250 | | |
| 251 | | ==== Memorie di massa ==== |
| 252 | | |
| 253 | | * '''Turno 1 (22 Aprile 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab07.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab07-handout.pdf Versione stampa]) |
| 254 | | |
| 255 | | ==== System e kernel call ==== |
| 256 | | |
| 257 | | * '''Turno 2 (24 Aprile 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab07b.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab07b-handout.pdf Versione stampa]) |
| 258 | | |
| 259 | | * export:trunk/mykill.c |
| 260 | | [[IncludeSource(trunk/mykill.c, line_numbers=0)]] |
| 261 | | |
| 262 | | * export:trunk/mykill-raw1.c |
| 263 | | [[IncludeSource(trunk/mykill-raw1.c, line_numbers=0)]] |
| 264 | | |
| 265 | | * export:trunk/mykill-raw2.c |
| 266 | | [[IncludeSource(trunk/mykill-raw2.c, line_numbers=0)]] |
| 267 | | |
| 268 | | == Lezione 8: Memorie di massa e system call == |
| 269 | | |
| 270 | | === Slide === |
| 271 | | |
| 272 | | * '''Turno 1 (29 Aprile 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab08.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab08-handout.pdf Versione stampa]) |
| 273 | | * '''Turno 2 (8 Maggio 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab08b.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab08b-handout.pdf Versione stampa]) |
| 274 | | |
| 275 | | |
| 276 | | ==== Aggiunta di una system call a MINIX ==== |
| 277 | | |
| 278 | | |
| 279 | | * aggiunta della syscall {{{foo}}} diff:tags/minix-3.1.2a//tags/syscall-add-simple-foo |
| 280 | | [[IncludeSource(tags/syscall-add-simple-foo/test/testfoo.c, line_numbers=0)]] |
| 281 | | * aggiunta della syscall {{{foo}}} con un parametro intero diff:tags/syscall-add-simple-foo//tags/syscall-add-foo-with-arg |
| 282 | | [[IncludeSource(tags/syscall-add-foo-with-arg/test/testfoo.c, line_numbers=0)]] |
| 283 | | |
| 284 | | |
| 285 | | == Lezione 9 == |
| 286 | | |
| 287 | | === Slide === |
| 288 | | |
| 289 | | * '''Turno 1 (13 maggio 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab09.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab09-handout.pdf Versione stampa]) |
| 290 | | |
| 291 | | * '''Turno 2 (15 maggio 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab09b.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab09b-handout.pdf Versione stampa]) |
| 292 | | |
| 293 | | ==== Aggiunta di una system call a MINIX ==== |
| 294 | | |
| 295 | | * Aggiunta della syscall {{{foo}}} che stampa processi ready diff:tags/syscall-add-foo-with-arg//tags/syscall-add-foo-print-ready |
| 296 | | [[IncludeSource(tags/syscall-add-foo-print-ready/test/testfoo.c, line_numbers=0)]] |
| 297 | | |
| 298 | | === Aggiunta di un server === |
| 299 | | |
| 300 | | * [http://www.usenix.org/publications/login/2006-04/openpdfs/herder.pdf Articolo di riferimento] |
| 301 | | * Aggiunta di un server semaforo (singolo) diff:tags/minix-3.1.2a//tags/server-add-single-semaphore |
| 302 | | [[IncludeSource(tags/server-add-single-semaphore/test/testsema.c, line_numbers=0)]] |
| 303 | | |
| 304 | | == Lezione 10 == |
| 305 | | |
| 306 | | === Slide === |
| 307 | | |
| 308 | | * '''Turno 2 (22 maggio 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab10b.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab10b-handout.pdf Versione stampa]) |
| 309 | | |
| 310 | | ==== Aggiunta di una system call a MINIX ==== |
| 311 | | |
| 312 | | * Aggiunta di una syscall {{{chuid}}} che permette di modifcare il proprietario di un processo |
| 313 | | |
| 314 | | {{{ |
| 315 | | #!c |
| 316 | | PUBLIC int do_chuid() |
| 317 | | { |
| 318 | | int p, u; |
| 319 | | struct mproc *rmp; |
| 320 | | |
| 321 | | p = m_in.m1_i1; |
| 322 | | u = m_in.m1_i2; |
| 323 | | |
| 324 | | printf("PID: %d UID: %d\n", p, u); |
| 325 | | |
| 326 | | for (rmp = &mproc[0]; rmp < &mproc[NR_PROCS]; rmp++) { |
| 327 | | if (rmp->mp_pid == p) { |
| 328 | | printf("FOUND: %s\n", rmp->mp_name); |
| 329 | | printf("Switched UID from %d to %d\n", rmp->mp_realuid, u); |
| 330 | | rmp->mp_realuid = u; |
| 331 | | rmp->mp_effuid = u; |
| 332 | | break; |
| 333 | | } |
| 334 | | } |
| 335 | | } |
| 336 | | }}} |
| 337 | | |
| 338 | | == Lezione 11 == |
| 339 | | |
| 340 | | === Slide === |
| 341 | | |
| 342 | | * '''Turno 1 (3 giugno 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab11.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab11-handout.pdf Versione stampa]) |
| 343 | | * '''Turno 2 (27 maggio 2009)''': [http://homes.dico.unimi.it/sisop/lucidi0809/solab11b.pdf slide] ([http://homes.dico.unimi.it/sisop/lucidi0809/solab11b-handout.pdf Versione stampa]) |
| 344 | | |
| 345 | | ==== Aggiunta di un semaphore server a MINIX ==== |
| 346 | | |
| 347 | | Vedi materiale lezione 10 Turno 1. |
| 348 | | |
| 349 | | == Lezione 12 == |
| 350 | | |
| 351 | | === Esempi di esercizi d'esame === |
| 352 | | |
| 353 | | * Esempio partizionamento [http://homes.dico.unimi.it/sisop/lucidi0809/part.pdf Es. part] |
| 354 | | * Trovare l'utente col minor numero di file nel sistema |
| 355 | | |
| 356 | | |
| 357 | | {{{ |
| 358 | | #!sh |
| 359 | | set -x # debugging aid |
| 360 | | USERS=$(cut -f 3 -d : < /etc/passwd) |
| 361 | | NUMS= |
| 362 | | for u in $USERS; do |
| 363 | | N=$( (find /etc -user $u -type f | wc -l ) || echo 0 ) |
| 364 | | if test "x$NUMS" = "x"; then |
| 365 | | NUMS="$N" |
| 366 | | else |
| 367 | | NUMS="$NUMS:$N" |
| 368 | | fi |
| 369 | | done |
| 370 | | NUMS=$(echo $NUMS | tr -s) |
| 371 | | j=1 |
| 372 | | for i in $USERS; do |
| 373 | | echo $(cut -f 1,3 -d : < /etc/passwd | grep ":$i$"| cut -d : -f 1) \($i\):$(echo $NUMS | cut -d : -f $j) |
| 374 | | j=$(expr $j + 1) |
| 375 | | done | sort -b -r -t: -n +1 |
| 376 | | set +x |
| 377 | | }}} |
| 378 | | |
| 379 | | * Trovare l'utente col file piu' recente nel sistema |
| 380 | | * Elencare i tre utenti che hanno il maggior numero di file nel sistema |
| 381 | | * Trovare tutti i file col numero dispari di righe (quindi sono i file di testo) |
| 382 | | * Trovare tutti i file modificati di venerdi' (sia un venerdi' particolare che di venerdi' in generale) |
| 383 | | * Trovare tutti i link simbolici nel filesystem |
| 384 | | * Trovare tutti i file di testo che non siano script |
| 385 | | * Contare quanti file di manuale ci sono nel filesystem |
| 386 | | * A quante “pagine” (una pagina equivale a circa 1500 caratteri) corrispondono tutti i file di testo del filesystem? |
| 387 | | * Quali file ha modificato l'utente XY in una specifica data? |
| 388 | | * Quali file di testo ha modificato l'utente XY nell'ultimo anno? |
| 389 | | * Qual'e' l'utente che ha modificato piu' file nell'ultimo anno? |
| 390 | | * Calcolare il numero di righe totali che ha scritto sul filesystem un certo utente nell'ultimo mese |
| 391 | | * Calcolare il rapporto tra il numero di file nel filesystem (o in una directory specificata) e lo spazio occupato |
| 392 | | * Calcolare il rapporto tra il numero di file nel filesystem (o in una directory specificata) e lo spazio occupato ESCLUDENDO gli hardlink |
| 393 | | * Quanta memoria occupa il processo piu' grande? |