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? |