File: Unix-Internet-Fundamentals-HOWTO

package info (click to toggle)
doc-linux-it 2000.01-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 8,136 kB
  • ctags: 19
  • sloc: perl: 249; makefile: 50; sh: 42
file content (1254 lines) | stat: -rw-r--r-- 61,320 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
  The Unix and Internet Fundamentals HOWTO
  by Eric S. Raymond
  v1.4, 25 settembre 1999

  Questo documento descrive il funzionamento di base dei computer di
  classe PC, i sistemi operativi di tipo Unix e Internet usando un lin
  guaggio non troppo tecnico.  Traduzione a cura di Mirko Nasato,
  mn@altern.org.

  1.  Introduzione



  1.1.  Scopo di questo documento

  Questo documento vuole essere un aiuto per gli utenti di Linux e di
  Internet che stanno imparando dalla pratica. Anche se il ``learning by
  doing''  un ottimo metodo per acquisire abilit, a volte lascia
  determinate lacune nella conoscenza delle basi che possono rendere
  difficile il pensiero creativo o la risoluzione efficace dei problemi,
  a causa della mancanza di un chiaro modello mentale relativo a cosa
  sta succedendo nella realt.

  Cercher di descrivere con un linguaggio chiaro e semplice come
  funziona il tutto. La presentazione sar calibrata per persone che
  usano Unix o Linux su hardware di classe PC. Di solito far comunque
  riferimento semplicemente a `Unix', dato che la maggior parte delle
  descrizioni vale anche per altre piattaforme e varianti Unix.

  Assumer che stiate usando un PC Intel. I dettagli differiscono
  leggermente se lavorate su un Alpha o un PowerPC o qualche altro
  computer Unix, ma i concetti di base sono gli stessi.

  Non ripeter le cose, quindi dovrete stare attenti, ma ci significa
  anche che imparerete da ogni parola che leggete.  una buona idea
  limitarsi a dare una scorsa la prima volta che leggete; dovreste poi
  tornare indietro e rileggere alcune volte finch avrete digerito
  quello che avete imparato.

  Questo  un documento in evoluzione. Intendo continuare ad aggiungere
  sezioni in risposta agli stimoli dei lettori, pertanto periodicamente
  dovreste tornare a rivederlo.


  2.  Cosa c' di nuovo

  Nuovo nella 1.2: La sezione `Come il computer immagazzina dati in
  memoria'.  Nuovo nella 1.3: Le sezioni `Cosa succede al login?' e
  `Propriet dei file, permessi e sicurezza'.


  2.1.  Risorse correlate

  Se state leggendo questo documento al fine di imparare come diventare
  un hacker, dovreste anche leggere la How To Become A Hacker FAQ
  <http://www.tuxedo.org/~esr/faqs/hacker-howto.html>.  Contiene dei
  link ad altre risorse utili.


  2.2.  Nuove versioni di questo documento

  Nuove versioni dello Unix and Internet Fundamentals HOWTO verranno
  periodicamente postate su comp.os.linux.help, comp.os.linux.announce e
  news.answers <news:answers>.  Saranno anche depositate su vari siti
  WWW e FTP dedicati a Linux, inclusa la LDP home page.

  Potete vedere l'ultima versione sul World Wide Web all'URL
  <http://metalab.unc.edu/LDP/HOWTO/Unix-Internet-Fundamentals-
  HOWTO.html>.


  2.3.  Commenti, suggerimenti e correzioni

  Se avete domande o commenti su questo documento sentitevi liberi di
  contattare Eric S. Raymond all'indirizzo esr@thyrsus.com.  Qualsiasi
  suggerimento o critica sar il benvenuto. Apprezzo particolarmente
  link a spiegazioni pi dettagliate dei singoli concetti. Se trovate un
  errore per favore fatemelo sapere, in modo che lo possa correggere
  nella prossima versione. Grazie.


  3.  Anatomia di base del computer

  Dentro al vostro computer c' un chip processore che compie
  l'elaborazione vera e propria. C' una memoria interna (quella che la
  gente DOS/Windows chiama ``RAM'' e la gente Unix spesso chiama
  ``core''). Il processore e la memoria risiedono sulla scheda madre,
  che  il cuore del vostro computer.

  Il vostro computer ha uno schermo ed una tastiera. Ha dischi fissi e
  dischi floppy. Lo schermo e i dischi hanno schede controller che si
  attaccano sulla scheda madre e aiutano il computer a gestire questi
  dispositivi.  (La tastiera  troppo semplice per aver bisogno di una
  scheda separata; il controller  costruito all'interno della tastiera
  stessa.)

  Scenderemo pi avanti in alcuni dei dettagli relativi al funzionamento
  di questi dispositivi. Per ora, ecco alcune cose di base da tenere a
  mente sul come funzionano assieme:

  Tutte le parti interne del vostro computer sono collegate da un bus.
  Fisicamente, il bus  quello dove si attaccano le schede controller
  (la scheda video, il controller del disco, una scheda audio se ce
  l'avete). Il bus  l'autostrada dei dati tra il processore, lo
  schermo, il disco e tutto il resto.

  Il processore, che fa funzionare tutto il resto, in realt non  in
  grado di vedere direttamente nessuno degli altri pezzi: deve
  comunicare con loro attraverso il bus. L'unico sottosistema al quale
  ha accesso veramente rapido, immediato,  la memoria (core). Perch i
  programmi siano eseguiti, dunque, devono essere in memoria.

  Quando il vostro computer legge un programma o dei dati dal disco in
  effetti succede che il processore usa il bus per spedire una richiesta
  di lettura disco al controller del disco. Dopo un po' di tempo il
  controller del disco usa il bus per segnalare al computer che ha letto
  i dati e li ha messi in una certa locazione di memoria. Il processore
  pu allora usare il bus per guardare in quella memoria.

  Anche la tastiera e lo schermo comunicano con il processore attraverso
  il bus, ma in modi pi semplici. Ne discuteremo pi avanti. Per ora,
  ne sapete abbastanza per capire cosa succede quando accendete il
  vostro computer.


  4.  Cosa succede quando si accende un computer?

  Un computer senza un programma in esecuzione  soltanto un ammasso
  inerte di componenti elettronici. La prima cosa che un computer deve
  fare quando viene acceso  far partire un programma speciale chiamato
  sistema operativo. Il compito del sistema operativo  aiutare gli
  altri programmi del computer a funzionare, gestendo gli intricati
  dettagli relativi al controllo dell'hardware del computer.

  Il processo di avvio del sistema operativo si chiama boot (in origine
  era bootstrap e alludeva alla difficolt di tirarsi su da solo, ``by
  your bootstraps'').  Il vostro computer sa come avviarsi perch le
  istruzioni per il boot sono incorporate in uno dei suoi chip, il BIOS
  (Basic Input/Output System).

  Il chip BIOS gli dice di cercare uno speciale programma chiamato boot
  loader (quello di Linux si chiama LILO) che si trova in un posto
  predefinito del disco fisso con numero pi basso (il disco di avvio).
  Il compito del boot loader  far partire il sistema operativo vero e
  proprio.

  Per compiere quest'ultima operazione il loader cerca un kernel, lo
  carica in memoria e lo fa partire. Quando avviate Linux e vedete
  "LILO" sullo schermo, seguito da una riga di puntini, vuol dire che
  sta caricando il kernel. (Ogni puntino significa che ha caricato un
  altro blocco disco di codice kernel).

  (Vi potreste chiedere come mai il BIOS non carica il kernel
  direttamente: perch questo processo a due stadi con il boot loader?
  Beh, il BIOS non  molto intelligente. In effetti  proprio stupido, e
  Linux non lo usa pi dopo la fase di avvio. Fu scritto in origine per
  i primitivi PC a 8 bit con dischi poco capienti e proprio non riesce
  ad accedere ad una parte abbastanza grande del disco per caricare
  direttamente il kernel. La fase del boot loader consente anche di far
  partire diversi sistemi operativi da diversi posti del vostro disco,
  nella improbabile circostanza che Unix non vi soddisfi a sufficienza.)

  Dopo essere partito, il kernel si guarda in giro, trova il resto
  dell'hardware e si prepara a far girare i programmi. Fa tutto questo
  guardando non nelle ordinarie locazioni di memoria ma piuttosto alle
  porte I/O, speciali indirizzi bus che probabilmente hanno schede
  controller di dispositivi che sono in ascolto in attesa di comandi. Il
  kernel non cerca a caso; ha molta conoscenza innata su cosa 
  probabile trovare dove, e su come i controller rispondono se sono
  presenti. Questo processo si chiama autorilevamento.

  La maggior parte dei messaggi che vedete durante la fase di avvio sono
  del kernel che fa l'autorilevamento del vostro hardware attraverso le
  porte I/O, riconosce cosa ha a sua disposizione e si adatta al vostro
  computer. Il kernel di Linux  estremamente bravo in questo, meglio
  della maggior parte degli altri Unix e molto meglio del DOS o di
  Windows. Infatti, molti linuxiani della prima ora pensano che
  l'intelligenza del rilevamento all'avvio di Linux (che lo rende
  relativamente facile da installare) sia stata una delle principali
  ragioni che lo hanno fatto sfondare dal mucchio di esperimenti di Unix
  liberi, attraendo una massa critica di utenti.

  Ma avere il kernel del tutto caricato e funzionante non  la fine del
  processo di boot; ne  solo il primo stadio (a volte chiamato run
  level 1, livello di esecuzione 1).

  Il prossimo passo del kernel  assicurarsi che i vostri dischi siano a
  posto. I file system dei dischi sono fragili: se vengono danneggiati
  da un malfunzionamento hardware o da un'improvvisa mancanza di
  elettricit, ci sono buoni motivi per compiere alcune operazioni di
  riaggiustamento prima che il vostro Unix sia tutto a posto. Parleremo
  pi approfonditamente di questo pi avanti, a proposito di ``come i
  file system si possono danneggiare''.

  Il passo successivo del kernel  far partire diversi demoni. Un demone
  (o daemon)  un programma quale uno spooler di stampa, un programma
  che attende di ricevere posta in arrivo oppure un server WWW che
  rimane latente in sottofondo, aspettando qualcosa da fare. Questi
  programmi speciali devono spesso coordinare diverse richieste che
  rischiano di confliggere. Sono demoni perch spesso  pi facile
  scrivere un programma che gira costantemente e viene a conoscenza di
  tutte le richieste piuttosto che cercare di assicurarsi che un gruppo
  di copie (che girano tutte contemporaneamente, con ciascuna che
  processa una richiesta) non si ostacolino a vicenda.  La particolare
  serie di demoni che il vostro sistema fa partire pu variare, ma quasi
  certamente include uno spooler di stampa (un demone che fa da
  `portinaio' per la vostra stampante).

  Una volta che tutti i demoni sono avviati ci troviamo al run level 2.
  Il prossimo passo  prepararsi per gli utenti. Il kernel fa partire
  una copia di un programma chiamato getty per controllare la vostra
  console (e forse altre copie per controllare le porte seriali dial-
  in). Questo programma  quello che emette il prompt login alla vostra
  console. Siamo ora al run level 3, pronti per fare il log in e
  lanciare i programmi.


  5.  Cosa succede al login?

  Quando fate il login (date un nome e la password) vi identificate a
  getty e al computer. Parte allora un altro programma chiamato
  (ovviamente) login, che compie qualche operazione di servizio e poi fa
  partire un interprete di comandi, la shell. (S, getty e login
  potrebbero essere un solo programma. Sono separati per motivi storici
  che qui non vale la pena approfondire.)

  Ecco qualche nozione in pi su cosa fa il sistema prima di darvi una
  shell; vi servir per capire meglio la parte successiva sui permessi
  dei file. Vi identificate dando un nome di login e una password. Quel
  nome di login viene controllato in un file chiamato /etc/password, che
   una sequenza di linee ciascuna delle quali descrive un account
  utente.

  Uno di questi campi  una versione crittata della password
  dell'account. Quella che voi digitate come password di account viene
  crittata esattamente nello stesso modo e il programma login verifica
  che le due corrispondano. La sicurezza di questo metodo dipende dal
  fatto che, se  facile passare dalla vostra password in chiaro alla
  versione crittata,  molto difficile fare il contrario. Perci, anche
  se qualcuno riuscisse a vedere la versione crittata della vostra
  password, non sarebbe in grado di usare il vostro account (questo
  significa anche che, se dimenticate la vostra password, non c' modo
  di recuperarla ma si pu solo cambiarla con una nuova).

  Una volta che avete effettuato con successo il login, avete tutti i
  privilegi associati all'account individuale che state usando. Potete
  anche essere riconosciuti come parte di un gruppo. Un gruppo  una
  collezione di utenti alla quale viene dato un nome, messa in piedi
  dall'amministratore di sistema. I gruppi possono avere privilegi
  indipendenti dai privilegi dei loro membri. Un utente pu far parte di
  pi gruppi (per maggiori dettagli su come funzionano i privilegi in
  Unix, v. la successiva sezione sulla ``Propriet dei file, permessi e
  sicurezza'').

  (Notate che anche se di solito ci si riferisce agli utenti ed ai
  gruppi usando dei nomi, internamente vengono memorizzati come ID
  numerici. Il file delle password associa i nomi dei gruppi agli ID
  numerici di gruppo. I comandi che si occupano di account e gruppi
  effettuano automaticamente la conversione.)

  La vostra voce di account contiene anche la home directory, il posto
  del file system di Unix dove si trovano i vostri file personali.
  Infine, la voce di account imposta anche la vostra shell, l'interprete
  di comandi che login fa partire per accettare i vostri comandi.
  6.  Cosa succede quando si eseguono i programmi dalla shell?

  La shell normale vi presenta il prompt '$' che vedete dopo il login (a
  meno che non lo abbiate personalizzato). Non parleremo della sintassi
  della shell e delle cose semplici che potete vedere da soli sullo
  schermo; daremo piuttosto uno sguardo dietro le quinte a quello che
  succede dal punto di vista del computer.

  Dopo la fase di avvio e prima che sia eseguito un programma, potete
  pensare al vostro computer come ad un contenitore di un repertorio di
  processi che stanno tutti aspettando qualcosa da fare. Stanno tutti
  aspettando degli eventi. Un evento pu essere voi che premete un tasto
  o muovete il mouse. Oppure, se il vostro computer  collegato ad una
  rete, un evento pu essere un pacchetto di dati che arriva lungo
  quella rete.

  Il kernel  uno di questi processi.  uno speciale, perch controlla
  quando gli altri processi utente possono girare ed  normalmente
  l'unico processo con accesso diretto all'hardware del computer.
  Infatti, i processi utente devono fare richiesta al kernel quando
  vogliono ottenere un input dalla tastiera, scrivere sullo schermo,
  leggere o scrivere su disco o fare qualsiasi altra cosa che non sia
  macinare bit in memoria. Queste richieste sono note come chiamate di
  sistema.

  Normalmente tutto l'I/O passa attraverso il kernel, cos quest'ultimo
  pu organizzare le operazioni e impedire che i processi si ostacolino
  a vicenda. Alcuni processi utente speciali hanno il permesso di
  aggirare il kernel, di solito per ottenere accesso diretto alle porte
  I/O. I server X (i programmi che gestiscono le richieste degli altri
  programmi di generare grafica sullo schermo, sulla maggior parte dei
  computer Unix) sono i pi comuni esempi al riguardo. Ma non siamo
  ancora arrivati ad un server X; state guardando il prompt della shell
  su una console a caratteri.

  La shell  solo un processo utente e neppure uno tanto speciale.
  Attende che voi digitiate qualcosa, ascoltando (attraverso il kernel)
  sulle porte I/O della tastiera. Come il kernel vede che avete digitato
  qualcosa lo visualizza sullo schermo e poi lo passa alla shell. Quando
  il kernel vede un `Invio' passa la vostra linea di testo alla shell.
  La shell tenta di interpretare questo testo come se si trattasse di
  comandi.

  Diciamo che digitate `ls' e Invio per invocare il programma Unix che
  lista le directory. La shell applica le sue regole incorporate per
  indovinare che volete lanciare il comando eseguibile nel file
  `/bin/ls'. Fa una chiamata di sistema chiedendo al kernel di far
  partire /bin/ls come un nuovo processo figlio e di dargli accesso allo
  schermo e alla tastiera attraverso il kernel. Poi la shell va a
  dormire, aspettando che finisca.

  Quando /bin/ls ha finito dice al kernel che ha terminato emettendo una
  chiamata di sistema exit. Il kernel allora sveglia la shell e le dice
  che pu riprendere a girare. La shell emette un altro prompt e attende
  un'altra linea di input.

  Tuttavia (supponiamo che stiate listando una directory molto lunga)
  potrebbero succedere altre cose mentre `ls'  in esecuzione.  Potreste
  passare su un'altra console virtuale, fare il login di l e iniziare
  una partita a Quake, per esempio. Oppure immaginate di essere
  collegati a Internet. Il vostro computer potrebbe spedire o ricevere
  posta mentre /bin/ls  in esecuzione.




  7.  Come funzionano i dispositivi di input e gli interrupt?

  La tastiera  un dispositivo di input molto semplice: semplice perch
  genera piccole quantit di dati molto lentamente (per gli standard di
  un computer). Quando premete o rilasciate un tasto, il valore di
  questo evento viene segnalato attraverso il cavo della tastiera per
  far scattare un interrupt hardware.

   compito del sistema operativo stare attento a questi interrupt. Per
  ogni possibile tipo di interrupt c' un gestore dell'interrupt, una
  parte del sistema operativo che immagazzina i dati ad esso associati
  (come il valore del vostro premere/rilasciare il tasto) finch pu
  essere processato.

  Quello che effettivamente fa il gestore dell'interrupt della vostra
  tastiera  mettere il valore del tasto in un'area di sistema vicino al
  fondo della memoria. L rimane a disposizione per ispezione quando il
  sistema operativo passa il controllo al programma che ritiene stia
  attualmente leggendo dalla tastiera.

  Dispositivi di input pi complessi come i dischi o le schede di rete
  funzionano in modo simile. Sopra abbiamo fatto il caso di un
  controller del disco che usa il bus per segnalare che una richiesta
  disco  stata ultimata. In realt succede che il disco fa scattare un
  interrupt. Il gestore dell'interrupt del disco copia poi in memoria i
  dati ottenuti, ad uso successivo da parte del programma che aveva
  fatto la richiesta.

  Ad ogni tipo di interrupt  associato un livello di priorit. Gli
  interrupt con priorit pi bassa (come gli eventi della tastiera)
  devono dare la precedenza agli interrupt con priorit pi alta (come i
  tick dell'orologio o gli eventi del disco). Unix  progettato per dare
  alta priorit al tipo di eventi che necessitano di essere processati
  rapidamente, in modo da mantenere fluida la risposta del computer.

  Tra i messaggi d'avvio del vostro SO potete vedere dei riferimenti a
  numeri di IRQ. Forse sapete, senza capirne esattamente il perch, che
  uno dei modi pi comuni di configurare male l'hardware  avere due
  dispositivi diversi che cercano di usare lo stesso IRQ.

  Ecco la spiegazione. IRQ  l'abbreviazione di "Interrupt Request"
  (richiesta di interrupt). Il sistema operativo ha bisogno di sapere al
  momento dell'avvio quali interrupt numerati verranno usati da ciascun
  dispositivo hardware, in modo da poter associare a ciascuno il gestore
  appropriato. Se due dispositivi diversi cercano di usare lo stesso IRQ
  a volte gli interrupt verranno notificati al gestore sbagliato. Questo
  di solito provocher quantomeno il blocco del dispositivo, ma pu a
  volte confondere il SO a tal punto da farlo diventare instabile oppure
  mandarlo in crash.


  8.  Come fa il computer a fare diverse cose contemporaneamente?

  Non lo fa, in realt. I computer possono svolgere soltanto un task (o
  processo) alla volta. Ma un computer pu cambiare task molto
  rapidamente e indurre i lenti esseri umani a pensare che sta facendo
  diverse cose contemporaneamente. Questo viene chiamato timesharing
  (condivisione di tempo).

  Uno dei compiti del kernel  gestire il timesharing. Ha una parte
  chiamata scheduler (pianificatore) che contiene informazioni relative
  a tutti gli altri processi (a parte il kernel) del vostro repertorio.
  Ogni sessantesimo di secondo nel kernel fa scattare un timer e viene
  generato un interrupt di orologio. Lo scheduler ferma qualunque
  processo sia attualmente in esecuzione, lo sospende sul posto e passa
  il controllo ad un altro processo.
  Un sessantesimo di secondo pu non sembrare una grande quantit di
  tempo. Ma per i microprocessori odierni  sufficiente per eseguire
  decine di migliaia di istruzioni macchina, che si possono tradurre in
  una gran mole di lavoro. Quindi anche se ci sono molti processi
  ciascuno di essi pu fare molte cose nella porzione di tempo a sua
  disposizione.

  In pratica non sempre un programma ottiene la sua intera porzione di
  tempo. Se scatta un interrupt da un dispositivo I/O il kernel ferma
  effettivamente il task corrente, esegue il gestore dell'interrupt e
  poi ritorna al task corrente. Una tempesta di interrupt ad alta
  priorit pu scombinare il normale funzionamento dei processi; questo
  fenomeno viene chiamato thrashing e per fortuna  molto difficile da
  indurre negli Unix moderni.

  Infatti la velocit dei programmi solo molto di rado  limitata dalla
  quantit di tempo macchina a loro disposizione (ci sono alcune
  eccezioni a questa regola, quali il suono o la generazione di grafica
  3D). Molto pi spesso dei ritardi si generano quando il programma deve
  attendere dei dati da un disco o da una connessione di rete.

  Un sistema operativo che pu di norma gestire pi processi
  simultaneamente  detto "multitasking". La famiglia di sistemi
  operativi Unix  stata progettata fin dall'inizio per il multitasking
  e lo fa molto bene, in modo molto pi efficace rispetto a Windows o al
  Mac OS ai quali il multitasking  stato appiccicato a posteriori in
  seguito ad un ripensamento e lo fanno in modo piuttosto povero. Il
  multitasking efficiente ed affidabile costituisce buona parte di ci
  che rende Linux superiore per le applicazioni di rete, le
  comunicazioni e i servizi Web.


  9.  Come fa il computer a evitare che i processi si intralcino tra
  loro?

  Lo scheduler del kernel si prende cura di dividere il tempo tra i
  processi. Il vostro sistema operativo deve dividere tra i processi
  anche lo spazio, per evitare che non sconfinino oltre la porzione di
  memoria loro assegnata. Le operazioni compiute dal sistema operativo
  per risolvere questo problema si chiamano gestione della memoria.

  Ogni processo del vostro repertorio ha la propria area di memoria
  core, come luogo dal quale eseguire il proprio codice e dove
  immagazzinare le variabili e i risultati. Potete pensare a questo
  insieme come formato da un segmento codice, di sola lettura (che
  contiene le istruzioni del processo) e da un segmento dati (che
  contiene tutte le variabili immagazzinate dal processo). Il segmento
  dati  sempre unico per ogni processo, mentre nel caso due processi
  usino lo stesso codice Unix automaticamente fa in modo che condividano
  un unico segmento codice, come misura di efficienza.

  L'efficienza  importante, perch la memoria core  costosa. A volte
  non ne avete abbastanza per contenere per intero tutti i programmi che
  il computer sta eseguendo, specialmente se usate un grosso programma
  quale un server X. Per ovviare a questo problema Unix usa una
  strategia chiamata memoria virtuale. Non cerca di tenere in core tutti
  i dati ed il codice di un processo. Tiene piuttosto caricato solo un
  working set relativamente piccolo; il resto dello stato del processo
  viene lasciato in uno speciale spazio swap sul vostro disco fisso.

  Come i processi sono in esecuzione Unix tenta di anticipare i
  cambiamenti del working set per avere in memoria solo le parti che
  servono davvero. Riuscirci in modo efficace  ingegnoso e complesso,
  pertanto non cercher di descriverlo tutto qui, ma si basa sul fatto
  che il codice e i riferimenti ai dati tendono a comparire a gruppi, ed
   probabile che un nuovo gruppo si colleghi a luoghi vicini a quelli
  di uno precedente. Quindi se Unix tiene caricati i dati ed il codice
  usati pi di frequente (o di recente) di solito riuscir a risparmiare
  del tempo.

  Notate che in passato quel "A volte" di due paragrafi fa era un "Quasi
  sempre", perch la dimensione della memoria era tipicamente ridotta
  rispetto alla dimensione dei programmi in esecuzione, quindi il
  ricorso allo swap era frequente. Oggi la memoria  molto meno costosa
  e persino i computer di fascia bassa ne hanno parecchia. Sui moderni
  computer monoutente con 64MB di memoria e oltre  possibile eseguire X
  ed un tipico insieme di programmi senza neppure ricorrere allo swap.

  Anche in questa felice situazione la parte del sistema operativo
  chiamata gestore della memoria mantiene un importante ruolo da
  svolgere. Deve garantire che i programmi possano modificare soltanto
  il proprio segmento dati; deve cio impedire che del codice difettoso
  o malizioso in un programma rovini i dati di altri programmi. A questo
  scopo tiene una tabella dei segmenti dati e codice. La tabella 
  aggiornata non appena un processo richiede pi memoria oppure libera
  memoria (quest'ultimo caso ricorre di solito all'uscita dal
  programma).

  Questa tabella  usata per passare dei comandi a una parte
  specializzata dell'hardware sottostante chiamata MMU o unit di
  gestione della memoria. I processori moderni hanno MMU incorporate. La
  MMU ha la peculiare capacit di porre dei delimitatori attorno alle
  aree di memoria, in modo che un riferimento che sconfina venga
  rifiutato e faccia scattare uno speciale interrupt.

  Se avete mai visto un messaggio del tipo "Segmentation fault", "core
  dumped" o qualcosa del genere, questo  esattamente quello che 
  successo: un tentativo da parte del programma in esecuzione di
  accedere alla memoria al di fuori dal proprio segmento ha fatto
  scattare un interrupt fatale. Questo rivela un bug nel codice del
  programma; il core dump (scarico della memoria) che lascia dietro di
  s costituisce una informazione diagnostica volta ad aiutare il
  programmatore nell'individuazione del problema.


  10.  Come fa il computer a immagazzinare le cose in memoria?

  Probabilmente sapete che nel computer tutto viene immagazzinato come
  serie di bit (binary digits, cifre binarie; potete pensarle come molti
  piccoli interruttori on-off). Qui spiegheremo come vengono usati quei
  bit per rappresentare le lettere ed i numeri che il vostro computer
  sta macinando.

  Prima di arrivare a questo, dovete fare la conoscenza della dimensione
  di parola (word size) del vostro computer. La dimensione di parola 
  la dimensione preferita dal computer per muovere in giro unit di
  informazione; dal punto di vista tecnico  la capacit dei registri
  del processore, che sono i contenitori usati dal processore per fare
  calcoli aritmetici e logici. Quando leggete di computer con certe
  dimensioni di bit (ad esempio ``32-bit'' o ``64-bit''), si riferiscono
  a questo.

  La maggior parte dei computer (compresi 386, 486, Pentium e Pentium
  II) hanno una word size di 32 bit. I vecchi 286 avevano una dimensione
  di parola di 16 bit. I mainframe vecchio stile spesso usavano parole
  di 36-bit. Alcuni processori (come l'Alpha prodotto da quella che era
  DEC ed ora  Compaq) hanno parole di 64-bit. Parole di 64-bit
  diverranno pi comuni nei prossimi cinque anni; Intel ha in progetto
  la sostituzione del Pentium II con un chip a 64-bit chiamato `Merced'.

  Il computer vede la memoria core come una sequenza di parole numerate
  da zero ad un qualche valore elevato che dipende dalla quantit della
  vostra memoria. Quel valore  limitato dalla dimensione di parola, che
  nei vecchi 286 costringeva a dolorose acrobazie per accedere a grandi
  quantit di memoria. Non li descriver qui; fanno ancora venire gli
  incubi ai vecchi programmatori.


  10.1.  Numeri

  I numeri vengono rappresentati o come parole o come coppie di parole,
  a seconda della dimensione di parola del processore. Una parola per
  una macchina a 32-bit  la dimensione pi comune.

  L'aritmetica dei numeri si avvicina ma non coincide con la matematica
  a base due. Il bit di ordine inferiore vale 1, il successivo 2, poi 4
  e cos via come nella binaria pura. Ma i numeri con segno vengono
  rappresentati con notazione complemento a due. Il bit di ordine
  superiore  il bit di segno che rende la quantit negativa e ogni
  numero negativo si pu ottenere dal corrispondente valore positivo
  invertendo tutti i bit. Questo  il motivo per cui gli interi su una
  macchina a 32-bit vanno in una scala da -2^31 + 1 a 2^31 - 1 (dove ^ 
  l'operazione di elevamento a potenza, 2^3 = 8). Quel 32esimo bit viene
  usato per il segno.

  Alcuni linguaggi per computer danno accesso alla aritmetica senza
  segno che  quella liscia a base 2 con i soli numeri positivi e lo
  zero.

  La maggior parte dei processori e alcuni linguaggi possono gestire
  numeri in virgola mobile (capacit incorporata in tutti i processori
  recenti). I numeri in virgola mobile (floating-point) offrono una
  scala di valori molto pi ampia rispetto agli interi e consentono di
  esprimere frazioni. I modi nei quali questo viene fatto variano e sono
  piuttosto complessi per essere discussi in dettaglio, ma l'idea
  generale  molto simile a quella della cosiddetta `notazione
  scientifica', dove si pu scrivere (per esempio) 1.234 * 10^23; la
  codifica del numero  divisa in una mantissa (1.234) e una parte
  esponente (23) per il moltiplicatore a potenze di dieci.


  10.2.  Caratteri

  I caratteri sono normalmente rappresentati come stringhe di sette bit
  ciascuno in una codifica chiamata ASCII (American Standard Code for
  Information Interchange). Sui computer moderni, ciascuno dei 128
  caratteri ASCII sta nei sette bit inferiori di un otteto di 8-bit; gli
  otteti sono impacchettati in parole di memoria cosicch (ad esempio)
  una stringa di sei caratteri occupa solo due parole di memoria. Per
  vedere una tabella dei codici ASCII, digitate `man 7 ascii' al vostro
  prompt Unix.

  Il paragrafo precedente  fuorviante per due motivi. Quello meno
  importante  che il termine `otteto'  formalmente corretto ma
  raramente usato in concreto; la maggior parte delle persone si
  riferisce ad un otteto come ad un byte e si aspetta che i byte siano
  di otto bit. In senso proprio, il termine `byte'  pi generale;
  c'erano, ad esempio, macchine a 36-bit con byte da 9-bit (anche se
  probabilmente non ce ne saranno mai pi).

  Il motivo pi importante  che non tutto il mondo usa l'ASCII.
  Infatti, la maggior parte del mondo non pu -- ASCII, anche se va bene
  per l'inglese americano, non ha molti caratteri accentati e altri
  segni speciali che servono agli utenti di altre lingue. Anche
  l'inglese britannico si trova in difficolt per la mancanza del
  simbolo della sterlina.


  Ci sono stati numerosi tentativi di rimediare a questo problema. Tutti
  si servono del bit in pi che l'ASCII non utilizza, rendendolo la met
  inferiore di un insieme di 256 caratteri. Il pi diffuso  l'insieme
  di caratteri noto come `Latin-1' (pi formalmente ISO 8859-1). Questo
   l'insieme di caratteri predefinito per Linux, l'HTML e X. Microsoft
  Windows usa una variante del Latin-1 che aggiunge alcuni caratteri
  come le doppie apici in posti lasciati inutilizzati dal Latin-1 per
  ragioni storiche (per un resoconto dei problemi che questo causa, v.
  demoroniser <http://www.fourmilab.ch/webtools/demoroniser/>).

  Il Latin-1 gestisce la maggior parte delle lingue europee, inclusi:
  inglese, francese, tedesco, spagnolo, italiano, olandese, norvegese,
  svedese, danese. Tuttavia, neppure questo  sufficiente ed esiste
  tutta una serie di insiemi di caratteri da Latin-2 a -9 per gestire
  lingue quali greco, arabo, ebreo e serbo-croato. Per maggiori
  dettagli, v. ISO alphabet soup
  <http://www.utia.cas.cz/user_data/vs/documents/ISO-8859-X-
  charsets.html>.

  La soluzione definitiva  uno standard possente chiamato Unicode (e il
  suo gemello identico ISO/IEC 10646-1:1993). L'Unicode  identico al
  Latin-1 nelle sue 256 caselle inferiori. In aggiunta, su uno spazio di
  16-bit, include greco, cirillico, armeno, ebreo, arabo, devanagari,
  bengalese, gurmukhi, gujarati, oriya, tamil, telugu, kannada,
  malayalam, thai, lao, georgiano, tibetano, giapponese kana, l'insieme
  completo del coreano hangul moderno e un insieme unificato di
  ideogrammi cinesi giapponesi e coreani (CJK). Per maggiori dettagli,
  v. Unicode Home Page <http://www.unicode.org/>.


  11.  Come fa il computer a immagazzinare le cose su disco?

  Quando leggete un disco fisso su Unix vedete un albero di nomi di file
  e directory. Normalmente non avrete bisogno di andare oltre, ma pu
  essere utile avere maggiori dettagli se vi capita un crash del disco e
  dovete cercare di salvare dei file. Sfortunatamente non c' un buon
  modo per descrivere l'organizzazione del disco dal livello dei file in
  gi, quindi dovr partire dall'hardware e risalire.


  11.1.  Struttura di basso livello del disco e del file system

  La superficie del vostro disco, dove vengono immagazzinati i dati, si
  divide in una sorta di bersaglio per il tiro a freccette: in tracce
  circolari che sono poi `affettate' in settori. Dal momento che le
  tracce vicino al bordo esterno hanno area maggiore di quelle vicino al
  centro, le tracce esterne hanno pi settori rispetto a quelle interne.
  Ogni settore (o blocco disco) ha la stessa dimensione, che sui moderni
  Unix  generalmente pari a 1K binario (1024 parole da 8 bit). Ogni
  blocco  individuato da un indirizzo univoco, il numero di blocco
  disco.

  Unix divide il disco in partizioni disco. Ogni partizione  formata da
  una serie continua di blocchi che vengono usati separatamente da
  quelli delle altre partizioni, come file system oppure come spazio
  swap. La partizione con numero pi basso viene spesso trattata in modo
  speciale, come partizione di avvio dove si pu mettere un kernel da
  far partire.

  Ogni partizione  alternativamente uno spazio swap, usato per
  implementare ``memoria virtuale'', oppure un file system, usato per
  contenere i file. Le partizioni swap sono trattate proprio come una
  sequenza lineare di blocchi. I file system, invece, hanno bisogno di
  un modo per associare i nomi dei file alle sequenze di blocchi disco.
  Dal momento che la dimensione dei file aumenta, diminuisce, si
  modifica nel tempo, i blocchi dati di un file non saranno una sequenza
  lineare ma potranno essere disseminati su tutta la sua partizione
  (dipende da dove il sistema operativo riesce a trovare un blocco
  libero quando gliene serve uno).


  11.2.  Nomi dei file e delle directory

  All'interno di ciascun file system la corrispondenza tra i nomi e i
  blocchi viene assicurata da una struttura chiamata inode. C' un
  gruppo di questi elementi vicino al ``fondo'' (i blocchi a numerazione
  pi bassa) di ciascun file system (quelli pi bassi in assoluto sono
  usati a fini di manutenzione e di etichettatura, non ne parleremo
  qui). Ogni inode individua un file. I blocchi dati dei file si trovano
  sotto gli inode.

  Ciascun inode contiene una lista dei numeri di blocco disco relativi
  al file che individua. (Questa  una mezza verit, corretta solo per i
  file piccoli, ma il resto dei dettagli non  importante qui.)  Notate
  che l'inode non contiene il nome del file.

  I nomi dei file si trovano nelle strutture delle directory. Una
  struttura della directory associa i nomi ai numeri inode. Ecco perch,
  su Unix, un file pu avere pi nomi reali (o hard link); sono soltanto
  diverse voci di directory che puntano allo stesso inode.


  11.3.  Mount point

  Nel caso pi semplice, tutto il vostro file system Unix si trova su di
  una sola partizione disco. Anche se questa situazione si ritrova in
  qualche piccolo sistema Unix personale,  inusuale. Pi tipicamente
  esso  suddiviso tra pi partizioni disco, magari su diversi dischi
  fisici. Cos, per esempio, il vostro sistema pu avere una piccola
  partizione dove alloggia il kernel, una un po' pi grande dove si
  trovano i programmi di utilit del SO ed una molto pi grande dove ci
  sono le directory personali degli utenti.

  La sola partizione alla quale avrete accesso subito dopo l'avvio del
  sistema  la partizione root, che  (quasi sempre) quella dalla quale
  avete fatto il boot. Essa contiene la root directory del file system,
  il nodo superiore dal quale dipende tutto il resto.

  Le altre partizioni del sistema devono collegarsi a questa root
  affinch tutto il vostro file system multipartizione sia accessibile.
  Circa a met del processo di avvio, il vostro Unix render accessibili
  queste partizioni non root. Dovr montare ciascuna di esse su una
  directory della partizione root.

  Per esempio, se avete una directory chiamata `/usr', si tratta
  probabilmente di un mount point per una partizione che contiene molti
  programmi che fanno parte della distribuzione standard del vostro Unix
  ma che non sono necessari durante l'avvio iniziale.


  11.4.  Come viene cercato un file

  Ora possiamo guardare al file system dall'alto al basso. Ecco cosa
  succede quando aprite un file (quale, ad esempio,
  /home/esr/WWW/ldp/fundamentals.sgml):

  Il kernel parte dalla radice del vostro file system Unix (dalla
  partizione root). Cerca una directory chiamata `home'. Di solito
  `home'  un mount point per una grande partizione utente da qualche
  altra parte, cos va di l. Nella struttura della directory di livello
  pi alto di quella partizione utente cerca poi una voce chiamata `esr'
  e ne estrae un numero di inode. Va a quell'inode, vede che si tratta
  di una struttura di directory e cerca `WWW'. Estraendo quell'inode, va
  alla corrispondente sottodirectory e cerca `ldp'. Questo lo porta ad
  un altro inode di directory ancora. Aprendolo, trova il numero inode
  di `fundamentals.sgml'. Questo inode non  una directory, ma contiene
  piuttosto la lista dei blocchi disco associati al file.


  11.5.  Propriet dei file, permessi e sicurezza

  Per evitare che i programmi, in modo accidentale o malizioso, accedano
  a dati cui non dovrebbero accedere, Unix usa la caratteristica dei
  permessi. Questi furono originariamente ideati per gestire il
  timesharing proteggendo gli utenti multipli su uno stesso computer gli
  uni dagli altri, ancora ai tempi in cui Unix girava principalmente su
  costosi minicomputer condivisi.

  Per capire i permessi dei file, dovete richiamare alla mente la nostra
  descrizione degli utenti e dei gruppi dalla sezione ``Cosa succede al
  login?''. Ogni file  di propriet di un utente e di un gruppo. Questi
  sono inizialmente quelli del creatore del file; possono essere
  cambiati con i programmi chown(1) e chgrp(1).

  I permessi di base che possono essere associati con un file sono
  `lettura' (permesso di leggere i dati in esso contenuti), `scrittura'
  (permesso di modificarlo) e `esecuzione' (permesso di lanciarlo come
  programma). Ogni file ha tre serie di permessi: uno per l'utente che
  ne  proprietario, uno per qualunque utente del suo gruppo
  proprietario e uno per tutti gli altri. I `privilegi' che avete quando
  fate il login sono solo la possibilit di leggere, scrivere ed
  eseguire quei file per i quali i bit di permesso corrispondono al
  vostro user ID o uno dei gruppi cui appartenete.

  Per vedere come questi possono interagire e come lo Unix li mostra,
  guardiamo un listato di file di un ipotetico sistema Unix. Eccone uno:



       snark:~$ ls -l notes
       -rw-r--r--   1 esr      users         2993 Jun 17 11:00 notes




  Si tratta di un ordinario file di dati. Il listato ci dice che 
  posseduto dall'utente `esr' ed  stato creato di propriet del gruppo
  `users'. Probabilmente il computer pone tutti gli utenti ordinari in
  questo gruppo in modo predefinito; altri gruppi usati di frequente su
  macchine condivise sono `staff', `admin' o `wheel' (per ovvie ragioni,
  i gruppi non sono molto importanti sulle workstation per utente
  singolo o sui PC). Il vostro Unix potrebbe usare un diverso gruppo
  predefinito, magari uno con lo stesso nome del vostro user ID.

  La stringa `-rw-r--r--' rappresenta i bit di permesso per il file. Il
  primissimo trattino  la posizione del bit di directory; mostrerebbe
  `d' se il file fosse una directory. Dopo di questo, i primi tre posti
  sono i permessi utente, i secondi tre i permessi di gruppo e i terzi i
  permessi per gli altri (spesso chiamati `mondo' o `world'). Per questo
  file, l'utente proprietario `esr' pu leggere o scrivere il file, le
  altre persone nel gruppo `users' possono leggerlo e tutti gli altri al
  mondo possono leggerlo. Si tratta di un insieme di permessi tipico per
  un ordinario file di dati.

  Ora diamo un'occhiata ad un file con permessi differenti. Questo file
   GCC, il compilatore C GNU.


       snark:~$ ls -l /usr/bin/gcc
       -rwxr-xr-x   3 root     bin         64796 Mar 21 16:41 /usr/bin/gcc




  Questo file appartiene ad un utente chiamato `root' e ad un gruppo
  chiamato `bin'; pu essere scritto (modificato) solo da root, ma letto
  od eseguito da chiunque. Si tratta di propriet e insieme di permessi
  tipici per un comando pre-installato. Il gruppo `bin' esiste in alcuni
  Unix per raggruppare i comandi di sistema (il nome  un residuo
  storico, abbreviazione di `binari'). Il vostro Unix potrebbe invece
  usare un gruppo `root' (che non  proprio la stessa cosa dell'utente
  `root'!).

  L'utente `root'  il nome convenzionale per lo user ID di numero 0,
  uno speciale, privilegiato account che pu disporre di tutti i
  privilegi. Accedere come root  utile ma pericoloso: un errore di
  digitazione pu cancellare fondamentali file di sistema che lo stesso
  comando digitato da un utente ordinario non riuscirebbe ad intaccare.

  Dal momento che l'account root  cos potente, il suo accesso dovrebbe
  essere custodito con molta cura. La vostra password di root 
  l'informazione di sicurezza pi critica e fondamentale del vostro
  sistema ed  ci che qualunque cracker e intruso che vi dia la caccia
  mira ad ottenere.

  (Riguardo alle password: non scrivetele -- e non scegliete una
  password che possa essere facilmente indovinata, come il nome della
  vostra ragazza/o. Questa  una cattiva prassi incredibilmente comune
  che aiuta moltissimo i cracker...)

  Ora vediamo un terzo caso:



       snark:~$ ls -ld ~
       drwxr-xr-x  89 esr      users          9216 Jun 27 11:29 /home2/esr
       snark:~$




  Questo file  una directory (notate la `d' nella prima casella dei
  permessi). Vediamo che pu essere scritto solo da esr, ma letto ed
  eseguito da chiunque altro. I permessi vengono interpretati in maniera
  speciale quando riguardano una directory: regolano l'accesso ai file
  contenuti nella directory.

  Il permesso di lettura di una directory  semplice: significa soltanto
  che potete attraversare la directory per aprire i file e le directory
  in essa contenuti. Il permesso di scrittura attribuisce la capacit di
  creare e rimuovere file nella directory. Il permesso di esecuzione vi
  d la possibilit di cercare nella directory -- cio di listarla e
  vedere i nomi dei file e delle directory che contiene. A volte vedrete
  directory che sono leggibili da chiunque ma non eseguibili da
  chiunque: significa che un utente qualsiasi pu raggiungere i file e
  le directory in essa contenuti, ma solo conoscendo esattamente i loro
  nomi.

  Per finire, vediamo quali sono i permessi dello programma login
  stesso.




  snark:~$ ls -l /bin/login
  -rwsr-xr-x   1 root     bin         20164 Apr 17 12:57 /bin/login




  Ha i permessi che ci aspettiamo per un comando di sistema -- eccetto
  quella `s' dove ci dovrebbe essere il permesso di esecuzione per il
  proprietario. Questa  la visualizzazione di uno speciale permesso
  chiamato `set-user-id' o setuid bit.

  Il setuid bit  di solito associato a programmi che hanno bisogno di
  dare agli utenti ordinari i privilegi di root, ma in modo controllato.
  Quando  impostato su un programma eseguibile, vi sono consentiti i
  privilegi del possessore di quel file di programma mentre il programma
  sta funzionando per conto vostro.

  Come lo stesso account di root, i programmi setuid sono utili ma
  pericolosi. Chiunque riesca sovvertire o modificare un programma
  setuid di propriet di root pu usarlo per lanciare una shell con
  privilegi di root. Per questa ragione, aprire un file in scrittura
  disattiva automaticamente il setuid bit sulla maggior parte degli
  Unix. Molti attacchi alla sicurezza di Unix cercano di sfruttare bachi
  nei programmi setuid per sovvertirli. Gli amministratori di sistema
  consci dei problemi di sicurezza sono quindi estremamente cauti con
  questi programmi e riluttanti ad installarne di nuovi.

  Ci sono un paio di dettagli importanti che abbiamo trascurato parlando
  dei permessi. In particolare, come il gruppo proprietario e i permessi
  vengono assegnati quando un file viene creato per la prima volta. Il
  gruppo  un problema perch gli utenti possono far parte di pi
  gruppi, ma solo uno di questi (specificato nella voce dell'utente in
  /etc/passwd)  il gruppo predefinito dell'utente e avr normalmente la
  propriet dei file creati dall'utente.

  La storia dei bit di permesso iniziali  un po' pi complicata. Un
  programma che crea un file di solito specifica i permessi di partenza.
  Ma questi verranno modificati da una variabile d'ambiente dell'utente
  chiamata umask. La umask specifica quali bit di permesso disattivare
  al momento della creazione di un file. Il valore pi comune,
  predefinito nella maggior parte dei sistemi,  -------w- o 002, che
  disattiva il bit di scrittura per il mondo intero. Rifatevi alla
  documentazione del comando umask nella pagina di manuale della vostra
  shell per maggiori dettagli.


  11.6.  Come le cose possono andare male

  Prima accennavamo al fatto che i file system possono essere delicati.
  Ora sappiamo che per raggiungere un file dobbiamo fare il gioco della
  campana attraverso quella che pu essere una catena arbitrariamente
  lunga di riferimenti inode e directory. Supponiamo ora che sul vostro
  disco fisso si formi un punto danneggiato.

  Se siete fortunati ci vi far perdere solo qualche file di dati. Se
  invece siete sfortunati, si potrebbe danneggiare una struttura di
  directory o un numero inode e un intero sottoalbero del vostro sistema
  potrebbe rimanere pendente nel limbo. Oppure, peggio ancora, si
  potrebbe originare una struttura rovinata che punta in pi modi allo
  stesso blocco disco o inode. Un danneggiamento di questo tipo si pu
  propagare a partire da una normale operazione sui file, facendo
  perdere tutti i dati collegati al punto danneggiato di origine.

  Fortunatamente questo tipo di eventualit  divenuto abbastanza
  infrequente perch l'hardware dei dischi  pi affidabile. Tuttavia,
  questo comporta che il vostro Unix voglia controllare periodicamente
  l'integrit del file system per assicurarsi che non ci sia nulla fuori
  posto. Gli Unix moderni compiono un rapido controllo dell'integrit di
  ciascuna partizione nella fase di avvio, giusto prima di montarle.
  Ogni tot riavvii fanno un controllo molto pi approfondito che impiega
  qualche minuto in pi.

  Se tutto questo pu far sembrare che Unix sia terribilmente complesso
  e incline a malfunzionamenti, pu essere rassicurante sapere che
  questi controlli nella fase d'avvio tipicamente intercettano e
  correggono i problemi normali prima che diventino veramente
  disastrosi. Altri sistemi operativi non hanno questi strumenti, cosa
  che velocizza un po' l'avvio ma pu mettervi molto di pi nei pasticci
  quando cercate di fare un salvataggio a mano (e sempre assumendo che
  abbiate una copia delle Norton Utilities o simili, tanto per
  cominciare...).


  12.  Come funzionano i linguaggi per computer?

  Abbiamo gi discusso ``come vengono eseguiti i programmi''. Ogni
  programma in definitiva deve eseguire un flusso di byte che sono
  istruzioni nel linguaggio macchina del vostro computer. Ma gli esseri
  umani non se la cavano molto bene con il linguaggio macchina;
  riuscirci  divenuta un'arte rara, una magia nera persino tra gli
  hacker.

  Quasi tutto il codice Unix, ad eccezione di una piccola porzione
  relativa all'interfaccia diretta con l'hardware nel kernel, viene oggi
  scritto in un linguaggio di alto livello. (`Alto livello' in questa
  espressione  un residuo storico volto a distinguerlo dai linguaggi
  assembler di `basso livello', che sono fondamentalmente sottili
  involucri attorno al codice macchina.)

  Ci sono diversi tipi di linguaggi di alto livello. Per affrontare
  l'argomento troverete utile tenere a mente che il codice sorgente di
  un programma (la versione creata dall'uomo, editabile) deve passare
  attraverso un qualche tipo di traduzione in codice macchina che il
  computer pu effettivamente eseguire.


  12.1.  Linguaggi compilati

  Il tipo pi convenzionale di linguaggio  il linguaggio compilato. I
  linguaggi compilati vengono tradotti in file eseguibili di codice
  macchina binario da uno speciale programma chiamato (ovviamente)
  compilatore. Una volta che il codice binario  stato generato potete
  eseguirlo direttamente senza pi guardare al codice sorgente. (La
  maggior parte del software  fornita come binari compilati a partire
  da codice che non vedete.)

  I linguaggi compilati tendono a dare prestazioni eccellenti e hanno il
  pi completo accesso al SO, ma tendono anche a essere difficili da
  programmare.

  C, il linguaggio in cui Unix stesso  scritto,  di gran lunga il pi
  importante tra questi (con la sua variante C++). FORTRAN  un altro
  linguaggio ancora usato tra gli ingegneri e gli scienziati ma di anni
  pi vecchio e molto pi primitivo. Nel mondo Unix nessun altro
  linguaggio compilato  nell'uso dominante. Al di fuori di esso, il
  COBOL  molto usato per il software finanziario e commerciale.

  C'erano molti altri linguaggi compilati, ma la maggior parte di essi
  si sono estinti oppure sono strumenti strettamente di ricerca. Se
  siete nuovi sviluppatori Unix e usate un linguaggio compilato 
  estremamente probabile che questo sia il C o il C++.

  12.2.  Linguaggi interpretati

  Un linguaggio interpretato dipende da un programma interprete che
  legge il codice sorgente e lo traduce al volo in calcoli e chiamate di
  sistema. Il sorgente deve essere reinterpretato (e l'interprete deve
  essere presente) ogni volta che il codice viene eseguito.

  I linguaggi interpretati tendono ad essere pi lenti dei linguaggi
  compilati e spesso hanno accesso limitato al sistema operativo e
  all'hardware sottostanti. D'altra parte, essi tendono ad essere pi
  facili da programmare e pi propensi a perdonare gli errori di
  codifica rispetto ai linguaggi compilati.

  Molti programmi di utilit di Unix, inclusa la shell, bc(1), sed(1) e
  awk(1), sono in effetti piccoli linguaggi interpretati. I BASIC sono
  di solito interpretati. Cos pure il Tcl. Storicamente, il pi
  importante linguaggio interpretato  stato il LISP (un grande
  miglioramento rispetto ai suoi predecessori). Oggi il Perl  molto
  usato ed in costante crescita di popolarit.


  12.3.  Linguaggi a codice P

  Dal 1990  andato assumendo importanza crescente un tipo di linguaggi
  ibridi che usa sia la compilazione che l'interpretazione. I linguaggi
  a codice P sono come i linguaggi compilati nel senso che il sorgente
  viene tradotto in una forma binaria compatta che  ci che viene
  realmente eseguito, ma che non  esattamente codice macchina. Si
  tratta invece di pseudocodice (o codice P) che  solitamente molto pi
  semplice ma pi potente di un vero linguaggio macchina. Quando
  eseguite il programma, interpretate il codice P.

  Il codice P pu girare velocemente quasi quanto un binario compilato
  (gli interpreti di codice P possono essere abbastanza semplici,
  leggeri e rapidi). Ma i linguaggi a codice P riescono a mantenere la
  flessibilit e la potenza di un buon interprete.

  Importanti linguaggi a codice P includono il Python ed il Java.


  13.  Come funziona Internet?

  Per aiutarvi a capire come funziona Internet daremo un'occhiata alle
  cose che succedono quando fate una tipica operazione di Internet:
  indirizzate un browser alla prima pagina di questo documento, sul sito
  Web del Linux Documentation Project. L'indirizzo di questo documento 


  http://metalab.unc.edu/LDP/HOWTO/Fundamentals.html



  che significa che si trova nel file LDP/HOWTO/Fundamentals.html sotto
  la web directory dell'host sunsite.unc.edu.


  13.1.  Nomi e locazioni

  La prima cosa che il vostro browser deve fare  stabilire una
  connessione remota al computer dove si trova il documento. A tal fine
  deve prima trovare la locazione remota dell'host sunsite.unc.edu
  (`host'  la forma breve di `computer host' o `host remoto';
  sunsite.unc.edu  un tipico hostname). La locazione corrispondente 
  in realt un numero chiamato indirizzo IP (spiegheremo pi avanti la
  parte `IP' di questa espressione).

  A questo scopo il vostro browser interroga un programma chiamato name
  server. Il name server pu trovarsi sul vostro computer, ma  pi
  probabile che giri su un computer del fornitore col quale il vostro
  computer dialoga. Quando vi collegate ad un ISP una parte della
  procedura consiste quasi sicuramente nel dire al vostro software per
  Internet qual  l'indirizzo IP di un name server sulla rete dell'ISP.

  I name server sui vari computer si parlano tra loro, scambiandosi e
  tenendo aggiornate tutte le informazioni necessarie per risolvere i
  nomi degli host (per mapparli agli indirizzi IP). Il vostro name
  server pu interrogare tre o quattro diversi siti sulla rete nel
  processo di risoluzione di sunsite.unc.edu, ma di solito questo si
  verifica molto rapidamente (tipo in meno di un secondo).

  Il name server dir al vostro browser che l'indirizzo IP di Sunsite 
  152.2.22.81; a questo punto il vostro computer sar in grado di
  scambiare direttamente bit con sunsite.


  13.2.  Pacchetti e router


  Quello che il browser vuole  mandare al Web server su Sunsite un
  comando come questo:


  GET /LDP/HOWTO/Fundamentals.html HTTP/1.0



  Ecco cosa succede. Dal comando si costruisce un pacchetto, cio un
  blocco di bit come un telegramma che  `impacchettato' con tre cose
  importanti: l'indirizzo di provenienza (l'indirizzo IP del vostro
  computer), l'indirizzo di destinazione (152.2.22.81) e un numero di
  servizio o numero di porta (in questo caso 80) che indica che si
  tratta di una richiesta World Wide Web.

  Il vostro computer spedisce allora il pacchetto lungo il cavo (la
  connessione modem al vostro ISP o rete locale) finch arriva ad un
  computer specializzato chiamato router. Il router ha nella sua memoria
  una mappa di Internet, non sempre una completa, ma una che descrive
  completamente il vostro vicinato di rete e sa come raggiungere i
  router per altri circondari di Internet.

  Il vostro pacchetto potrebbe passare attraverso svariati router lungo
  la strada per la sua destinazione. I router sono intelligenti.
  Guardano quanto tempo impiegano gli altri router per avvertire che
  hanno ricevuto un pacchetto. Usano questa informazione per dirigere il
  traffico verso i collegamenti veloci. La usano per accorgersi se un
  altro router (o un cavo) sono fuori servizio o irraggiungibili e
  quindi, se possibile, ovviare al problema trovando un'altra strada.

  C' una leggenda metropolitana secondo la quale Internet  stata
  progettata per sopravvivere alla guerra nucleare. Questo non  vero,
  ma la struttura di Internet  estremamente adatta ad ottenere
  prestazioni affidabili anche con l'hardware precario che caratterizza
  questo mondo incerto. Questo deriva direttamente dal fatto che la sua
  intelligenza  distribuita tra migliaia di router piuttosto che
  riunita in poche enormi centrali (come la rete telefonica). Questo
  significa che i malfunzionamenti tendono a essere ben localizzati e la
  rete pu aggirarli.

  Una volta che il vostro pacchetto  giunto al computer di destinazione
  quest'ultimo usa il numero di servizio per inviare il pacchetto al
  server web. Il server web pu capire a chi rispondere guardando
  l'indirizzo IP di provenienza del pacchetto con il comando. Quando il
  server web restituisce questo documento lo suddivide in un certo
  numero di pacchetti. La dimensione dei pacchetti varia a seconda del
  mezzo di trasmissione sulla rete e del tipo di servizio.


  13.3.  TCP e IP

  Per capire come vengono gestite le trasmissioni a pacchetti multipli,
  dovete sapere che Internet in realt usa due protocolli, uno
  sovrapposto all'altro.

  Il livello pi basso, l'IP (Internet Protocol), sa come prendere
  singoli pacchetti da un indirizzo di provenienza a un indirizzo di
  destinazione ( per questo che si chiamano indirizzi IP). Tuttavia
  l'IP non  affidabile: se un pacchetto si perde o cade i computer di
  origine e di destinazione possono non venirne mai a conoscenza. Nel
  gergo delle reti, l'IP  un protocollo senza connessione; il mittente
  si limita a far partire un pacchetto per il destinatario e non si
  aspetta un avviso di ricevuta.

  L'IP  veloce ed economico, comunque. A volte veloce, economico e
  inaffidabile va bene. Quando giocate in rete a Doom o Quake, ogni
  pallottola  rappresentata da un pacchetto IP. Se alcune vengono
  perse, pazienza.

  Il livello superiore, TCP (Transmission Control Protocol), vi d
  affidabilit. Questi due computer negoziano una connessione TCP (cosa
  che fanno usando l'IP); il ricevente sa che deve spedire al mittente
  un avviso di ricevuta dei pacchetti che legge. Se il mittente non vede
  un avviso di ricevuta per un pacchetto entro un certo periodo di tempo
  (timeout) allora rispedisce quel pacchetto. Inoltre, il mittente
  attribuisce ad ogni pacchetto TCP un numero di sequenza, che il
  ricevente pu usare per riassemblare i pacchetti nel caso che
  risultino in disordine. (Cosa che si verifica se un collegamento della
  rete viene attivato o cade durante una connessione.)

  I pacchetti TCP/IP contengono anche un checksum per consentire
  l'individuazione di dati rovinati da collegamenti difettosi. Cos, dal
  punto di vista di chiunque usi il TCP/IP e i name server, sembra
  affidabile passare flussi di byte in coppie hostname/numero di
  servizio. Chi scrive i protocolli di rete non deve quasi mai pensare
  agli aspetti di basso livello relativi alla pacchettizzazione, al
  riassemblaggio dei pacchetti, al controllo degli errori, al checksum e
  alla ritrasmissione.


  13.4.  HTTP, un protocollo applicativo

  Torniamo ora al nostro esempio. I browser ed i server web dialogano
  usando un protocollo applicativo che si appoggia al TCP/IP, usandolo
  semplicemente come un modo per passare stringhe di byte avanti e
  indietro. Questo protocollo  chiamato HTTP (Hyper-Text Trasfer
  Protocol, protocollo per il trasferimento di ipertesti) e abbiamo gi
  visto un suo comando: il GET mostrato sopra.

  Quando il comando GET arriva al server web sunsite.unc.edu con numero
  di servizio 80 verr notificato al demone server che  in attesa sulla
  porta 80. La maggior parte dei servizi Internet sono implementati da
  demoni server che si limitano ad ascoltare sulle porte, attendono ed
  eseguono i comandi in arrivo.

  Se il disegno di Internet ha una regola generale, questa  che tutte
  le parti dovrebbero essere il pi possibile semplici e accessibili per
  gli esseri umani. L'HTTP e i suoi simili (come il Simple Mail Transfer
  Protocol, SMTP, che viene usato per trasferire la posta elettronica
  tra gli host) tende a usare comandi in semplice testo stampabile che
  terminano con un codice di carriage return/line feed.

  Questo  marginalmente inefficiente: in qualche circostanza potreste
  ottenere una velocit maggiore usando un protocollo binario di stretta
  codifica. Ma l'esperienza ha dimostrato che i benefici di avere
  comandi facili da descrivere e comprendere per gli esseri umani supera
  qualsiasi marginale guadagno di efficienza che si possa ottenere al
  prezzo di rendere le cose oscure e complicate.

  Di conseguenza, quello che il demone server vi rispedisce via TCP/IP 
  anch'esso testo. L'inizio della risposta assomiglier in qualche modo
  a questa (alcuni header sono stati omessi):


  HTTP/1.1 200 OK
  Date: Sat, 10 Oct 1998 18:43:35 GMT
  Server: Apache/1.2.6 Red Hat
  Last-Modified: Thu, 27 Aug 1998 17:55:15 GMT
  Content-Length: 2982
  Content-Type: text/html



  Questi header saranno seguiti da una linea vuota e dal testo della
  pagina web (dopodich la connessione viene lasciata cadere). Il vostro
  browser si limita a visualizzare quella pagina. Gli header servono a
  spiegargli come (in particolare, l'header Content-Type gli dice che i
  dati restituiti sono veramente HTML).