÷ƒ’À;è TeX output 2003.11.26:1330‹ÿÿÿÿ Û_2 ý ~? ÕÁ ýZݺóþÖëI½q½qecss2074¼KernelAnalysis-HO‘ÿwmWTOŽ¤ ®„ØcÕÁGŽŽ¡ó 1ê± ecrm1000¹RobGerto–U Arcomano’"»v0.65,“23“Agosto“2002Ž¡Ÿ&°óŒ6 ecss1000½Questo–9ÂdoGcumento“cerca“di“illustraš¸ère“alcune“ca˜ratteristiche“del“Kernel“di“Linux,‘rêi“compGonenti“p˜rincipali,‘rêcomeŽ¡lavoš¸èrano–je“cosi'“via.‘°'Questo“HO˜WTO‘iýdovrebbšGe“p˜ermettere“al“lettoš¸ère“di“trova˜re“subito“la“funzione“del“k˜ernel“cheŽ¡si–ï—vuole“trovaš¸ère“senza“dover“conoscere“a“p˜rio˜ri“tutta“la“struttura“dei“so˜rgenti.‘@äPuoi“trova˜re“l'ultima“versione“diŽ¡questo–VódošGcument“su“óø8‹ ecsi1000¾http://www.b˜ertolinux.com“óqLË ectt1000ºhttp://www.bertolinux.com“½Se“hai“suggerimenti“p˜er“questoŽ¡došGcumento,–U manda“un'email“all'indirizzo“¾b˜erto@b˜ertolinux.com“ºmailto:berto@bertolinux.comŽŸ(Àœó&Lt$ffffecbx1440À1Ž‘ÁInctropœduzioneŽŸèó¥!¢N ecbx1200Â1.1Ž‘¾In tro_úduzioneŽ©Mª¹Questo–fÃHOš¸èWTO‘f¾cerca“di“descriv˜ere“come“le“compGonen˜ti“del“Kernel“di“Lin˜ux“funzionano,‘k,quali“sono“le“fun-Ž¡zioni–¢²principali“e“le“strutture“dati“utilizzate“e“come“gira“il“tutto.‘Z6Puoi“troš¸èv‘ÿqÐare“l'ultima“v˜ersione“di“questoŽ¡doGcumenš¸èto–Tsu“ó½HЃ ecti1000Ãhttp://www.b–ÿ}/ertolinux.c“om–Tºhttp://www.bertolinux.com“¹Se“hai“dei“suggerimen˜to“pGer“miglio-Ž¡rare–¤ýquesto“doGcumen¸èto,‘È7manda“un'email“all'indirizzo:‘nÃb–ÿ}/erto@b“ertolinux.c“om‘¤ýºmailto:berto@bertolinux.comŽ¡¹.‘ß—Il–$}cošGdice“descritto“nel“do˜cumenš¸èto“si“riferisce“al“Kernel“Lin˜ux“v˜ersione“2.4.x,‘XTl'ultima“v˜ersione“stabile“alŽ¡momenš¸èto–U della“compilazione“dell'HO˜WTO.ŽŸ#ÃÂ1.2Ž‘¾Cop• yrigh“tŽ¦¹Cop•¸èyrigh“t–&ä(C)‘&®2000,2001,2002“RobšGerto“Arcomano.‘æÍThis“do˜cumenš¸èt“is“free;‘Çy˜ou“can“redistribute“it“and/orŽ¡moGdify–Êit“under“the“terms“of“the“GNU‘ÉÝGeneral“Public“License“as“published“bš¸èy“the“F‘ÿ*¸ree“Soft˜w˜are“F‘ÿ*¸oundation;Ž¡either–Æívš¸èersion“2“of“the“License,‘#aor“(at“y˜our“option)“an˜y“later“v˜ersion.‘ÆèThis“doGcumen˜t“is“distributed“inŽ¡the–V,hopšGe“that“it“will“b˜e“useful,‘–obut“WITHOUT–UêANY“W‘þã ARRANTY;–V,without“evš¸èen“the“implied“w˜arran˜t˜yŽ¡of–üMER¸èCHANT‘ÿ*¸ABILITY›Ïor“FITNESS˜F¸èOR˜A˜P–ÿ*¸AR“TICULAR˜PURPOSE.–üSee“the“GNU˜General“PublicŽ¡License–‡6for“more“details.‘ÃY‘ÿ*¸ou“can“get“a“cop¸èy“of“the“GNU–‡*GPL“Ãher‘ÿ}/e‘‡6ºhttp://www.gnu.org/copyleft/gpl.Ž¡htmlŽŸ#ÃÂ1.3Ž‘¾T‘þàraduzioniŽ¦¹Sei–U libšGero“di“tradurre“questo“do˜cumenš¸èto,“devi“soltan˜to“rispGettare“2“regole:Ž©ؼ‘ 9b1.ŽŽŽ‘Con•¸ètrollare›U c“he˜non˜esista˜gia'˜un'altra˜v“ersione˜nel˜tuo˜LDP˜loGcaleŽŸ®‘ 9b2.ŽŽŽ‘Manš¸ètenere–€ñtutta“la“sezione“'In˜troGduzione'“(inclusi“'In˜troGduzione',–‹å'Cop˜yrigh˜t',“'T‘ÿ*¸raduzioni',“'Ringrazi-Ž¡‘amen¸èti').Ž¦Aš¸èttenzione!‘ 6aNon–ìbisogna“tradurre“il“le“TXT‘ë­o“HTML,“bGensi'“il“le“L‘ÿ*¸YX,“cosicc˜he'“sia“pGossibile“con-Ž¡vš¸èertirlo–Inegli“altri“formati“(TXT,“HTML,“RIFF,“ecc.):‘ûÑpuoi“utilizzare“l'applicativ˜o“LyX‘Ôscaricabile“daŽ¡Ãhttp://www.lyx.or‘ÿ}/g–U ºhttp://www.lyx.org“¹.Ž¤ؼNon–U c'e'“bisogno“di“cš¸èhiedermi“l'autorizzazione!‘q€E'“sucien˜te“com˜unicarmelo.Ž¡Grazie–U pGer“la“tua“traduzione!ŽŽŽŒ‹* Û_2 ý ~?Ÿ„€ÕÁGŽó]fŒ ecbx1000Ä2.‘ñ8Sin®>tassi‘Õutilizzata’fÂ,¹2ŽŽ ÕÁ ýV¯Â1.4Ž‘¾Ringraziamen tiŽ¤Mª¹Ringraziamenš¸èti–p¬a“ÃF‘ÿ;Èatamor‘ÿ}/gana‘­Computers“ºhttp://www.fatamorgana.com“¹pGer“i“mezzi“hardw˜are“oerti“e“laŽŸ ®pšGossibilita'–U di“sp˜erimen¸ètazione.ŽŸ(ÀœÀ2Ž‘ÁSinctassi‘G\utilizzataŽŸèÂ2.1Ž‘¾Sin tassi‘¸funzioniŽ¡¹Quando–U descriviamo“una“funzione,“scriviamo:Ž¤ؼº"nome_funzione‘ X[–?¬percorso“.“estensione“]"Ž¡¹A¸èd‘U esempio:Ž¡º"schedule‘?¬[kernel/sched.c]"Ž¡¹ci–U dice“c¸èhe“stiamo“parlando“della“funzioneŽ¤ؼº"¹sc¸èheduleº"–U ¹denita“nel“leŽ¡[›U k•¸èernel/sc“hed.c˜]Ž¡Nota:‘q€Il–U pGercorso“di“riferimenš¸èto“e'“la“directory“dei“sorgen˜ti“del“Kernel“/usr/src/lin˜ux.Ž¤#ÃÂ2.2Ž‘¾Inden tazioneŽ©Mª¹L'indendazione–U nel“cošGdice“sorgen¸ète“del“do˜cumen¸èto“e'“di“3“caratteri.Ž¡Â2.3Ž‘¾In terCallings‘¸AnalysisŽ¦Ä2.3.1Ž‘#!\In®>troQÂduzioneŽ¦¹Nel–D!doGcumenš¸èto“v˜erranno“utilizzate“le“"In˜terCallings“Analysis“"(ICA)‘D(analisi“delle“reciproGc˜he“c˜hiamate)“pGerŽ¤ ®vš¸èedere–U (utilizzando“anc˜he“l'inden˜tazione)“come“le“funzioni“del“Kernel“si“c˜hiamano“l'un“l'altra.ŽŸؼA¸èd–U esempio,“la“funzione“sleep_on‘*he'“descritto“di“seguito:Ž©ؼº|sleep_onŽ¡|init_waitqueue_entry‘~--Ž¡|__add_wait_queue‘>ü|‘¿Accodamento–?¬della“richiestaŽ¡‘¿|list_add‘Y:l|Ž¡‘~|__list_add‘4|¸--Ž¡‘¿|schedule‘I{h---‘>\In–?¬attesa“di“esecuzioneŽ¡‘~|__remove_wait_queue‘?¬--Ž¡‘~|list_del‘I{h|‘¿Disaccodamento‘?¬richiestaŽ¡‘/= |__list_del‘$½´--Ž¡¡’ˆwxsleep_on‘?¬ICAŽ¦¹L'ICA–U inden¸ètata“e'“seguita“dal“pGercorso“delle“funzioni“descritte:ŽŽŽŒ‹ ) Û_2 ý ~?Ÿ„€ÕÁGŽÄ2.‘ñ8Sin®>tassi‘Õutilizzata’fÂ,¹3ŽŽ ÕÁ ýV¯‘ó !",š cmsy10¸ŽŽŽ‘¹sleep_on‘U [k•¸èernel/sc“hed.c]Ž¤®‘¸ŽŽŽ‘¹init_w•¸èaitqueue_en“try‘U [include/lin“ux/w“ait.h]Ž¡‘¸ŽŽŽ‘¹__add_w¸èait_queueŽ¡‘¸ŽŽŽ‘¹list_add‘U [include/lin¸èux/list.h]Ž¡‘¸ŽŽŽ‘¹__list_addŽ¡‘¸ŽŽŽ‘¹sc•¸èhedule‘U [k“ernel/sc“hed.c]Ž¡‘¸ŽŽŽ‘¹__remo•¸èv“e_w“ait_queue‘U [include/lin“ux/w“ait.h]Ž¡‘¸ŽŽŽ‘¹list_del‘U [include/lin¸èux/list.h]Ž¡‘¸ŽŽŽ‘¹__list_delŽ¤ؼNota:‘q€Se–U il“pGercorso“non“camš¸èbia“non“v˜erra'“piu'“spGecicato“nelle“righe“seguen˜ti.ŽŸ ÖÄ2.3.2Ž‘#!\DettagliŽŸMª¹In–U una“ICA“una“linea“come“la“seguen¸èteŽ¡–?¬ºfunzione1“->“funzione2Ž¡¹signica–fLcš¸èhe“la“ó  b> cmmi10µ<“¹funzione1“µ>“¹e'“un“generico“pun˜tatore“a“funzione“c˜he,›j—in“questo“caso,˜pun¸èta“a“µ<“¹function2ŽŸ ®µ>¹.Ž©ؼQuando‘U scriviamo:Ž¡‘ Xºfunzione:Ž¡¹signica–U cš¸èhe“µ<“¹funzione“µ>“¹non“e'“una“v˜era“funzione,“bGensi'“un'etic˜hetta“assem˜bler.Ž¦A‘ÄZv•¸èolte›Ĺv“erra'˜rip•Gortato˜del˜co“dice˜C‘™¢o˜pseudo˜co“dice˜al˜p“osto˜di˜linee˜assem¸èbler‘šo˜di˜co“dice˜‘šnonŽ© ®strutturato‘*hp•Ger›U p“oter˜c¸èhiarire˜l'esp“osizione.ŽŸ ÖÄ2.3.3Ž‘#!\PR®>O–Õdelle“ICAŽŸMª¹I–U v‘ÿqÐanš¸ètaggi“nell'utilizzo“delle“ICA“(In˜terCallings“Analysis)“sono“molti:Ž¡‘¸ŽŽŽ‘¹Si–÷˜ottiene“una“visione“d'insieme“del“funzionamenš¸èto“di“una“c˜hiamata“e“dell'a˜vvicendarsi“delle“routineŽ¦‘del‘U Kernel.Ž¤®‘¸ŽŽŽ‘¹Il–·/pšGercorso“delle“funzioni“viene“rip˜ortato“di“seguito“cosicc¸èhe'“le“ICA‘·p˜ossano“rappresen¸ètare“una“sortaŽ¦‘di–U riferimenš¸èto‘*hpGer“sco˜v‘ÿqÐare“subito“le“funzioni“cercate.Ž¡‘¸ŽŽŽ‘¹Pš¸èossono–ZKessere“molto“utili“in“meccanismi“di“sleep/a˜w˜ak˜e,‘[–do˜v˜e“si“descriv˜e“quello“c˜he“viene“fatto“primaŽ¦‘della–U sleep,“duranš¸ète“la“stessa“e“dopGo“il“risv˜eglio“(dopGo“la“sc˜hedulazione).ŽŽŽŒ‹ü Û_2 ý ~?Ÿ„€ÕÁGŽÄ3.‘ñ8Rapido–Õtour“del“Lin®>ux“Kernel’(ì¹4ŽŽ ÕÁ ýV¯Ä2.3.4Ž‘#!\CONTR®>O–Õdelle“ICAŽŸ#‘¸ŽŽŽ‘¹Alcuni–U sv‘ÿqÐan¸ètaggi“nell'utilizzare“le“ICA“sono“ripGortati“di“seguito:Ž¤ؼCome–‚tutti“i“moGdelli“teorici,›Íüviene“semplicata“la“realta'“sorv¸èolando“alcuni“dettagli,˜come“il“v¸èero“coGdiceŽ© ®sorgen¸ète–U e“i“casi“eccezionali.Ž¡‘¸ŽŽŽ‘¹Diagrammi–U addizionali“sarebbšGero“imp˜ortan¸èti“p˜er“rappresenš¸ètare“le“condizioni“dello“stac˜k,“i“dati,“etc.ŽŸ(ÀœÀ3Ž‘ÁRapido–G\tour“del“Lincux“KernelŽŸèÂ3.1Ž‘¾Cos'e'–¸il“Kernel?Ž¤Mª¹Il–äKernel“e'“il“cuore“di“ogni“sistema“opGerativš¸èo:‘Ze'“quel“soft˜w˜are“c˜he“pGermette“agli“uten˜ti“di“condividere“edŽ¦utilizzare–U al“meglio“le“risorse“del“sistema“di“elabGorazione.ŽŸؼIl–³Kernel“puo'“essere“visto“come“il“principale“soft•¸èw“are–³del“Sistema“OpGerativš¸èo“c˜he“p•Gotrebb“e–³anc˜he“includereŽ¦la–Äùgestione“graca:‘Q1ad“esempio“sotto“Linš¸èux“(come“nella“maggiorparte“dei“sistemi“Unix-lik˜e),‘ ïl'am˜bien˜teŽ¦XWindoš¸èw–Jnon“fa“parte“del“Kernel“di“Lin˜ux“pGerc˜he'“gestisce“soltan˜to“opGerazioni“grac˜he“(grazie“ad“istruzioniŽ¦I/O‘x.eseguite–x7in“User“MoGde“e“accesso“diretto“alla“scš¸èheda“video).‘ÚÆCom'e'“noto,–€ýin˜v˜ece,“gli–x7am˜bien˜ti“Windo˜wsŽ¦(Win9x,–U WinME,“WinNT,“Win2K,“WinXP‘ÿ*¸,“e“cosi'“via)“sono“un“mix“tra“am•¸èbien“te–U graco“e“k¸èernel.ŽŸ#ÃÂ3.2Ž‘¾Qual–¸e'“la“dierenza“tra“User“Moš_úde“e“Kernel“Mo˜de?Ž¡Ä3.2.1Ž‘#!\In®>troQÂduzioneŽ¡¹Molti–¿¯anni“fa,›ÚSquando“i“computers“erano“grandi“come“stanze,˜gli“utenš¸èti“lancia˜v‘ÿqÐano“le“loro“applicazioni“conŽ¦molta–U dicolta'“e,“a“vš¸èolte,“il“sistema“di“elabGorazione“anda˜v‘ÿqÐa“in“crash.ŽŸ ÖÄ3.2.2Ž‘#!\Mo•QÂdi‘Õop“erativiŽ¡¹Pš¸èer–A™evitare“tale“crash“si“e'“pGensato“di“in˜trošGdurre“2“mo˜di“di“funzionamenš¸èto“(ancora“presen˜ti“nei“n˜uo˜vi“micro-Ž¦proGcessori):Ž¤ؼ‘ 9b1.ŽŽŽ‘Kernel–ŠEMošGde:‘ÛÊin“cui“la“macc¸èhina“op˜era“con“risorse“criticš¸èhe,‘׎come“l'hardw˜are“(IN/OUT‘‰õo“memoryŽ¦‘mappGed),–U accesso“diretto“alla“memoria,“IR¸èQ,“DMA,“e“cosi'“via.ŽŸ®‘ 9b2.ŽŽŽ‘User–q.MošGde:‘©in“cui“gli“uten¸èti“p˜ossono“far“girare“le“loro“applicazioni“senza“preo˜ccuparsi“di“inc¸èhio˜dare“ilŽ¦‘sistema.Ž¡¦‘N»º|‘4|¸Applicazioni‘9¼d/|\Ž¦‘N»|‘/= ______________‘9¼d|Ž¦‘N»|‘/= |–?¬User“Mode‘ X|‘9¼d|Ž¦‘N»|‘/= ______________‘9¼d|Ž¦–N»|“|‘^z|Ž¦Dettaglio‘~|‘)ý`_______‘?¬_______‘9¼d|‘¿AstrazioneŽ¦Implementazione|‘)ý`|–?¬Kernel“Mode“|‘9¼d|Ž¦‘N»|‘)ý`_______________‘9¼d|Ž¦–N»|“|‘^z|ŽŽŽŒ‹  Û_2 ý ~?Ÿ„€ÕÁGŽÄ3.‘ñ8Rapido–Õtour“del“Lin®>ux“Kernel’(ì¹5ŽŽ ÕÁ ýV¯–N»º|“|‘^z|Ž¤ ®–N»|“|‘^z|Ž¡‘I{h\|/‘4|¸Hardware‘N»|ŽŸؼ¹Kernel–U MošGde“imp˜edisce“alle“applicazioni“User“Mo˜de“di“danneggiare“il“sistema“o“le“sue“caratteristic¸èhe.Ž©ؼI‘Ãmo•Gderni›ïmicropro“cessori˜implemen•¸ètano˜in˜hardw“are˜almeno˜2˜stati˜dieren“ti.‘tîA“d˜esempio˜l'arc“hitetturaŽ¡Inš¸ètel–ošpGossiede“4“stati“c˜he“determinano“il“PL‘o“(Privilege“Lev˜el)“pGermettendo“quindi“di“a˜v˜ere“gli“stati“0,1,2,3“,Ž¡con–U 0“usato“in“moGdo“Kernel.Ž¦I‘9Âsistemi–9ÉUnix-likš¸èe“ric˜hiedono“soltan˜to“2“liv˜elli“di“privilegio“e“utilizzeremo“questo“come“pun˜to“di“riferimen˜to.ŽŸ#ÃÂ3.3Ž‘¾P assaggio–¸tra“User“Moš_úde“a“Kernel“Mo˜deŽ¤MªÄ3.3.1Ž‘#!\Quando–Õsi“salta?Ž¡¹Una–`avš¸èolta“capito“c˜he“ci“sono“2“mošGdi“op˜erativi“dierenš¸èti,‘c2dobbiamo“v˜edere“quando“a˜vviene“il“salto‘5©tra“unoŽ¤ ®e‘U l'altro:ŽŸؼ‘ 9b1.ŽŽŽ‘Quando–QŽviene“cš¸èhiamata“una“System“Call“il“task“v˜olon˜tariamen˜te“inizia“ad“eseguire“del“coGdice“nelloŽ¡‘stato‘U Kernel.ŽŸ®‘ 9b2.ŽŽŽ‘Quando–Tarriv‘ÿqÐa“un“IRš¸èQ‘C(o“eccezione)“viene“eseguito“un“gestore“IR˜Q‘C(o“gestore“eccezione),‘!Idop•Go“dic˜he'‘TilŽ¡‘conš¸ètrollo–U ritorna“al“task“in˜terrotto“come“se“non“fosse“successo“nien˜te.ŽŸ ÖÄ3.3.2Ž‘#!\System‘ÕCallsŽŸMª¹Le–‹ƒSystem“Calls“sono“come“delle“normali“funzioni,‘™soltanš¸èto“c˜he“opšGerano“in“Kernel“Mo˜de“p˜er“eseguire“op˜er-Ž¡azioni–U sull'OS“(in“eetti“le“System“Calls“sono“parte“in•¸ètegran“te‘U dell'OS).Ž¦Una–U System“Call“puo'“essere“c¸èhiamata“quando:ŽŸؼ‘¸ŽŽŽ‘¹si–U dev¸èe“accedere“ad“un“device“di“I/O“device“o“ad“un“le“(come“le“SC“read“e“write“)Ž©®‘¸ŽŽŽ‘¹e'–;øricš¸èhiesto“un“elev‘ÿqÐato“liv˜ello“di“privilegio“pGer“accedere“ad“alcune“informazioni“riserv‘ÿqÐate“(come“il“pid,‘AoŽ¡‘pšGer–U cam¸èbiare“la“p˜olitica“di“sc¸èheduling“e“cosi'“via)Ž¦‘¸ŽŽŽ‘¹e'–èricš¸èhiesto“un“cam˜biamen˜to“di“con˜testo“esecutiv˜o“(come“eseguire“la“fork‘Ü0o“eseguire“un'altra“appli-Ž¡‘cazione–U con“la“SC“exec).Ž¦‘¸ŽŽŽ‘¹si–U devš¸èe“eseguire“un“particolare“tipGo“di“comando“(come“c˜hdir,“kill",“brk,“o“signal)ŽŸؼ’­5,º|‘SúÀ|Ž¡’ƒ7Ì------->|–?¬System“Call“i‘ X|“(Accesso“ai“Devices)Ž¡|‘SúÀ|–$½´|“|– X[sys_read()]“|Ž¡|‘?¬...‘>ü|–$½´|“|‘SúÀ|Ž¡|–?¬system_call(i)“|--------‘$½´|‘SúÀ|Ž¡|‘¿[read()]‘>\|‘N»|‘SúÀ|Ž¡|‘?¬...‘>ü|‘N»|‘SúÀ|Ž¡|–?¬system_call(j)“|--------‘$½´|‘SúÀ|Ž¡|‘¿[get_pid()]‘ X|–$½´|“|‘SúÀ|Ž¡|–?¬...‘>ü|‘$½´------->|“System“Call“j‘ X|“(Accesso“alle“strutture“dati“del“kernel)Ž¡|‘SúÀ|‘N»|‘ X[sys_getpid()]|ŽŽŽŒ‹&z Û_2 ý ~?Ÿ„€ÕÁGŽÄ3.‘ñ8Rapido–Õtour“del“Lin®>ux“Kernel’(ì¹6ŽŽ ÕÁ ýV¯’­5,º|‘SúÀ|Ž¤ ®¡‘þ°USER–?¬MODE‘}ø KERNEL“MODEŽ¡¡¡‘}ø Funzionamento–?¬System“Calls“UnixŽ©û>¹Le–…vSystem“Calls“teoricamenš¸ète“sono“l'unica“in˜terfaccia“dispšGonibile“in“User“Mo˜de“p˜er“accedere“alle“risorseŽ¡hardwš¸èare.‘>)In–™Xrealta'“esiste“la“SC‘™GiopGerm‘n c˜he“pGermette“ad“un“T‘ÿ*¸ask“di“accedere“direttamen˜te“ad“un“deviceŽ¡(bGencš¸èhe'–U senza“IR˜Qs).Ž¤ؼNOT‘ÿ*¸A:–U Non“tutte“le“funzioni“di“libreria“C‘*hsono“delle“system“call,“solo“un“piccolo“sottoinsieme“di“esse.Ž¡Segue– ×una“lista“delle“System“Calls“presenš¸èti“nel“Lin˜ux“Kernel“2.4.17,‘ wžrica˜v‘ÿqÐabili“dal“le“[Ž¤ ®arc•¸èh/i386/k“ernel/en“try‘ÿ*¸.S‘U ]Ž¦‘)ý`º.long–?¬SYMBOL_NAME(sys_ni_syscall)‘$½´/*“0– X-“old–?¬"setup()"“system“call*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_exit)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_fork)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_read)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_write)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_open)‘D;¼/*“5“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_close)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_waitpid)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_creat)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_link)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_unlink)‘9¼d/*“10“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_execve)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_chdir)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_time)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_mknod)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_chmod)‘>ü/*“15“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_lchown16)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_ni_syscall)’¢µÔ/*“old“break“syscall“holder“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_stat)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_lseek)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_getpid)‘9¼d/*“20“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_mount)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_oldumount)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setuid16)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_getuid16)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_stime)‘>ü/*“25“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_ptrace)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_alarm)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_fstat)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_pause)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_utime)‘>ü/*“30“*/Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_ni_syscall)’¢µÔ/*“old“stty“syscall“holder“*/Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_ni_syscall)’¢µÔ/*“old“gtty“syscall“holder“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_access)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_nice)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_ni_syscall)‘$½´/*“35“*/‘SúÀ/*“old“ftime“syscall“holder“*/ŽŽŽŒ‹11 Û_2 ý ~?Ÿ„€ÕÁGŽÄ3.‘ñ8Rapido–Õtour“del“Lin®>ux“Kernel’(ì¹7ŽŽ ÕÁ ýV¯‘)ý`º.long‘?¬SYMBOL_NAME(sys_sync)Ž¤ ®‘)ý`.long‘?¬SYMBOL_NAME(sys_kill)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_rename)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_mkdir)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_rmdir)‘>ü/*“40“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_dup)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_pipe)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_times)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_ni_syscall)’¢µÔ/*“old“prof“syscall“holder“*/Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_brk)‘I{h/*“45“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setgid16)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_getgid16)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_signal)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_geteuid16)Ž¡–)ý`.long›?¬SYMBOL_NAME(sys_getegid16)“/*˜50˜*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_acct)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_umount)’·´„/*“recycled“never“used“phys()“*/Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_ni_syscall)’¢µÔ/*“old“lock“syscall“holder“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_ioctl)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_fcntl)‘>ü/*“55“*/Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_ni_syscall)’¢µÔ/*“old“mpx“syscall“holder“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setpgid)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_ni_syscall)’¢µÔ/*“old“ulimit“syscall“holder“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_olduname)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_umask)‘>ü/*“60“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_chroot)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_ustat)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_dup2)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_getppid)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_getpgrp)‘4|¸/*“65“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setsid)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_sigaction)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_sgetmask)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_ssetmask)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_setreuid16)‘$½´/*“70“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setregid16)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_sigsuspend)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_sigpending)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_sethostname)Ž¡–)ý`.long›?¬SYMBOL_NAME(sys_setrlimit)“/*˜75˜*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_old_getrlimit)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_getrusage)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_gettimeofday)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_settimeofday)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_getgroups16)‘~/*“80“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setgroups16)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(old_select)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_symlink)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_lstat)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_readlink)‘/= /*“85“*/ŽŽŽŒ‹:Ò Û_2 ý ~?Ÿ„€ÕÁGŽÄ3.‘ñ8Rapido–Õtour“del“Lin®>ux“Kernel’(ì¹8ŽŽ ÕÁ ýV¯‘)ý`º.long‘?¬SYMBOL_NAME(sys_uselib)Ž¤ ®‘)ý`.long‘?¬SYMBOL_NAME(sys_swapon)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_reboot)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(old_readdir)Ž¡‘)ý`.long–?¬SYMBOL_NAME(old_mmap)‘D;¼/*“90“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_munmap)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_truncate)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_ftruncate)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_fchmod)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_fchown16)‘/= /*“95“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_getpriority)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setpriority)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_ni_syscall)’¢µÔ/*“old“profil“syscall“holder“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_statfs)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_fstatfs)‘4|¸/*“100“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_ioperm)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_socketcall)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_syslog)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setitimer)Ž¡–)ý`.long›?¬SYMBOL_NAME(sys_getitimer)“/*˜105˜*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_newstat)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_newlstat)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_newfstat)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_uname)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_iopl)‘D;¼/*“110“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_vhangup)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_ni_syscall)‘$½´/*“old“"idle"“system“call“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_vm86old)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_wait4)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_swapoff)‘4|¸/*“115“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_sysinfo)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_ipc)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_fsync)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_sigreturn)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_clone)‘>ü/*“120“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setdomainname)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_newuname)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_modify_ldt)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_adjtimex)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_mprotect)‘/= /*“125“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_sigprocmask)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_create_module)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_init_module)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_delete_module)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_get_kernel_syms)‘ X/*“130“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_quotactl)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_getpgid)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_fchdir)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_bdflush)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_sysfs)‘>ü/*“135“*/ŽŽŽŒ‹ De Û_2 ý ~?Ÿ„€ÕÁGŽÄ3.‘ñ8Rapido–Õtour“del“Lin®>ux“Kernel’(ì¹9ŽŽ ÕÁ ýV¯‘)ý`º.long‘?¬SYMBOL_NAME(sys_personality)Ž¤ ®‘)ý`.long–?¬SYMBOL_NAME(sys_ni_syscall)‘$½´/*“for“afs_syscall“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setfsuid16)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setfsgid16)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_llseek)‘9¼d/*“140“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_getdents)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_select)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_flock)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_msync)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_readv)‘>ü/*“145“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_writev)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_getsid)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_fdatasync)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_sysctl)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_mlock)‘>ü/*“150“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_munlock)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_mlockall)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_munlockall)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_sched_setparam)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_sched_getparam)‘¿/*“155“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_sched_setscheduler)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_sched_getscheduler)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_sched_yield)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_sched_get_priority_max)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_sched_get_priority_min)‘ X/*“160“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_sched_rr_get_interval)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_nanosleep)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_mremap)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setresuid16)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_getresuid16)‘~/*“165“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_vm86)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_query_module)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_poll)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_nfsservctl)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_setresgid16)‘~/*“170“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_getresgid16)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_prctl)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_rt_sigreturn)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_rt_sigaction)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_rt_sigprocmask)‘¿/*“175“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_rt_sigpending)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_rt_sigtimedwait)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_rt_sigqueueinfo)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_rt_sigsuspend)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_pread)‘>ü/*“180“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_pwrite)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_chown16)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_getcwd)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_capget)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_capset)‘9¼d/*“185“*/ŽŽŽŒ‹ M« Û_2 ý ~?Ÿ„€ÕÁGŽÄ3.‘ñ8Rapido–Õtour“del“Lin®>ux“Kernel’#ìe¹10ŽŽ ÕÁ ýV¯‘)ý`º.long‘?¬SYMBOL_NAME(sys_sigaltstack)Ž¤ ®‘)ý`.long‘?¬SYMBOL_NAME(sys_sendfile)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_ni_syscall)‘N»/*“streams1“*/Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_ni_syscall)‘N»/*“streams2“*/Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_vfork)‘>ü/*“190“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_getrlimit)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_mmap2)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_truncate64)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_ftruncate64)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_stat64)‘9¼d/*“195“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_lstat64)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_fstat64)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_lchown)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_getuid)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_getgid)‘9¼d/*“200“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_geteuid)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_getegid)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setreuid)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setregid)Ž¡–)ý`.long›?¬SYMBOL_NAME(sys_getgroups)“/*˜205˜*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setgroups)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_fchown)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setresuid)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_getresuid)Ž¡–)ý`.long›?¬SYMBOL_NAME(sys_setresgid)“/*˜210˜*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_getresgid)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_chown)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setuid)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setgid)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_setfsuid)‘/= /*“215“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_setfsgid)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_pivot_root)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_mincore)Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_madvise)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_getdents64)‘$½´/*“220“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_fcntl64)Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_ni_syscall)‘$½´/*“reserved“for“TUX“*/Ž¡‘)ý`.long–?¬SYMBOL_NAME(sys_ni_syscall)‘$½´/*“Reserved“for“Security“*/Ž¡‘)ý`.long‘?¬SYMBOL_NAME(sys_gettid)Ž¡–)ý`.long›?¬SYMBOL_NAME(sys_readahead)“/*˜225˜*/Ž¡Ÿ ÖÄ3.3.3Ž‘#!\Ev•®>en“ti‘ÕIR“QŽŸMª¹Quando–U arriv‘ÿqÐa“un“IRš¸èQ,“il“task“in“esecuzione“viene“in˜terrotto“pGer“far“eseguire“un“gestore“IR˜Q.ŽŸؼDopGo–@al'esecuzione“di“tale“gestore“il“conš¸ètrollo“ritorna“tranquillamen˜te“al“proGcesso“c˜he“non“si“accorge“di“n˜ulla.ŽŸؼ¡‘4|¸ºTask–?¬in“esecuzioneŽ¡‘D;¼|-----------|‘4|¸(3)ŽŽŽŒ‹ W5 Û_2 ý ~?Ÿ„€ÕÁGŽÄ3.‘ñ8Rapido–Õtour“del“Lin®>ux“Kernel’#ìe¹11ŽŽ ÕÁ ýV¯ºESECUZIONE–¿|“|‘$½´|‘ X[stop–?¬esecuzione]“IRQ“HandlerŽ¤ ®NORMALE‘ X(1)‘?¬|‘¿|‘$½´|‘>\------------->|---------|Ž¡–D;¼|‘ X\|/‘~|‘>\|“|gestisce‘?¬|Ž¡–?¬IRQ“(2)---->|“..‘)ý`|----->‘D;¼|“alcuni‘ X|Ž¡–D;¼|›¿|‘$½´|<-----“|‘ Xdati˜|Ž¡RITORNO– X(6)›?¬|‘¿|‘$½´|‘>\|‘D;¼|“..(4).˜|Ž¡ALLA–?¬NORMALE“|‘ X\|/‘~|‘>\<-------------|_________|Ž¡ESECUZIONE‘¿|___________|‘ X[ritorno–?¬al“codice]Ž¡’¼ô0(5)Ž¡‘N»USER–?¬MODE‘n9KERNEL“MODEŽ¡¡‘/= Transizione–?¬User->Kernel“Mode“causata“da“evento“IRQŽ¡¤ؼ¹I–U seguenš¸èti“passi“si“riferiscono“al“diagramma“preceden˜te:Ž¡‘ 9b1.ŽŽŽ‘ProGcesso–U in“esecuzioneŽ¤®‘ 9b2.ŽŽŽ‘Arriv‘ÿqÐa–U un“IRš¸èQ“men˜tre“il“task“sta'“girandoŽ¡‘ 9b3.ŽŽŽ‘Il–U T‘ÿ*¸ask“viene“inš¸èterrotto“pGer“c˜hiamare“un“gestore“In˜terrupt.Ž¡‘ 9b4.ŽŽŽ‘Il–U gestore“In¸èterrupt“viene“eseguito.Ž¡‘ 9b5.ŽŽŽ‘Il–U conš¸ètrollo“ritorna“al“T‘ÿ*¸ask“in˜terrottoŽ¡‘ 9b6.ŽŽŽ‘Il–U T‘ÿ*¸ask“torna“ad“essere“eseguito“do•¸èv“e–U era“stato“in¸èterrotto.Ž¤ؼUn–U IRš¸èQ“di“particolare“in˜teresse“e'“quello“relativ˜o“al“Timer“c˜he“arriv‘ÿqÐa“ogni“tot“millisecondi“pGer“gestireŽ¡‘ 9b1.ŽŽŽ‘AllarmiŽ¤®‘ 9b2.ŽŽŽ‘Conš¸ètatori–­¼di“T‘ÿ*¸ask“e“di“Sistema“(usati“dallo“sc˜heduler“pšGer“decidere“quando“un“pro˜cesso“devš¸èe“v˜enirŽ© ®‘inš¸èterrotto–U o“pGer“l'accoun˜ting)Ž¡‘ 9b3.ŽŽŽ‘Multitasking–U basato“sul“meccanismo“di“w•¸èak“e–U up“dopšGo“un“p˜erio˜do“lungo“TIMESLICE.ŽŸ#ÃÂ3.4Ž‘¾MultitaskingŽ¤MªÄ3.4.1Ž‘#!\F‘ÿ ºunzionamen®>toŽ¡¹La–bFpunš¸èto“c˜hia˜v˜e“di“ogni“mošGderno“sistema“op˜erativ¸èo“e'“il“T›ÿ*¸ask.‘˜óIl“T˜ask“e'“un'applicazione“c¸èhe“gira‘7ŽinŽ¦memoria–U e“coGdivide“tutte“le“risorse“del“sistema“(inclusi“CPU“e“Memoria)“con“gli“altri“T‘ÿ*¸asks.Ž¤ؼQuesta–â condivisione“di“risorse‘·Rviene“gestita“dal“meccanismo“di“MultiT‘ÿ*¸asking.‘=Ogni“tot“(timeslice)“mil-Ž¦lisecondi–`aš¸èvviene“il“cam˜biamen˜to“di“con˜testo“(T‘ÿ*¸ask“Switc˜hing)“grazie“al“quale“gli“uten˜ti“hanno“l'illusioneŽ¦di–™€pGossedere“tutte“le“risorse;‘»°se“consideriamo“un“solo“utenš¸ète“si“a˜vra'“in˜v˜ece“l'illusione“di“pGoter“eseguire“piu'Ž¦T‘ÿ*¸asks–U nello“stesso“istan¸ète.Ž¡P•¸èer›U implemen“tare˜il˜Multitasking˜i˜T‘ÿ*¸ask˜utilizzano˜una˜v‘ÿqÐariabile˜state‘*hc“he˜puo'˜assumere˜i˜v‘ÿqÐalori:ŽŸؼ‘ 9b1.ŽŽŽ‘READ•¸èY,›U pron“to˜pGer˜l'esecuzioneŽŸ®‘ 9b2.ŽŽŽ‘BLOCKED,–U in“attesa“di“una“risorsaŽŽŽŒ‹ `: Û_2 ý ~?Ÿ„€ÕÁGŽÄ3.‘ñ8Rapido–Õtour“del“Lin®>ux“Kernel’#ìe¹12ŽŽ ÕÁ ýV¯Lo–U stato“del“T‘ÿ*¸ask“viene“gestito“dalla“presenza“o“meno“dello“stesso“nella“lista“relativ‘ÿqÐa:Ž¤ؼ‘¸ŽŽŽ‘¹lista‘U READ¸èYŽ©®‘¸ŽŽŽ‘¹lista‘U BLOCKEDŽŸ ÖÄ3.4.2Ž‘#!\Cam•®>biamen“to–Õdi“conš®>testo“(T‘ÿ ºask“Switc˜hing)ŽŸMª¹La–»Vcommš¸èutazione“da“un“T‘ÿ*¸ask“ad“un“altro“si“c˜hiama“T‘ÿ*¸ask“Switc˜hing.‘>=Molti“elabGoratori“hanno“una“istruzioneŽŸ ®hardw•¸èare›U c“he˜esegue˜automaticamen“te˜questa˜opGerazione.‘q€Il˜T‘ÿ*¸ask˜Switc“hing˜a“vviene˜nei˜seguen“ti˜casi:Ž¡‘ 9b1.ŽŽŽ‘DopšGo–U c¸èhe“il“temp˜o“Timeslice'“si“e'“esauritoŽ¦‘ 9b2.ŽŽŽ‘Quando–U un“T‘ÿ*¸ask“dev¸èe“rimanere“in“attesa“di“un“device“*Ž¡In›ôen•¸ètram“bi˜i˜casi˜abbiamo˜bisogno˜di˜sc“hedulare˜un˜n“uo“v“o˜proGcesso˜pron“to˜pGer˜l'esecuzione˜(dalla˜ReadyŽ¤ ®List)–U ed“eseguirlo.Ž©ؼ*–"Questo“serv¸èe“ad“evitare“la“Busy“F›ÿ*¸orm“W˜aiting,‘'ˆciošGe'“l'esecuzione“in¸èutile“di“un“lo˜op“del“pro˜cesso“in“attesaŽ¡della‘U risorsa.Ž¦Il–U T‘ÿ*¸ask“Switcš¸èhing“viene“gestito“dall'en˜tita'“Sc˜hedule.Ž©ؼ¡ºTimer‘þ°|‘9¼d|Ž¡‘?¬IRQ‘>\|‘9¼d|’’öÐScheduleŽ¡‘ X|‘~|‘9¼d|‘n9________________________Ž¡– X|----->|‘¿Task›?¬1“|<------------------>|(1)Scegli˜un˜nuovo˜Task˜|Ž¡‘ X|‘~|‘9¼d|‘hùp|(2)Task‘?¬Switching‘$½´|Ž¡‘ X|‘~|___________|‘hùp|________________________|Ž¡‘ X|‘~|‘9¼d|’¢µÔ/|\Ž¡‘ X|‘~|‘9¼d|’§õ€|Ž¡‘ X|‘~|‘9¼d|’§õ€|Ž¡‘ X|‘~|‘9¼d|’§õ€|Ž¡‘ X|‘~|‘9¼d|’§õ€|Ž¡– X|----->|‘¿Task‘?¬2“|<-------------------------------|Ž¡‘ X|‘~|‘9¼d|’§õ€|Ž¡‘ X|‘~|___________|’§õ€|Ž¡‘ X.‘~.–>\.“.’§õ€.Ž¡‘ X.‘~.–>\.“.’§õ€.Ž¡‘ X.‘~.–>\.“.’§õ€.Ž¡‘ X|‘~|‘9¼d|’§õ€|Ž¡‘ X|‘~|‘9¼d|’§õ€|Ž¡– X------>|‘¿Task‘?¬N“|<--------------------------------Ž¡‘/= |‘9¼d|Ž¡‘/= |___________|Ž¡¡‘>üTask–?¬Switching“basato“sul“TimeSliceŽ¡¦¹Un–U tipico“Timeslice“pGer“Linš¸èux“e'“di“circa“10“ms“(in“alcune“arc˜hitetture“1“ms).ŽŽŽŒ‹ jh Û_2 ý ~?Ÿ„€ÕÁGŽÄ3.‘ñ8Rapido–Õtour“del“Lin®>ux“Kernel’#ìe¹13ŽŽ ÕÁ ýV¯¤ ®¡‘?¬º|‘9¼d|Ž¡–?¬|‘9¼d|“Accesso‘>\_____________________________Ž¡–?¬|‘¿Task“1‘ X|----------->|(1)“Accoda“richiesta“risorsa“|Ž¡–?¬|‘9¼d|“Risorsa‘þ°|(2)“Marca“Task“come“bloccato“|Ž¡–?¬|‘9¼d|‘>ü|(3)“Scegli“un“Task“Pronto‘þ°|Ž¡–?¬|___________|‘>ü|(4)‘þ°Task“Switching‘)ý`|Ž¡’ˆwx|_____________________________|Ž¡’̳4|Ž¡’̳4|Ž¡‘?¬|‘9¼d|’ƒ7Ì|Ž¡‘?¬|‘9¼d|’ƒ7Ì|Ž¡–?¬|‘¿Task“2‘ X|<-------------------------Ž¡‘?¬|‘9¼d|Ž¡‘?¬|‘9¼d|Ž¡‘?¬|___________|Ž¡¡‘>\Task–?¬Switching“basato“sull'attesa“di“una“risorsaŽ¡Ÿ#ÃÂ3.5Ž‘¾Microk ernel–¸vs“Monolitico“OSŽ¤MªÄ3.5.1Ž‘#!\IndtroQÂduzioneŽ¡¹Fino–adesso“abbiamo“visto“i“cosiddetti“OS‘öMonolitici,‘! ma“esiste“anc¸èhe“un'altra“famiglia“di“OS,“quella“basataŽ¤ ®sui‘U Microk¸èernel.ŽŸؼUn–Y@OS‘Y?basato“su“Microk¸èernel“utilizza“i“T‘ÿ*¸asks,‘ZGnon“solo“pšGer“i“pro˜cessi“in“User“Mo˜de,‘ZGma“anc¸èhe“come“gestoriŽ¡del–U Kernel,“come“il“Flopp¸èy-T›ÿ*¸ask,“l'HDD-T˜ask,“il“Net-T˜ask“e“cosi'“via.‘q€Alcuni“esempi“sono“AmoGeba“e“Mac¸èh.ŽŸ ÖÄ3.5.2Ž‘#!\PRš®>O–Õe“CONTR˜O“degli“OS“basati“su“Microk˜ernelŽŸMª¹PR¸èO:Ž©ؼ‘¸ŽŽŽ‘¹L'OS‘±e'–Æpiu'“semplice“da“gestire“pšGerc¸èhe'“il“T‘ÿ*¸ask“e'“l'unita'“base“di“tutti“i“devices:‘GÓquindi“p˜er“gestisce“adŽ¡‘esempio–hla“rete“basta“mošGdicare“il“Net-T‘ÿ*¸ask“(in“teoria“e“se“non“e'“necessaria“una“mo˜dica“strutturale).Ž¦CONTR¸èO:Ž¦‘¸ŽŽŽ‘¹Le– bprestazioni“sono“pšGeggiori“risp˜etto“agli“OS‘ ¯Monolitici“in“quan¸èto“e'“necessario“un“p˜erio˜do“diŽ¡‘2*T‘ÿ*¸ASK_SWITCHING‘ØCin–اpiu'“pšGer“gestire“i“devices“(il“primo“p˜er“enš¸ètrare“nel“T‘ÿ*¸ask“men˜tre“il“sec-Ž¡‘ondo–+’pšGer“ritornare“al“pro˜cesso“in¸èterrotto):‘\¹in“eetti“questo“temp˜o“e'“assolutamen¸ète“necessario“nel“casoŽ¡‘di–U sistema“Monolotico.Ž¦La–b8mia“opinione“pGersonale“e'“cš¸èhe“gli“OS‘b5Microk˜ernel“sono“un“buon“esempio“didattico“(come“Minix)“ma“nonŽ¡sono–U ottimali‘*h(cioGe'“partono“gia'“male“come“prestazioni)“quindi“non“sono“da“considerarsi“come“buoni“OS.ŽŸؼLinš¸èux–4)utilizza“alcuni“T‘ÿ*¸asks,‘kìc˜hiamati“"Kernel“Threads"“pGer“implemen˜tare“un“mini“struttura“microk˜ernel,Ž¡laddo•¸èv“e–\Áe'“evidenš¸ète“c˜he“le“il“tempGo“di“accesso“di“un“T‘ÿ*¸ask“Switc˜hing“sia“notev˜olmen˜te“trascurabile“(comeŽ¡ksw•¸èapGd,›U c“he˜serv“e˜p•Ger˜recup“erare˜pagine˜dalla˜memoria˜di˜massa).ŽŽŽŒ‹r Û_2 ý ~?Ÿ„€ÕÁGŽÄ3.‘ñ8Rapido–Õtour“del“Lin®>ux“Kernel’#ìe¹14ŽŽ ÕÁ ýV¯Â3.6Ž‘¾ReteŽ¤MªÄ3.6.1Ž‘#!\Liv®>elli–ÕISO“OSIŽ¡¹Lo–U Standard“ISO-OSI“descrivš¸èe“un'arc˜hitettura“di“rete“con“i“seguen˜ti“liv˜elli:Ž©ؼ‘ 9b1.ŽŽŽ‘Liv¸èello–U Fisico“(esempi:‘q€PPP“ed“Ethernet)Ž¤®‘ 9b2.ŽŽŽ‘Liv¸èello–U Data-link“(esempi:‘q€PPP“ed“Ethernet)Ž¡‘ 9b3.ŽŽŽ‘Liv¸èello–U di“Rete“(esempi:‘q€IP‘ÿ*¸,“e“X.25)Ž¡‘ 9b4.ŽŽŽ‘Liv¸èello–U di“T›ÿ*¸ranspGorto“(esempi:‘q€TCP˜,“UDP)Ž¡‘ 9b5.ŽŽŽ‘Liv¸èello–U di“Sessione“(esempio:‘q€SSL)Ž¡‘ 9b6.ŽŽŽ‘Livš¸èello–U di“Presen˜tazione“(esempio:‘q€cošGdica“binary-ascii“sul“proto˜collo“FTP)Ž¡‘ 9b7.ŽŽŽ‘Liv¸èello–U Applicazione“(esempio:‘q€NetscapGe)Ž¦I‘Sªprimi–S«2“livš¸èelli“sono“di“solito“implemen˜tati“in“hardw˜are“men˜tre“i“liv˜elli“successivi“in“soft˜w˜are“(o“in“rm˜w˜areŽŸ ®pGer–U i“routers).Ž¤ؼUn–U OS“e0“capace“di“gestire“molti“protošGcolli:‘q€uno“di“questi“e'“il“TCP/IP“(il“piu'“imp˜ortanš¸ète“sui“liv˜elli“3-4).ŽŸ ÖÄ3.6.2Ž‘#!\Che–Õcosa“fa“il“k®>ernel?ŽŸMª¹Il–U Kernel“non“conosce“nš¸èulla“dei“primi“2“liv˜elliŽ¡In–U RX“l'OS:Ž¦‘ 9b1.ŽŽŽ‘Gestisce–o(il“dialogo“a“basso“livš¸èello“con“i“devices“(come“sc˜hede“ethernet“o“moGdem)“ricev˜endo“i“pacc˜hettiŽŸ ®‘dall'hardw¸èare,Ž¤®‘ 9b2.ŽŽŽ‘Costruisce–U pacc¸èhetti‘*hTCP/IP“partendo“da“frames"“(come“Ethernet“o“PPP),Ž¡‘ 9b3.ŽŽŽ‘Con•¸èv“erte–U i“paccš¸èhetti“in“soGc˜k˜ets‘*hpassandoli“al“giusto“applicativ˜o“(grazie“al“n˜umero“di“pGorta)“oppureŽ¡‘ 9b4.ŽŽŽ‘Instrada–U i“pacc¸èhetti‘*hnella“giusta“coGdaŽ¦ºframes‘/= pacchetti‘>üsocketsŽ¤ ®NIC–?¬--------->“Kernel“---------->“ApplicazioneŽ¡‘^z|‘þ°pacchettiŽ¡‘^z-------------->‘?¬InstradamentoŽ¡‘}ø -–?¬RX“-Ž¦¹Nello–U stadio“di“TX“l'OS:Ž¦‘ 9b1.ŽŽŽ‘Con•¸èv“erte–U i“soGc•¸èk“ets‘*hoppureŽ¤®‘ 9b2.ŽŽŽ‘I–U dati“accoGdati“in“pacc¸èhetti‘*hTCP/IPŽ¡‘ 9b3.ŽŽŽ‘Espande–U i“pacc¸èhetti"“in“frames‘*h(come“Ethernet“o“PPP)Ž¡‘ 9b4.ŽŽŽ‘Manda–U i“frames‘*hutilizzando“i“devices“Hardw¸èareŽŽŽŒ‹|e Û_2 ý ~?Ÿ„€ÕÁGŽÄ3.‘ñ8Rapido–Õtour“del“Lin®>ux“Kernel’#ìe¹15ŽŽ ÕÁ ýV¯ºsockets‘$½´packets‘n9framesŽ¤ ®Application–?¬--------->“Kernel“---------->“NICŽ¡‘I{hpackets‘>\/|\Ž¡Forward‘ X-------------------Ž¡‘}ø -–?¬TX“-Ž¡Ÿ#ÃÂ3.7Ž‘¾Memoria‘¸VirtualeŽ¤MªÄ3.7.1Ž‘#!\Segmen®>tazioneŽ¡¹La–m2Segmen¸ètazione“e'“il“primo“metošGdo“p˜er“risolv¸èere“i“problemi“di“allo˜cazione“di“memoria:‘¡£questa“tecnicaŽ¤ ®pšGermette–ˆïdi“compilare“il“co˜dice“sorgen¸ète“senza“preo˜ccuparsi“di“do•¸èv“e–ˆïi“dati“v¸èerranno“eseguiti“o“memorizzati.Ž¡In–±±eetti“questa“feature“e'“di“grande“aiuto“nello“sviluppare“di“applicazioni“in“mošGdo“indip˜enden¸ète“dall'OS‘±™eŽ¡dall'Hardw¸èare.Ž©ؼ¡‘>üº|‘$½´Stack‘4|¸|Ž¡‘>ü|‘4|¸|‘9¼d|Ž¡‘>ü|‘/= \|/‘4|¸|Ž¡‘>ü|‘þ°Spazio‘?¬Libero‘>\|Ž¡‘>ü|‘/= /|\‘4|¸|‘>\Segmento–?¬<--->“ProcessoŽ¡‘>ü|‘4|¸|‘9¼d|Ž¡‘>ü|‘)ý`Heap‘4|¸|Ž¡‘>ü|Dati–?¬non“inizializzati|Ž¡‘>ü|– XDati‘?¬inizializzati“|Ž¡‘>ü|‘$½´Codice‘/= |Ž¡‘>ü|______________________|Ž¡¡‘c¹ÄSegmentoŽ¦¹Pš¸èossiamo–;Ðdire“c˜he“un“segmen˜to“e'“la“traspGosizione“logica“di“un'applicazione“in“memoria,‘@ào“anc˜he“l'immagineŽ¡dell'applicazione.Ž©ؼQuando–ecsi“programmiamo“non“ci“inš¸èteressiamo“di“do˜v˜e“esattamen˜te“i“dati“v‘ÿqÐadano“a“nire“in“memoria,‘©sciŽ¡preoGccupiamo–U soltanš¸èto“dell'oset“all'in˜terno“del“segmen˜to“(quindi“dell'applicazione).Ž¦Siamo–HÎsoliti“attribuire“quindi,‘KEun“Segmenš¸èt“ad“ogni“ProGcesso“e“vicev˜ersa.‘meIn“Lin˜ux“questo“non“e'“v˜ero“no“inŽ¡fondo,–U in“quanš¸èto“v˜engono“usati“soltan˜to“4“segmen˜ti“pšGer“il“Kernel“e“tutti“i“Pro˜cessi.ŽŸ ÖÄProblemi–Õdella“Segmen®>tazioneŽŸؼ¡’­5,º____________________Ž¡’ˆwx----->|‘hùp|----->Ž¡’ˆwx|–?¬IN‘ X|›>\Segmento“A˜|“OUTŽ¡‘?¬____________________–>\|“|____________________|Ž¡|–hùp|____|‘>\|“|Ž¡|–>\Segmento›?¬B“|‘4|¸|“Segmento˜B“|Ž¡|–hùp|____‘~|“|Ž¡|____________________|‘þ°|‘>\|____________________|ŽŽŽŒ‹„ó Û_2 ý ~?Ÿ„€ÕÁGŽÄ3.‘ñ8Rapido–Õtour“del“Lin®>ux“Kernel’#ìe¹16ŽŽ ÕÁ ýV¯’ˆwxº|–>\|“Segmento‘?¬C“|Ž¤ ®’ˆwx|‘>\|____________________|Ž¡’ˆwx----->|–>\Segmento‘?¬D“|----->Ž¡’’öÐIN‘ X|____________________|‘?¬OUTŽ¡¡‘n9Problema–?¬della“SegmentazioneŽ¡Ÿ6¹Nel–U diagramma“v¸èogliamo“disallošGcare“i“pro˜cessi“A“e“D“ad“allo˜care“il“pro˜cesso“B.Ž©ؼCome–]si“puo'“v¸èedere“ci“sarebbšGe“abbastanza“spazio“p˜er“B,“ma“in“pratica“non“p˜ossiamo“splittarlo“in“2“p˜ezzi“eŽ¡quindi–U NON“POSSIAMO“caricarlo“(manca“memoria!).Ž¦La–oragione“di“fondo“di“cio'“e“cš¸èhe“i“segmen˜ti“puri“sono“aree“con˜tigue“proprio“pGerc˜he'“sono“aree“logic˜he“(diŽ¡prošGcesso)–U e“quindi“non“p˜ossono“essere“divise.ŽŸ Ž»Ä3.7.2Ž‘#!\P®>aginazioneŽŸMª¡‘D;¼º____________________Ž¡‘>ü|‘>\Pagina‘?¬1‘$½´|Ž¡‘>ü|____________________|Ž¡‘>ü|‘>\Pagina‘?¬2‘$½´|Ž¡‘>ü|____________________|Ž¡–>ü|‘~..“|‘>\Segmento–?¬<--->“ProcessoŽ¡‘>ü|____________________|Ž¡‘>ü|‘>\Pagina‘?¬n‘$½´|Ž¡‘>ü|____________________|Ž¡‘>ü|‘hùp|Ž¡‘>ü|____________________|Ž¡‘>ü|‘hùp|Ž¡‘>ü|____________________|Ž¡¡‘c¹ÄSegmentoŽ¡Ÿ:U¹La–U P¸èaginazione“divide“la“memoria“in“º"¹Nº"“¹pGezzi,“tutti“a“lunghezza“ssa.Ž¦Un–Ü prošGcesso“puo'“essere“caricato“in“una“o“piu'“pagine.‘?Quando“un“pro˜cesso“viene“disallo˜cato,‘ýÅtutte“le“sueŽ¡pagine–U vš¸èengono“libGerate“(v˜edi“Problema“della“Segmen˜tazione,“prima).Ž¦La–žpPš¸èaginazione“viene“sfruttata“anc˜he“pšGer“un“altro“imp˜ortan¸ète“scop˜o:›!lo“"Sw¸èapping":˜se“una“pagina“infattiŽ¡non–Ãée'“presenš¸ète“in“memoria“sica“viene“generata“un'ECCEZIONE‘ÃÌ,“c˜he“fara'“cercare“al“Kernel“una“paginaŽ¡in–Iªmemoria“di“massa.‘OQuesto“meccanismo“pšGermette“all'OS‘Ikdi“caricare“piu'“applicazioni“risp˜etto“a“quelleŽ¡realmenš¸ète–U caricabili“soltan˜to“in“memoria“sica.ŽŸ Ž»ÄProblema–Õdella“P®>aginazioneŽŸ6‘D;¼º____________________Ž¡‘¿Pagina–?¬X“|›>\Processo“Y˜|Ž¡‘>ü|____________________|Ž¡‘>ü|‘hùp|Ž¡‘>ü|–$½´SPAZIO“|ŽŽŽŒ‹ŒÓ Û_2 ý ~?Ÿ„€ÕÁGŽÄ3.‘ñ8Rapido–Õtour“del“Lin®>ux“Kernel’#ìe¹17ŽŽ ÕÁ ýV¯‘>üº|–þ°INUTILIZZATO“|Ž¤ ®‘>ü|____________________|Ž¡¡‘4|¸Problema–?¬della“PaginazioneŽ¡Ÿؼ¹Nel–ùdiagramma“pšGossiamo“notare“qual“e'“il“problema“della“P¸èaginazione:‘C~quando“un“Pro˜cesso“Y‘ùviene“caricatoŽ¡nella–egPš¸èagina“X,“TUTTO‘e!la“spazio“di“memoria“viene“alloGcato,‘©ycosicc˜he'“il“rimanen˜te“spazio“in“fondo“allaŽ¡pagina–U rimanga“in¸èutilizzato.ŽŸ ÖÄ3.7.3Ž‘#!\Segmen•®>tazione‘ÕP“aginataŽŸMª¹Come–U pGossiamo“risolvš¸èere“i“problemi“di“segmen˜tazione“e“paginazione?‘q€Utilizzando“en˜tram˜bšGe“le“p˜olitic¸èhe.Ž©ؼ¡’²tغ|‘~..‘>ü|Ž¡’²tØ|____________________|Ž¡’’öÐ----->|–~Pagina‘?¬1“|Ž¡’’öÐ|‘>\|____________________|Ž¡’’öÐ|‘>\|‘~..‘>ü|Ž¡‘?¬____________________‘$½´|‘>\|____________________|Ž¡|‘hùp|–~|---->|“Pagina‘?¬2“|Ž¡|–>\Segmento‘?¬X“|‘ X----|“|____________________|Ž¡|‘hùp|‘~|‘>\|‘$½´..‘9¼d|Ž¡|____________________|‘~|‘>\|____________________|Ž¡’’öÐ|‘>\|‘$½´..‘9¼d|Ž¡’’öÐ|‘>\|____________________|Ž¡’’öÐ|---->|–~Pagina‘?¬3“|Ž¡’²tØ|____________________|Ž¡’²tØ|‘$½´..‘9¼d|Ž¡¦¹Il–U ProGcesso“X,“idenš¸èticato“dal“Segmen˜to“X,“viene“diviso“in“3“pšGezzi“ognino“p˜oi“caricato“in“una“pagina.ŽŸؼNon‘U abbiamo:Ž¦‘ 9b1.ŽŽŽ‘Problemi–;”di“Segmenš¸ètazione“pGerc˜he'“alloGc˜hiamo“pGer“P˜agine,‘sãquindi“libGeriamo“anc˜he“pGer“P˜agine“e“gestiamoŽ¡‘lo–U spazio“libGero“in“maniera“ottimale.ŽŸ®‘ 9b2.ŽŽŽ‘Problemi– di“P•¸èaginazione:‘?soltan“to– l'ultima“pagina“lascia“dello“spazio“in¸èutilizzato,‘ĸma“pGossiamo“decidereŽ¡‘di–®éutilizzare“delle“pagine“molto“piccole,‘[ad“esempio“lunghe“4096“b¸èytes“(pGerdendo“cosi'“al“massimoŽ¡‘4096*N_T‘ÿ*¸asks–U b¸èytes)“e“attuando“una“allošGcazione“di“tip˜o“gerarcš¸èhico“(con“2“o“3“lev˜elli“di“paginazione)Ž¦¡¡¡’ˆwxº|–/= |‘9¼d|“|Ž¡’ˆwx|‘/= |‘¿Offset2–?¬|“Valore‘ X|Ž¡’ˆwx|–/= |‘)ý`/|\|“|Ž¡‘^zOffset1–?¬|›/= |-----‘þ°|“|˜|Ž¡‘sxÈ/|\›?¬|‘/= |–þ°|“|˜|‘/= |ŽŽŽŒ‹”è Û_2 ý ~?Ÿ„€ÕÁGŽÄ4.‘ñ8Lin®>ux‘ÕStartup’rû¹18ŽŽ ÕÁ ýV¯‘x¸tº|‘ X|–/= |‘þ°|‘¿\|/|“|Ž¤ ®‘x¸t|‘ X|–/= |‘þ°------>|“|Ž¡‘sxÈ\|/‘?¬|–/= |‘9¼d|“|Ž¡–?¬Indirizzo“Base“--------->|–/= |‘9¼d|“|Ž¡–?¬Paginazione‘I{h|“.......“|‘9¼d|“.......“|Ž¡’ˆwx|–/= |‘9¼d|“|Ž¡¡‘sxÈPaginazione‘?¬GerarchicaŽŸ(ÀœÀ4Ž‘ÁLincux‘G\StartupŽŸ¿:¹Il–U Kernel“di“Linš¸èux“inizia“dal“coGdice“C“eseguito“a“partire“dall'etic˜hetta“assem˜bGer“startup_32::ŽŸؼº|startup_32:Ž¡‘¿|start_kernelŽ¡‘~|lock_kernelŽ¡‘~|trap_initŽ¡‘~|init_IRQŽ¡‘~|sched_initŽ¡‘~|softirq_initŽ¡‘~|time_initŽ¡‘~|console_initŽ¡‘~|#ifdef‘?¬CONFIG_MODULESŽ¡‘/= |init_modulesŽ¡‘~|#endifŽ¡‘~|kmem_cache_initŽ¡‘~|stiŽ¡‘~|calibrate_delayŽ¡‘~|mem_initŽ¡‘~|kmem_cache_sizes_initŽ¡‘~|pgtable_cache_initŽ¡‘~|fork_initŽ¡‘~|proc_caches_initŽ¡‘~|vfs_caches_initŽ¡‘~|buffer_initŽ¡‘~|page_cache_initŽ¡‘~|signals_initŽ¡‘~|#ifdef‘?¬CONFIG_PROC_FSŽ¡‘)ý`|proc_root_initŽ¡‘~|#endifŽ¡‘~|#if‘?¬defined(CONFIG_SYSVIPC)Ž¡‘/= |ipc_initŽ¡‘~|#endifŽ¡‘~|check_bugsŽ¡‘~|smp_initŽ¡‘~|rest_initŽ¡‘/= |kernel_threadŽ¡‘/= |unlock_kernelŽ¡‘/= |cpu_idleŽŽŽŒ‹' Û_2 ý ~?Ÿ„€ÕÁGŽÄ4.‘ñ8Lin®>ux‘ÕStartup’rû¹19ŽŽ ÕÁ ýV¯‘¸ŽŽŽ‘¹startup_32‘U [arc•¸èh/i386/k“ernel/head.S]Ž¤Œ‘¸ŽŽŽ‘¹start_k¸èernel‘U [init/main.c]Ž¡‘¸ŽŽŽ‘¹lošGc•¸èk_k“ernel‘U [include/asm/smplo˜c“k.h]Ž¡‘¸ŽŽŽ‘¹trap_init‘U [arc•¸èh/i386/k“ernel/traps.c]Ž¡‘¸ŽŽŽ‘¹init_IR•¸èQ‘U [arc“h/i386/k“ernel/i8259.c]Ž¡‘¸ŽŽŽ‘¹sc•¸èhed_init‘U [k“ernel/sc“hed.c]Ž¡‘¸ŽŽŽ‘¹softirq_init‘U [k¸èernel/softirq.c]Ž¡‘¸ŽŽŽ‘¹time_init‘U [arc•¸èh/i386/k“ernel/time.c]Ž¡‘¸ŽŽŽ‘¹console_init‘U [driv•¸èers/c“har/tt“y_io.c]Ž¡‘¸ŽŽŽ‘¹init_mo•Gdules‘U [k¸èernel/mo“dule.c]Ž¡‘¸ŽŽŽ‘¹kmem_cac¸èhe_init‘U [mm/slab.c]Ž¡‘¸ŽŽŽ‘¹sti‘U [include/asm/system.h]Ž¡‘¸ŽŽŽ‘¹calibrate_dela¸èy‘U [init/main.c]Ž¡‘¸ŽŽŽ‘¹mem_init‘U [arc¸èh/i386/mm/init.c]Ž¡‘¸ŽŽŽ‘¹kmem_cac¸èhe_sizes_init‘U [mm/slab.c]Ž¡‘¸ŽŽŽ‘¹pgtable_cac•¸èhe_init‘U [arc“h/i386/mm/init.c]Ž¡‘¸ŽŽŽ‘¹fork_init‘U [k¸èernel/fork.c]Ž¡‘¸ŽŽŽ‘¹proGc_cac¸èhes_initŽ¡‘¸ŽŽŽ‘¹vfs_cac•¸èhes_init‘U [fs/dcac“he.c]Ž¡‘¸ŽŽŽ‘¹buer_init‘U [fs/buer.c]Ž¡‘¸ŽŽŽ‘¹page_cac¸èhe_init‘U [mm/lemap.c]Ž¡‘¸ŽŽŽ‘¹signals_init‘U [k¸èernel/signal.c]Ž¡‘¸ŽŽŽ‘¹pro•Gc_ro“ot_init‘U [fs/pro“c/ro“ot.c]Ž¡‘¸ŽŽŽ‘¹ip•Gc_init‘U [ip“c/util.c]Ž¡‘¸ŽŽŽ‘¹c•¸èhec“k_bugs‘U [include/asm/bugs.h]Ž¡‘¸ŽŽŽ‘¹smp_init‘U [init/main.c]Ž¡‘¸ŽŽŽ‘¹rest_initŽ¡‘¸ŽŽŽ‘¹k•¸èernel_thread‘U [arc“h/i386/k“ernel/proGcess.c]Ž¡‘¸ŽŽŽ‘¹unlošGc•¸èk_k“ernel‘U [include/asm/smplo˜c“k.h]Ž¡‘¸ŽŽŽ‘¹cpu_idle‘U [arc•¸èh/i386/k“ernel/proGcess.c]Ž¤ƒ´L'ultima–U funzione“rest_init:Ž¡‘ 9b1.ŽŽŽ‘lancia–U il“Kernel“Thread“initŽŽŽŒ‹¢ Û_2 ý ~?Ÿ„€ÕÁGŽÄ5.‘ñ8Pš®>eculiarita'–Õdi“Lin˜ux’R‡´¹20ŽŽ ÕÁ ýV¯‘ 9b2.ŽŽŽ‘c•¸èhiama‘U unloGc“k_k“ernelŽ©®‘ 9b3.ŽŽŽ‘Esegue–­½il“lošGop“innito“cpu_idle,‘Ï7in“attesa“c¸èhe“altri“pro˜cessi“con“maggiore“priorita'“vš¸èengano“sc˜hedulati.Ž¤ؼIn–U eetti“la“funzione“start_k¸èernel‘*hnon“nisce“mai.ŽŸؼSegue–U la“descrizione“di“init“cš¸èhe“e'“il“primo“k˜ernel_thread“in“esecuzione“(c˜he“lanciera'“pGoi“tutti“gli“altri)Ž¡º|initŽ¤ ®‘¿|lock_kernelŽ¡‘¿|do_basic_setupŽ¡‘~|mtrr_initŽ¡‘~|sysctl_initŽ¡‘~|pci_initŽ¡‘~|sock_initŽ¡‘~|start_context_threadŽ¡‘~|do_init_callsŽ¡‘/= |(*call())->‘?¬kswapd_initŽ¡‘¿|prepare_namespaceŽ¡‘¿|free_initmemŽ¡‘¿|unlock_kernelŽ¡‘¿|execveŽŸ(ÀœÀ5Ž‘ÁPšceculiarita'–G\di“Lin˜uxŽŸèÂ5.1Ž‘¾In tro_úduzioneŽ¤Mª¹Linš¸èux–U pGossiede“alcune“caratteristic˜he“pressoGc˜he'“unic˜he“rispšGetto“agli“altri“OSs.‘q€These“p˜eculiarities“include:ŽŸؼ‘ 9b1.ŽŽŽ‘Utilizzo–U della“sola“P¸èaginazioneŽ¦‘ 9b2.ŽŽŽ‘SoftirqŽ¦‘ 9b3.ŽŽŽ‘Kernel‘U ThreadsŽ¦‘ 9b4.ŽŽŽ‘Kernel‘U MoGdulesŽ¦‘ 9b5.ŽŽŽ‘Directory‘U ProGcŽŸ ÖÄ5.1.1Ž‘#!\Elemen®>ti–Õdi“essibilita'Ž¡¹I‘žôpun¸èti–Ÿ4“e“5“danno“agli“ammistratori“un'enorme“essibilita'“sulla“congurazione“del“sistema“in“User“MoGdeŽ¤ ®pGermettendo–U loro“di“risolvš¸èere“anc˜he“problemi“critici“(come“k˜ernel“bugs)“senza“do˜v˜er“ria˜vviare“la“macc˜hinaŽŸؼAš¸èd–%esempio“se“si“vuol“cam˜biare“qualcosa“nel“Kernel“di“un“grosso“serv˜er“non“e'“necessario“ria˜vviarlo,‘.£bastera'Ž¡preparare–Ñ_la“prima“vš¸èolta“il“k˜ernel“ad“accogliere“un“moGdulo“e,›ðnin“seguito,˜creare“il“mošGdulo“p˜er“eettuare“leŽ¡moGdic•¸èhe‘U v“olute.ŽŸ#ÃÂ5.2Ž‘¾Solo‘¸P aginazioneŽŸMª¹Linš¸èux–Éønon“utilizza“la“Segmen˜tazione“pGer“distinguere“i“T‘ÿ*¸asks“l'uno“dall'altro,‘åÍusa“soltan˜to“la“P˜aginazione“(soloŽ¡2–U segmenš¸èti“v˜engono“utilizzati“in“tutti“i“T‘ÿ*¸asks,“CODE“e“D˜A–ÿ*¸T“A/ST“A˜CK).ŽŽŽŒ‹© Û_2 ý ~?Ÿ„€ÕÁGŽÄ5.‘ñ8Pš®>eculiarita'–Õdi“Lin˜ux’R‡´¹21ŽŽ ÕÁ ýV¯P•¸èossiamo››Ôanc“he˜dire˜c“he˜una˜P“age˜F–ÿ*¸ault‘qtra˜T“ask˜non˜puo'˜mai˜a•¸èvv“enire˜(cioGe'˜quell'ev“en“to˜scatenatoŽ¤ ®quando–Á‹un“T›ÿ*¸ask“vuole“scriv¸èere“sull'area“di“memoria“di“un“altro“T˜ask),‘Ü¥pGoic¸èhe'“ogni“T˜ask“utilizza“un“set“diŽ¡P¸èage–žCT›ÿ*¸ables“(T˜abGelle“di“Pš¸èaginazione)“dieren˜ti“pšGer“ogni“Pro˜cesso:‘Æqueste“tab˜elle“non“p˜ossono“mai“pun¸ètareŽ¡allo–U stesso“indirizzo“sico“(pGer“costruzione).ŽŸ ÖÄ5.2.1Ž‘#!\Segmen•®>ti‘ÕLin“uxŽŸMª¹Sotto–U Linš¸èux“v˜engono“utilizzati“soltan˜to“4“segmen˜ti:Ž©ؼ‘ 9b1.ŽŽŽ‘Kernel–U CoGde“[0x10]Ž¤®‘ 9b2.ŽŽŽ‘Kernel–U Data“/“Stac¸èk“[0x18]Ž¡‘ 9b3.ŽŽŽ‘User–U CoGde“[0x23]Ž¡‘ 9b4.ŽŽŽ‘User–U Data“/“Stac¸èk“[0x2b]Ž¦[La–U sinš¸ètassi“e'“Utilizzo“[Segmen˜to]‘ÕH]ŽŸؼNell'arc•¸èhitettura›U In“tel,˜i˜registri˜di˜segmen“ti˜usati˜sono:Ž¦‘¸ŽŽŽ‘¹CS–U pšGer“il“Co˜de“Segmen¸ètŽ¡‘¸ŽŽŽ‘¹DS–U pGer“il“Data“Segmen¸ètŽ¡‘¸ŽŽŽ‘¹SS–U pGer“lo“Stacš¸èk“Segmen˜tŽ¡‘¸ŽŽŽ‘¹ES‘Á!pGer–Á=l'Alternativš¸èe“Segmen˜t“(usato“ad“esempio“quando“si“vuole“eettuare“una“copia“tra“2“segmen˜tiŽ¤ ®‘dieren¸èti)Ž¦Quindi–U ogni“T‘ÿ*¸ask“utilizza“il“segmen¸èti“0x23“pšGer“il“co˜dice“e“il“segmen¸èti“0x2b“p˜er“data/stac¸èk.Ž© ÖÄ5.2.2Ž‘#!\Pš®>aginazione–Õdi“Lin˜uxŽŸMª¹Linš¸èux–U utilizza“uno“sc˜hema“con“3“lev˜elli“di“paginazione,“a“seconda“dell'arc˜hitecture.ŽŸؼInš¸ètel–·pGermette“di“sfruttare“solo“2“lev˜elli.‘tFP˜er“ottimizzare“l'utilizzo“della“memoria“viene“anc˜he“utilizzato“ilŽ¡meccanismo–U della“Copš¸èy“on“W‘ÿ*¸rite‘*h(si“v˜eda“il“Cap.10“pGer“ulteriori“informazioni).Ž¦Ä5.2.3Ž‘#!\P•®>erc“he'–Õesistono“conitti‘Ê^tra“gli“indirizzi“relativi“a“T‘ÿ ºasks“div®>ersi?ŽŸMª¹La–U rispšGosta“e'“molto“molto“semplice:‘q€i“conitti“tra“indirizzi“sono“imp˜ossibili.ŽŸؼLa–&âmappatura“tra“indirizzi“Lineari-µ>“¹Fisici“viene“gestita“dalla“Pš¸èaginazione,‘0"quindi“e'“sucien˜te“assegnare“leŽ¡pagine–U sicš¸èhe“in“moGdo“univ˜oGco.Ž¦Ä5.2.4Ž‘#!\E'–Õnecessario“deframmen®>tare“la“memoria?ŽŸMª¹No.‘ ²L'assegnazione–‡Ûdelle“P¸èagine“e'“un“prošGcesso“dinamico:‘Ööabbiamo“bisogno“di“allo˜care“una“pagina“soltan¸ètoŽ¡quando–±­un“T‘ÿ*¸ask“lo“ric¸èhiede“e“quindi“pšGossiamo“sceglierlo“tra“le“pagine“di“memoria“lib˜ere“in“mo˜do“ordinato.Ž¡Quando–U vš¸èogliamo“rilasciare“una“pagina“dobbiamo“soltan˜to“aggiungerla“nella“free“page“list.ŽŽŽŒ‹± Û_2 ý ~?Ÿ„€ÕÁGŽÄ5.‘ñ8Pš®>eculiarita'–Õdi“Lin˜ux’R‡´¹22ŽŽ ÕÁ ýV¯Ä5.2.5Ž‘#!\E–Õle“pagine“del“Kernel?ŽŸMª¹Lo–Büspazio“del“Kernel“ha“una“caratteristica:‘ènlo“spazio“Lineare“coincide“con“quello“Fisico“(questo“pGer“semplicareŽ¤ ®la–>vita!).‘iúQuesta“pšGeculiarita'“comp˜orta“c¸èhe“sia“necessario“allo˜care“una“v¸èolta“p˜er“tutte“un“blo˜cco“di“memoriaŽ¡senza–ÚËpšGoi“p˜ossibilita'“alcuna“di“aggiungere“un“altro“blo˜cco“in“mo˜do“CONTIGUO‘Ú©(non“lo“si“puo'“garan¸ètireŽ¡pšGerc¸èhe'–U vi“p˜ossono“essere“altre“pagine“in“User“Mo˜de“in“mezzo!).Ž©ؼT‘ÿ*¸utto–Wžcio'“non“pšGorta“a“grossi“problemi“p˜er“quanš¸èto“riguarda“il“CODICE‘Win“quan˜to“esso“non“moGdica“a“Run-Ž¡Time–¡3la“propria“dimensione“(si“in¸ètende“la“dimensione“in“maniera“CONTIGUA),“bastera'“quindi“alloGcare“laŽ¡prima–U vš¸èolta“uno“spazio“di“memoria“sucien˜te“e“non“si“a˜vranno“problemi.Ž¦Il–è’problema“vš¸èero“si“ha“nel“caso“dello“ST‘ÿ*¸A˜CK,“in“quan˜to“ogni“prošGcesso“(in“Kernel“Mo˜de)“utilizza“1“paginaŽ¡di–xäKernel“Stacš¸èk:‘¹com'e'“noto“lo“Stac˜k“e'“una“struttura“dati“c˜he“ric˜hiede“di“essere“CONTIGUA,“quindi,‘ÕunaŽ¡vš¸èolta–U stabilito“il“limite“massimo“pGer“lo“stac˜k“(come“detto“1“pagina)“non“lo“si“pGotra'“piu'“aumen˜tare.Ž¦Se–Ó2si“do•¸èv“esse–Ó2utilizzare“lo“Stacš¸èk“oltre“lo“spazio“consen˜tito“vi“sarebbGe“una“scrittura“sulle“strutture“dati“relativ˜eŽ¡al–U prošGcesso“in“questione“(in“Kernel“Mo˜de).Ž¦F‘ÿ*¸ortunatamenš¸ète–U la“struttura“del“Kernel“ci“aiuta,“in“quan˜to“le“funzioni“del“sistema:Ž¤ؼ‘¸ŽŽŽ‘¹Non–U sono“mai“Ricorsiv¸èeŽŸ®‘¸ŽŽŽ‘¹Non–U si“cš¸èhiamano“mai“piu'“di“N“v˜olte“l'una“con“l'altraŽ¡Una–fÔvš¸èolta“noto“N,“e“una“v˜olta“noto“il“massimo“utilizzo“di“stac˜k“da“parte“delle“funzioni“del“Kernel“c˜hiamateŽ¤ ®si–U pšGotra'“a•¸èv“ere–U la“giusta“stima“p˜er“lo“Stac¸èk.Ž¦P•¸èer›š"v“ericare˜il˜problema˜e'˜sucien“te˜creare˜un˜moGdulo˜c“he˜abbiam˜una˜funzione˜ricorsiv‘ÿqÐa˜c“he˜si˜ric“hiamiŽ¡un–EAcerto“nš¸èumero“di“v˜olte.‘l6DopGo“un“certo“n˜umero“di“v˜olte“il“Kernel“si“bloGcc˜hera'“generando“una“eccezione“diŽ¡page‘U fault.ŽŸ#ÃÂ5.3Ž‘¾SoftIrqŽŸMª¹Quando–U arriv‘ÿqÐa“un“IRš¸èQ,“il“T‘ÿ*¸ask“Switc˜hing‘*hviene“pšGosticipato“p˜er“non“in¸ètaccare“le“prestazioni“del“sistema.Ž¦Alcuni›«žla•¸èv“ori˜(c“he˜pGossono˜essere˜eseguiti˜tranquillamen“te˜anc“he˜dopGo˜l'IR“Q‘«ˆe˜c“he˜consumano˜molta˜CPU,Ž¡come–ööla“costruzione“di“un“paccš¸èhetto“TCP/IP)‘öÞv˜engono“accošGdati“p˜er“essere“p˜oi“eseguiti“duranš¸ète“lo“sc˜hedulingŽ¡(una–U vš¸èolta“cioGe'“c˜he“il“TimeSlice“dell'attuale“proGcesso“e'“terminato).Ž¦Nei–0Kernels“recen¸èti“(2.4.x)“il“meccanismo“"SoftIrq‘exviene“gestito“da“un“Kernel“Thread:‘ç ksoftirqd_CPUn,Ž¡do•¸èv“e–*n“sta'“pGer“il“nš¸èumero“di“CPU‘c˜he“sta“eseguendo“il“tale“Thread“(in“un“sistema“monoproGcessore“il“nome“e'Ž¡ksoftirqd_CPU0‘*ha•¸èv“en“te–U PID“3).ŽŸ ÖÄ5.3.1Ž‘#!\Preparazione–Õdei“SoftIrqŽ¤Mª5.3.2Ž‘#!\Abilitazione–Õdei“SoftIrqŽ¡¹cpu_raise_softirq‘Ó(e'–ýàla“routine“cš¸èhe“sv˜eglia“il“Kernel“Thread“ksoftirqd_CPU0‘Ó(c˜he“gestira'“pGoi“il“la˜v˜oroŽ¤ ®accoGdato:ŽŸؼº|cpu_raise_softirqŽ¡‘¿|__cpu_raise_softirqŽ¡‘¿|wakeup_softirqdŽ¡‘~|wake_up_processŽŽŽŒ‹»± Û_2 ý ~?Ÿ„€ÕÁGŽÄ5.‘ñ8Pš®>eculiarita'–Õdi“Lin˜ux’R‡´¹23ŽŽ ÕÁ ýV¯‘¸ŽŽŽ‘¹cpu_raise_softirq‘U [k¸èernel/softirq.c]Ž¤®‘¸ŽŽŽ‘¹__cpu_raise_softirq‘U [include/lin•¸èux/in“terrupt.h]Ž¡‘¸ŽŽŽ‘¹w•¸èak“eup_softirq‘U [k“ernel/softirq.c]Ž¡‘¸ŽŽŽ‘¹w•¸èak“e_up_proGcess‘U [k“ernel/sc“hed.c]Ž©ؼLa–àžroutine“‘ÕH__cpu_raise_softirq‘µæattiv‘ÿqÐa“il“bit“giusto“relativš¸èo“a“la˜v˜oro“in“questione“sul“v˜ettore“della“coGdaŽŸ ®SoftIrq.Ž¤ؼw•¸èak“eup_softirq›*husa‘U w“ak“eup_pro•Gcess˜p“er–U sv¸èegliare“il“Kernel“Thread“ksoftirqd_CPU0.ŽŸ ÖÄ5.3.3Ž‘#!\Esecuzione–Õdei“SoftirqŽŸMª¹D•¸èAF‘þã ARE:›U descriv“ere˜la˜struttura˜dati˜del˜meccanismo˜SoftIrq.Ž¡Quando–U ksoftirqd_CPU0‘*hsi“svš¸èeglia,“andra'“ad“eseguire“i“la˜v˜ori“accoGdati.Ž¡Il–U coGdice“di“ksoftirqd_CPU0‘*h(ciclo“principale)“e':Ž¦ºfor–?¬(;;)“{Ž¤ ®‘¿if‘?¬(!softirq_pending(cpu))Ž¡‘~schedule();Ž¡‘~__set_current_state(TASK_RUNNING);Ž¡‘¿while–?¬(softirq_pending(cpu))“{Ž¡‘~do_softirq();Ž¡‘~if‘?¬(current->need_resched)Ž¡‘/= scheduleŽ¡‘¿}Ž¡‘¿__set_current_state(TASK_INTERRUPTIBLE)Ž¡}Ž¦‘¸ŽŽŽ‘¹ksoftirqd‘U [k¸èernel/softirq.c]ŽŸ#ÃÂ5.4Ž‘¾Kernel‘¸ThreadsŽŸMª¹SebbšGene–EãLin¸èux“sia“un“OS‘EžMonolitico,‘|"esistono“alcuni“Kernel“Threads‘+p˜er“eseguire“del“la•¸èv“oro–Eãdi“man¸èutenzioneŽ¡del‘U sistema.Ž©ؼQuesti–†ŠT‘ÿ*¸asks“non“utilizzano“memoria“UTENTE,“ma“condividono“quella“del“KERNEL;“opGerano“al“piu'“altoŽ¡privilegio–U (RING“0“su“arc¸èhitettura“386+)“come“ogni“altro“coGdice“del“Kernel.Ž¦I‘”ÉKernel–•Threads“vš¸èengono“creati“dalla“funzione“k˜ernel_thread“[arc˜h/i386/k˜ernel/proGcess],‘åc˜he“v‘ÿqÐa“pGoi“aŽ¡cš¸èhiamare–ónla“System“Call“clone‘ȶ[arc˜h/i386/k˜ernel/proGcess.c]“in“assem˜bler“(c˜he“praticamen˜te“e'“come“laŽ¡fork):ŽŸؼºint–?¬kernel_thread(int“(*fn)(void“*),“void“*“arg,“unsigned“long“flags)Ž¡{Ž¡‘)ý`long–?¬retval,“d0;Ž¡¡‘)ý`__asm__‘?¬__volatile__(Ž¡‘SúÀ"movl‘?¬%%esp,%%esi\n\t"Ž¡‘SúÀ"int–?¬$0x80\n\t"‘/= /*“Linux/i386“system“call“*/ŽŽŽŒ‹È© Û_2 ý ~?Ÿ„€ÕÁGŽÄ5.‘ñ8Pš®>eculiarita'–Õdi“Lin˜ux’R‡´¹24ŽŽ ÕÁ ýV¯‘SúÀº"cmpl–?¬%%esp,%%esi\n\t"‘ X/*“child“or“parent?“*/Ž¤ ®‘SúÀ"je–?¬1f\n\t"‘D;¼/*“parent“-“jump“*/Ž¡‘SúÀ/*–?¬Load“the“argument“into“eax,“and“push“it.‘ XThat“way,“it“doesŽ¡‘Y:l*–?¬not“matter“whether“the“called“function“is“compiled“withŽ¡‘Y:l*–?¬-mregparm“or“not.‘ X*/Ž¡‘SúÀ"movl‘?¬%4,%%eax\n\t"Ž¡‘SúÀ"pushl‘?¬%%eax\n\t"Ž¡‘SúÀ"call–?¬*%5\n\t"‘4|¸/*“call“fn“*/Ž¡‘SúÀ"movl–?¬%3,%0\n\t"‘)ý`/*“exit“*/Ž¡‘SúÀ"int‘?¬$0x80\n"Ž¡‘SúÀ"1:\t"Ž¡‘SúÀ:"=&a"–?¬(retval),“"=&S"“(d0)Ž¡‘SúÀ:"0"–?¬(__NR_clone),“"i"“(__NR_exit),Ž¡‘Y:l"r"–?¬(arg),“"r"“(fn),Ž¡‘Y:l"b"–?¬(flags“|“CLONE_VM)Ž¡‘SúÀ:‘?¬"memory");Ž¡‘)ý`return‘?¬retval;Ž¡}Ž©ý¢¹Una–ßÕvš¸èolta“c˜hiamata,‘‚a˜vremo“un“n˜uo˜v˜o“T‘ÿ*¸ask“(di“solito“con“PID‘ß±molto“basso,›‚come“2,3,˜ecc.)‘žall'in¸èterno“diŽ¡un–Ü ciclo“innito“in“attesa“di“una“risorsa“molto“lenš¸èta,‘ýÅcome“lo“sw˜ap“o“un“ev˜en˜to“usb“(soltan˜to“risorse“len˜teŽ¡altrimenš¸èti–U il“tempGo“di“T‘ÿ*¸ask“Switc˜hing“p•Gotrebb“e–U inuenzare“negativ‘ÿqÐamen˜te“le“prestazioni“del“sistema)ŽŸؼSegue–U una“lista“dei“piu'“com¸èuni“Kernel“Threads“(dal“comando“ps“x):Ž¦ºPID‘~COMMANDŽ¡‘?¬1‘)ý`initŽ¡‘?¬2‘)ý`keventdŽ¡‘?¬3‘)ý`kswapdŽ¡‘?¬4‘)ý`kreclaimdŽ¡‘?¬5‘)ý`bdflushŽ¡‘?¬6‘)ý`kupdatedŽ¡‘?¬7‘)ý`kacpidŽ¡67‘)ý`khubdŽ¦¹'init'–ÌAe'“il“primo“proGcesso“creato,‘ç¡cš¸èhe“c˜hiamera'“tutti“gli“altri“T‘ÿ*¸asks“in“User“MoGdes“(dal“le“/etc/inittab)“comeŽ¡i–U demoni“di“console,“di“tt¸èy‘ÿ*¸,“di“rete“e“cosi'“via“(rc‘*hscripts).ŽŸ , Ä5.4.1Ž‘#!\Esempio–Õdi“Kernel“Threads:‘ ksw®>apQÂd“[mm/vmscan.c].ŽŸMª¹kswš¸èapGd‘*hviene–U creato“dalla“clone()“[arc˜h/i386/k˜ernel/proGcess.c]ŽŸؼRoutines–U di“inzializzazione:Ž¦º|do_initcallsŽ¡‘¿|kswapd_initŽ¡‘~|kernel_threadŽ¡‘/= |syscall–?¬fork“(in“assembler)Ž¦¹do_initcalls‘U [init/main.c]Ž¤ؼksw¸èapGd_init‘U [mm/vmscan.c]Ž¡k•¸èernel_thread‘U [arc“h/i386/k“ernel/proGcess.c]ŽŽŽŒ‹Ñ Û_2 ý ~?Ÿ„€ÕÁGŽÄ5.‘ñ8Pš®>eculiarita'–Õdi“Lin˜ux’R‡´¹25ŽŽ ÕÁ ýV¯Â5.5Ž‘¾Mo_úduli–¸del“KernelŽ¤MªÄ5.5.1Ž‘#!\In®>troQÂduzioneŽ¡¹I‘áMošGduli–ñdel“Kernel“sono“p˜ezzi“di“co˜dice“(cš¸èhe“gestiscono“ad“esempio“fs,–$-net,“e–ñh˜w“driv˜er)“c˜he“girano“in“MoGdoŽ¤ ®Kernel–U e“cš¸èhe“pGossono“essere“caricati“in“qualunque“momen˜to.Ž©ؼQuasi–|tutto“il“cošGdice“puo'“essere“mo˜dularizzato,›1“tranne“il“core“piu'“in¸èterno“del“Kernel,˜quello“c¸èhe“gestisceŽ¡sc•¸èheduling,›U in“terrupt,˜core˜della˜rete,˜e˜cosi'˜via.Ž¦Nella–U directory“"/lib/mošGdules/KERNEL_VERSION/"“si“tro¸èv‘ÿqÐano“tutti“i“mo˜duli“installati“nel“sistema.ŽŸ ÖÄ5.5.2Ž‘#!\Inserimen®>to–Õe“rimozione“dei“MoQÂduliŽŸMª¹P¸èer–U caricare“un“moGdule,“basta“digitare:Ž©ؼºinsmod–?¬NOME_MODULO“parametriŽ¡¡esempio:–?¬insmod“ne“io=0x300“irq=9Ž¦¹NOT‘ÿ*¸A:–ÊSi“puo'“utilizzare“mo•Gdprob“e‘sal›Êp“osto˜di˜insmo“d‘sp“er˜far˜caricare˜alcuni˜parametri˜in˜automaticoŽ¡(come–î-pšGer“le“p˜eriferic¸èhe“PCI,“oppure“quando“si“sp˜ecicano“i“parametri“nel“le“/etc/conf.mo˜dules“o“nel“n•¸èuo“v“oŽ¡/etc/moGdules.conf‘Ç).ŽŸؼP•¸èer›U rim“uo“v“ere˜un˜moGdulo,˜digitare:Ž¦–?¬ºrmmod“NOME_MODULOŽŸ ÖÄ5.5.3Ž‘#!\Denizione–Õdi“un“MoQÂduloŽŸMª¹Un–U MoGdule“con¸ètiene“sempre“le“funzioniŽ¦‘ 9b1.ŽŽŽ‘init_mošGdule,–U eseguita“dal“comando“insmo˜d‘*h(o“mo˜dprob˜e)Ž¤®‘ 9b2.ŽŽŽ‘clean¸èup_mošGdule‘*hfunction,–U executed“dal“comando“rmmo˜dŽ¦In–U alternativ‘ÿqÐa“si“pšGossono“sp˜ecicare“altre“funzioni“di“inizializzazione“e“c¸èhiusura“tramite“le“macro:Ž¦‘ 9b1.ŽŽŽ‘moGdule_init(FUNCTION_NAME)Ž¡‘ 9b2.ŽŽŽ‘moGdule_exit(FUNCTION_NAME)Ž¦NOT‘ÿ*¸A:–JØun“moGdulo“puo'“vš¸èedere‘ le“v‘ÿqÐariabili“del“Kernel“solo“se“queste“sono“state“preceden˜temen˜te“espGortateŽ¤ ®(nella–U loro“dic¸èhiarazione“(con“la“macro“EXPOR‘ÿ*¸T_SYMBOL).ŽŸ ÖÄ5.5.4Ž‘#!\Un–Õtrucco“utile“pQÂer“rendere“piu'“essibile“il“KernelŽŸMªº//–?¬Parte“kernelŽ¡void–?¬(*foo_function_pointer)(void“*);Ž¡¡if‘?¬(foo_function_pointer)Ž¡‘ X(foo_function_pointer)(parameter);ŽŽŽŒ‹Ù) Û_2 ý ~?Ÿ„€ÕÁGŽÄ5.‘ñ8Pš®>eculiarita'–Õdi“Lin˜ux’R‡´¹26ŽŽ ÕÁ ýV¯¤ ®¡¡¡º//–?¬Parte“moduloŽ¡extern–?¬void“(*foo_function_pointer)(void“*);Ž¡¡void–?¬my_function(void“*parameter)“{Ž¡‘ X//My‘?¬codeŽ¡}Ž¡¡int–?¬init_module()“{Ž¡‘ Xfoo_function_pointer–?¬=“&my_function;Ž¡}Ž¡¡int–?¬cleanup_module()“{Ž¡‘ Xfoo_function_pointer–?¬=“NULL;Ž¡}ŽŸ÷€¹Questo–¸artizio“pšGermette“di“rendere“il“Kernel“piu'“essibile,‘Ÿžp˜ercš¸èhe'“soltan˜to“quando“si“carica“il“moGdulo,‘ŸžlaŽ¡funzione›QFm•¸èy_function‘&Žv“erra'˜eettiv‘ÿqÐamen“te˜eseguita:‘o“questa˜routine˜pGotra'˜fare˜qualunque˜cosa˜v“ogliamo,Ž¡ad–U esempio“il“mošGdulo“rshap˜er‘*h(p˜er“limitare“il“traco“in“en¸ètrata“dalla“rete)“funziona“in“questo“mo˜do.Ž©ؼSi–Œnoti“come“l'in¸ètero“meccanismo“dei“mošGduli“sia“p˜ossibile“grazie“ad“alcune“v‘ÿqÐariabili“globali“nel“kš¸èernel“c˜heŽ¡v¸èengono–:espšGortate“ai“mo˜duli,‘-€come“pun¸ètatori“a“liste“(p˜ermettendo“di“estendere“tali“liste“quan¸èto“si“vuole):Ž¡esempi–U tipici“sono“i“fs“e“i“devices“(cš¸èhar,“bloGc˜k,“net,“telephon˜y).Ž¦In–]Èdenitiv‘ÿqÐa,‘_òpšGer“caricare“un“mo˜dulo,‘_òbisogna“in“qualc¸èhe“mo˜do“preparare“il“k•¸èernel‘3p˜erc“he'–]Èlo“accetti“(se“siŽ¡vuole– áfargli“fare“qualcosa“di“in•¸èteressan“te):‘Láin– áalcuni“casi“e'“necessario“creare“una“n•¸èuo“v‘ÿqÐa– áinfrastruttura“c¸èhe“siaŽ¡pšGoi–U il“piu'“standard“p˜ossibile“(come“quella“telephonš¸èy‘*hcreata“di“recen˜te).ŽŸ"ÊçÂ5.6Ž‘¾Directory‘¸Pro_úcŽŸMª¹Nella–ˆ«directory“/prošGc“e'“presen¸ète“il“FS‘ˆžpro˜c,‘•Žc¸èhe“e'“un“sistema“sp˜eciale“p˜er“consen¸ètire“il“dialogo“diretto“conŽ¡il–U Kernel“in“user“moGde.Ž¦Lin¸èux–Ì£utilizza“tale“directory‘ÿ*¸,‘çïad“esempio“pšGer“dialogare“con“le“strutture“dati“dei“pro˜cessi,‘çïp˜er“gestire“le“opzioniŽ¡di–Czrete“delle“inš¸èterfacce“come“il“pro˜xy-arp,‘Gil“massimo“n˜umero“di“Threads,‘Go“pGer“con˜trollare“lo“state“dei“busŽ¡ISA–U o“PCI,“pšGer“sap˜ere“quali“scš¸èhede“sono“installate“nel“sistema“e“con“quali“indirizzi“di“I/O“e“IR˜QsŽ¦Segue–U l'elenco“delle“sottošGdirectory“piu'“imp˜ortan¸èti“della“directory“pro˜c:ŽŸ÷€º|--‘?¬busŽ¡|‘¿|--‘?¬pciŽ¡|–¿|“|--‘?¬00Ž¡|–¿|“|“|--‘?¬00.0Ž¡|–¿|“|“|--‘?¬01.0Ž¡|–¿|“|“|--‘?¬07.0Ž¡|–¿|“|“|--‘?¬07.1Ž¡|–¿|“|“|--‘?¬07.2Ž¡|–¿|“|“|--‘?¬07.3Ž¡|–¿|“|“|--‘?¬07.4Ž¡|–¿|“|“|--‘?¬07.5ŽŽŽŒ‹á¹ Û_2 ý ~?Ÿ„€ÕÁGŽÄ5.‘ñ8Pš®>eculiarita'–Õdi“Lin˜ux’R‡´¹27ŽŽ ÕÁ ýV¯º|–¿|“|“|--‘?¬09.0Ž¤ ®|–¿|“|“|--‘?¬0a.0Ž¡|–¿|“|“`--‘?¬0f.0Ž¡|–¿|“|--‘?¬01Ž¡|–¿|“|“`--‘?¬00.0Ž¡|–¿|“`--‘?¬devicesŽ¡|‘¿`--‘?¬usbŽ¡|--‘?¬cmdlineŽ¡|--‘?¬cpuinfoŽ¡|--‘?¬devicesŽ¡|--‘?¬dmaŽ¡|--‘?¬driŽ¡|‘¿`--‘?¬0Ž¡|‘$½´|--‘?¬bufsŽ¡|‘$½´|--‘?¬clientsŽ¡|‘$½´|--‘?¬memŽ¡|‘$½´|--‘?¬nameŽ¡|‘$½´|--‘?¬queuesŽ¡|‘$½´|--‘?¬vmŽ¡|‘$½´`--‘?¬vmaŽ¡|--‘?¬driverŽ¡|--‘?¬execdomainsŽ¡|--‘?¬filesystemsŽ¡|--‘?¬fsŽ¡|--‘?¬ideŽ¡|‘¿|--‘?¬driversŽ¡|‘¿|--–?¬hda“->“ide0/hdaŽ¡|‘¿|--–?¬hdc“->“ide1/hdcŽ¡|‘¿|--‘?¬ide0Ž¡|–¿|“|--‘?¬channelŽ¡|–¿|“|--‘?¬configŽ¡|–¿|“|--‘?¬hdaŽ¡|–¿|“|“|--‘?¬cacheŽ¡|–¿|“|“|--‘?¬capacityŽ¡|–¿|“|“|--‘?¬driverŽ¡|–¿|“|“|--‘?¬geometryŽ¡|–¿|“|“|--‘?¬identifyŽ¡|–¿|“|“|--‘?¬mediaŽ¡|–¿|“|“|--‘?¬modelŽ¡|–¿|“|“|--‘?¬settingsŽ¡|–¿|“|“|--‘?¬smart_thresholdsŽ¡|–¿|“|“`--‘?¬smart_valuesŽ¡|–¿|“|--‘?¬mateŽ¡|–¿|“`--‘?¬modelŽ¡|‘¿|--‘?¬ide1Ž¡|–¿|“|--‘?¬channelŽ¡|–¿|“|--‘?¬configŽ¡|–¿|“|--‘?¬hdcŽ¡|–¿|“|“|--‘?¬capacityŽ¡|–¿|“|“|--‘?¬driverŽŽŽŒ‹ëC Û_2 ý ~?Ÿ„€ÕÁGŽÄ5.‘ñ8Pš®>eculiarita'–Õdi“Lin˜ux’R‡´¹28ŽŽ ÕÁ ýV¯º|–¿|“|“|--‘?¬identifyŽ¤ ®|–¿|“|“|--‘?¬mediaŽ¡|–¿|“|“|--‘?¬modelŽ¡|–¿|“|“`--‘?¬settingsŽ¡|–¿|“|--‘?¬mateŽ¡|–¿|“`--‘?¬modelŽ¡|‘¿`--‘?¬viaŽ¡|--‘?¬interruptsŽ¡|--‘?¬iomemŽ¡|--‘?¬ioportsŽ¡|--‘?¬irqŽ¡|‘¿|--‘?¬0Ž¡|‘¿|--‘?¬1Ž¡|‘¿|--‘?¬10Ž¡|‘¿|--‘?¬11Ž¡|‘¿|--‘?¬12Ž¡|‘¿|--‘?¬13Ž¡|‘¿|--‘?¬14Ž¡|‘¿|--‘?¬15Ž¡|‘¿|--‘?¬2Ž¡|‘¿|--‘?¬3Ž¡|‘¿|--‘?¬4Ž¡|‘¿|--‘?¬5Ž¡|‘¿|--‘?¬6Ž¡|‘¿|--‘?¬7Ž¡|‘¿|--‘?¬8Ž¡|‘¿|--‘?¬9Ž¡|‘¿`--‘?¬prof_cpu_maskŽ¡|--‘?¬kcoreŽ¡|--‘?¬kmsgŽ¡|--‘?¬ksymsŽ¡|--‘?¬loadavgŽ¡|--‘?¬locksŽ¡|--‘?¬meminfoŽ¡|--‘?¬miscŽ¡|--‘?¬modulesŽ¡|--‘?¬mountsŽ¡|--‘?¬mtrrŽ¡|--‘?¬netŽ¡|‘¿|--‘?¬arpŽ¡|‘¿|--‘?¬devŽ¡|‘¿|--‘?¬dev_mcastŽ¡|‘¿|--‘?¬ip_fwchainsŽ¡|‘¿|--‘?¬ip_fwnamesŽ¡|‘¿|--‘?¬ip_masqueradeŽ¡|‘¿|--‘?¬netlinkŽ¡|‘¿|--‘?¬netstatŽ¡|‘¿|--‘?¬packetŽ¡|‘¿|--‘?¬pschedŽ¡|‘¿|--‘?¬rawŽŽŽŒ‹ð Û_2 ý ~?Ÿ„€ÕÁGŽÄ5.‘ñ8Pš®>eculiarita'–Õdi“Lin˜ux’R‡´¹29ŽŽ ÕÁ ýV¯º|‘¿|--‘?¬routeŽ¤ ®|‘¿|--‘?¬rt_acctŽ¡|‘¿|--‘?¬rt_cacheŽ¡|‘¿|--‘?¬rt_cache_statŽ¡|‘¿|--‘?¬snmpŽ¡|‘¿|--‘?¬sockstatŽ¡|‘¿|--‘?¬softnet_statŽ¡|‘¿|--‘?¬tcpŽ¡|‘¿|--‘?¬udpŽ¡|‘¿|--‘?¬unixŽ¡|‘¿`--‘?¬wirelessŽ¡|--‘?¬partitionsŽ¡|--‘?¬pciŽ¡|--‘?¬scsiŽ¡|‘¿|--‘?¬ide-scsiŽ¡|–¿|“`--‘?¬0Ž¡|‘¿`--‘?¬scsiŽ¡|--–?¬self“->“2069Ž¡|--‘?¬slabinfoŽ¡|--‘?¬statŽ¡|--‘?¬swapsŽ¡|--‘?¬sysŽ¡|‘¿|--‘?¬abiŽ¡|–¿|“|--‘?¬defhandler_coffŽ¡|–¿|“|--‘?¬defhandler_elfŽ¡|–¿|“|--‘?¬defhandler_lcall7Ž¡|–¿|“|--‘?¬defhandler_libcsoŽ¡|–¿|“|--‘?¬fake_utsnameŽ¡|–¿|“`--‘?¬traceŽ¡|‘¿|--‘?¬debugŽ¡|‘¿|--‘?¬devŽ¡|–¿|“|--‘?¬cdromŽ¡|–¿|“|“|--‘?¬autocloseŽ¡|–¿|“|“|--‘?¬autoejectŽ¡|–¿|“|“|--‘?¬check_mediaŽ¡|–¿|“|“|--‘?¬debugŽ¡|–¿|“|“|--‘?¬infoŽ¡|–¿|“|“`--‘?¬lockŽ¡|–¿|“`--‘?¬parportŽ¡|‘¿|‘$½´|--‘?¬defaultŽ¡|–¿|‘$½´|“|--‘?¬spintimeŽ¡|–¿|‘$½´|“`--‘?¬timesliceŽ¡|‘¿|‘$½´`--‘?¬parport0Ž¡|‘¿|‘9¼d|--‘?¬autoprobeŽ¡|‘¿|‘9¼d|--‘?¬autoprobe0Ž¡|‘¿|‘9¼d|--‘?¬autoprobe1Ž¡|‘¿|‘9¼d|--‘?¬autoprobe2Ž¡|‘¿|‘9¼d|--‘?¬autoprobe3Ž¡|‘¿|‘9¼d|--‘?¬base-addrŽ¡|‘¿|‘9¼d|--‘?¬devicesŽŽŽŒ‹ô, Û_2 ý ~?Ÿ„€ÕÁGŽÄ5.‘ñ8Pš®>eculiarita'–Õdi“Lin˜ux’R‡´¹30ŽŽ ÕÁ ýV¯º|–¿|‘9¼d|“|--‘?¬activeŽ¤ ®|–¿|‘9¼d|“`--‘?¬lpŽ¡|‘¿|‘9¼d|‘$½´`--‘?¬timesliceŽ¡|‘¿|‘9¼d|--‘?¬dmaŽ¡|‘¿|‘9¼d|--‘?¬irqŽ¡|‘¿|‘9¼d|--‘?¬modesŽ¡|‘¿|‘9¼d`--‘?¬spintimeŽ¡|‘¿|--‘?¬fsŽ¡|–¿|“|--‘?¬binfmt_miscŽ¡|–¿|“|--‘?¬dentry-stateŽ¡|–¿|“|--‘?¬dir-notify-enableŽ¡|–¿|“|--‘?¬dquot-nrŽ¡|–¿|“|--‘?¬file-maxŽ¡|–¿|“|--‘?¬file-nrŽ¡|–¿|“|--‘?¬inode-nrŽ¡|–¿|“|--‘?¬inode-stateŽ¡|–¿|“|--‘?¬jbd-debugŽ¡|–¿|“|--‘?¬lease-break-timeŽ¡|–¿|“|--‘?¬leases-enableŽ¡|–¿|“|--‘?¬overflowgidŽ¡|–¿|“`--‘?¬overflowuidŽ¡|‘¿|--‘?¬kernelŽ¡|–¿|“|--‘?¬acctŽ¡|–¿|“|--‘?¬cad_pidŽ¡|–¿|“|--‘?¬cap-boundŽ¡|–¿|“|--‘?¬core_uses_pidŽ¡|–¿|“|--‘?¬ctrl-alt-delŽ¡|–¿|“|--‘?¬domainnameŽ¡|–¿|“|--‘?¬hostnameŽ¡|–¿|“|--‘?¬modprobeŽ¡|–¿|“|--‘?¬msgmaxŽ¡|–¿|“|--‘?¬msgmnbŽ¡|–¿|“|--‘?¬msgmniŽ¡|–¿|“|--‘?¬osreleaseŽ¡|–¿|“|--‘?¬ostypeŽ¡|–¿|“|--‘?¬overflowgidŽ¡|–¿|“|--‘?¬overflowuidŽ¡|–¿|“|--‘?¬panicŽ¡|–¿|“|--‘?¬printkŽ¡|–¿|“|--‘?¬randomŽ¡|–¿|“|“|--‘?¬boot_idŽ¡|–¿|“|“|--‘?¬entropy_availŽ¡|–¿|“|“|--‘?¬poolsizeŽ¡|–¿|“|“|--‘?¬read_wakeup_thresholdŽ¡|–¿|“|“|--‘?¬uuidŽ¡|–¿|“|“`--‘?¬write_wakeup_thresholdŽ¡|–¿|“|--‘?¬rtsig-maxŽ¡|–¿|“|--‘?¬rtsig-nrŽ¡|–¿|“|--‘?¬semŽ¡|–¿|“|--‘?¬shmallŽŽŽŒ‹ùY Û_2 ý ~?Ÿ„€ÕÁGŽÄ5.‘ñ8Pš®>eculiarita'–Õdi“Lin˜ux’R‡´¹31ŽŽ ÕÁ ýV¯º|–¿|“|--‘?¬shmmaxŽ¤ ®|–¿|“|--‘?¬shmmniŽ¡|–¿|“|--‘?¬sysrqŽ¡|–¿|“|--‘?¬taintedŽ¡|–¿|“|--‘?¬threads-maxŽ¡|–¿|“`--‘?¬versionŽ¡|‘¿|--‘?¬netŽ¡|–¿|“|--‘?¬802Ž¡|–¿|“|--‘?¬coreŽ¡|–¿|“|“|--‘?¬hot_list_lengthŽ¡|–¿|“|“|--‘?¬lo_congŽ¡|–¿|“|“|--‘?¬message_burstŽ¡|–¿|“|“|--‘?¬message_costŽ¡|–¿|“|“|--‘?¬mod_congŽ¡|–¿|“|“|--‘?¬netdev_max_backlogŽ¡|–¿|“|“|--‘?¬no_congŽ¡|–¿|“|“|--‘?¬no_cong_threshŽ¡|–¿|“|“|--‘?¬optmem_maxŽ¡|–¿|“|“|--‘?¬rmem_defaultŽ¡|–¿|“|“|--‘?¬rmem_maxŽ¡|–¿|“|“|--‘?¬wmem_defaultŽ¡|–¿|“|“`--‘?¬wmem_maxŽ¡|–¿|“|--‘?¬ethernetŽ¡|–¿|“|--‘?¬ipv4Ž¡|–¿|“|“|--‘?¬confŽ¡|–¿|“|“|“|--‘?¬allŽ¡|–¿|“|“|“|“|--‘?¬accept_redirectsŽ¡|–¿|“|“|“|“|--‘?¬accept_source_routeŽ¡|–¿|“|“|“|“|--‘?¬arp_filterŽ¡|–¿|“|“|“|“|--‘?¬bootp_relayŽ¡|–¿|“|“|“|“|--‘?¬forwardingŽ¡|–¿|“|“|“|“|--‘?¬log_martiansŽ¡|–¿|“|“|“|“|--‘?¬mc_forwardingŽ¡|–¿|“|“|“|“|--‘?¬proxy_arpŽ¡|–¿|“|“|“|“|--‘?¬rp_filterŽ¡|–¿|“|“|“|“|--‘?¬secure_redirectsŽ¡|–¿|“|“|“|“|--‘?¬send_redirectsŽ¡|–¿|“|“|“|“|--‘?¬shared_mediaŽ¡|–¿|“|“|“|“`--‘?¬tagŽ¡|–¿|“|“|“|--‘?¬defaultŽ¡|–¿|“|“|“|“|--‘?¬accept_redirectsŽ¡|–¿|“|“|“|“|--‘?¬accept_source_routeŽ¡|–¿|“|“|“|“|--‘?¬arp_filterŽ¡|–¿|“|“|“|“|--‘?¬bootp_relayŽ¡|–¿|“|“|“|“|--‘?¬forwardingŽ¡|–¿|“|“|“|“|--‘?¬log_martiansŽ¡|–¿|“|“|“|“|--‘?¬mc_forwardingŽ¡|–¿|“|“|“|“|--‘?¬proxy_arpŽ¡|–¿|“|“|“|“|--‘?¬rp_filterŽ¡|–¿|“|“|“|“|--‘?¬secure_redirectsŽŽŽŒ‹ ÿ Û_2 ý ~?Ÿ„€ÕÁGŽÄ5.‘ñ8Pš®>eculiarita'–Õdi“Lin˜ux’R‡´¹32ŽŽ ÕÁ ýV¯º|–¿|“|“|“|“|--‘?¬send_redirectsŽ¤ ®|–¿|“|“|“|“|--‘?¬shared_mediaŽ¡|–¿|“|“|“|“`--‘?¬tagŽ¡|–¿|“|“|“|--‘?¬eth0Ž¡|–¿|“|“|“|“|--‘?¬accept_redirectsŽ¡|–¿|“|“|“|“|--‘?¬accept_source_routeŽ¡|–¿|“|“|“|“|--‘?¬arp_filterŽ¡|–¿|“|“|“|“|--‘?¬bootp_relayŽ¡|–¿|“|“|“|“|--‘?¬forwardingŽ¡|–¿|“|“|“|“|--‘?¬log_martiansŽ¡|–¿|“|“|“|“|--‘?¬mc_forwardingŽ¡|–¿|“|“|“|“|--‘?¬proxy_arpŽ¡|–¿|“|“|“|“|--‘?¬rp_filterŽ¡|–¿|“|“|“|“|--‘?¬secure_redirectsŽ¡|–¿|“|“|“|“|--‘?¬send_redirectsŽ¡|–¿|“|“|“|“|--‘?¬shared_mediaŽ¡|–¿|“|“|“|“`--‘?¬tagŽ¡|–¿|“|“|“|--‘?¬eth1Ž¡|–¿|“|“|“|“|--‘?¬accept_redirectsŽ¡|–¿|“|“|“|“|--‘?¬accept_source_routeŽ¡|–¿|“|“|“|“|--‘?¬arp_filterŽ¡|–¿|“|“|“|“|--‘?¬bootp_relayŽ¡|–¿|“|“|“|“|--‘?¬forwardingŽ¡|–¿|“|“|“|“|--‘?¬log_martiansŽ¡|–¿|“|“|“|“|--‘?¬mc_forwardingŽ¡|–¿|“|“|“|“|--‘?¬proxy_arpŽ¡|–¿|“|“|“|“|--‘?¬rp_filterŽ¡|–¿|“|“|“|“|--‘?¬secure_redirectsŽ¡|–¿|“|“|“|“|--‘?¬send_redirectsŽ¡|–¿|“|“|“|“|--‘?¬shared_mediaŽ¡|–¿|“|“|“|“`--‘?¬tagŽ¡|–¿|“|“|“`--‘?¬loŽ¡|–¿|“|“|‘$½´|--‘?¬accept_redirectsŽ¡|–¿|“|“|‘$½´|--‘?¬accept_source_routeŽ¡|–¿|“|“|‘$½´|--‘?¬arp_filterŽ¡|–¿|“|“|‘$½´|--‘?¬bootp_relayŽ¡|–¿|“|“|‘$½´|--‘?¬forwardingŽ¡|–¿|“|“|‘$½´|--‘?¬log_martiansŽ¡|–¿|“|“|‘$½´|--‘?¬mc_forwardingŽ¡|–¿|“|“|‘$½´|--‘?¬proxy_arpŽ¡|–¿|“|“|‘$½´|--‘?¬rp_filterŽ¡|–¿|“|“|‘$½´|--‘?¬secure_redirectsŽ¡|–¿|“|“|‘$½´|--‘?¬send_redirectsŽ¡|–¿|“|“|‘$½´|--‘?¬shared_mediaŽ¡|–¿|“|“|‘$½´`--‘?¬tagŽ¡|–¿|“|“|--‘?¬icmp_echo_ignore_allŽ¡|–¿|“|“|--‘?¬icmp_echo_ignore_broadcastsŽ¡|–¿|“|“|--‘?¬icmp_ignore_bogus_error_responsesŽ¡|–¿|“|“|--‘?¬icmp_ratelimitŽ¡|–¿|“|“|--‘?¬icmp_ratemaskŽŽŽŒ‹!€ Û_2 ý ~?Ÿ„€ÕÁGŽÄ5.‘ñ8Pš®>eculiarita'–Õdi“Lin˜ux’R‡´¹33ŽŽ ÕÁ ýV¯º|–¿|“|“|--‘?¬inet_peer_gc_maxtimeŽ¤ ®|–¿|“|“|--‘?¬inet_peer_gc_mintimeŽ¡|–¿|“|“|--‘?¬inet_peer_maxttlŽ¡|–¿|“|“|--‘?¬inet_peer_minttlŽ¡|–¿|“|“|--‘?¬inet_peer_thresholdŽ¡|–¿|“|“|--‘?¬ip_autoconfigŽ¡|–¿|“|“|--‘?¬ip_conntrack_maxŽ¡|–¿|“|“|--‘?¬ip_default_ttlŽ¡|–¿|“|“|--‘?¬ip_dynaddrŽ¡|–¿|“|“|--‘?¬ip_forwardŽ¡|–¿|“|“|--‘?¬ip_local_port_rangeŽ¡|–¿|“|“|--‘?¬ip_no_pmtu_discŽ¡|–¿|“|“|--‘?¬ip_nonlocal_bindŽ¡|–¿|“|“|--‘?¬ipfrag_high_threshŽ¡|–¿|“|“|--‘?¬ipfrag_low_threshŽ¡|–¿|“|“|--‘?¬ipfrag_timeŽ¡|–¿|“|“|--‘?¬neighŽ¡|–¿|“|“|“|--‘?¬defaultŽ¡|–¿|“|“|“|“|--‘?¬anycast_delayŽ¡|–¿|“|“|“|“|--‘?¬app_solicitŽ¡|–¿|“|“|“|“|--‘?¬base_reachable_timeŽ¡|–¿|“|“|“|“|--‘?¬delay_first_probe_timeŽ¡|–¿|“|“|“|“|--‘?¬gc_intervalŽ¡|–¿|“|“|“|“|--‘?¬gc_stale_timeŽ¡|–¿|“|“|“|“|--‘?¬gc_thresh1Ž¡|–¿|“|“|“|“|--‘?¬gc_thresh2Ž¡|–¿|“|“|“|“|--‘?¬gc_thresh3Ž¡|–¿|“|“|“|“|--‘?¬locktimeŽ¡|–¿|“|“|“|“|--‘?¬mcast_solicitŽ¡|–¿|“|“|“|“|--‘?¬proxy_delayŽ¡|–¿|“|“|“|“|--‘?¬proxy_qlenŽ¡|–¿|“|“|“|“|--‘?¬retrans_timeŽ¡|–¿|“|“|“|“|--‘?¬ucast_solicitŽ¡|–¿|“|“|“|“`--‘?¬unres_qlenŽ¡|–¿|“|“|“|--‘?¬eth0Ž¡|–¿|“|“|“|“|--‘?¬anycast_delayŽ¡|–¿|“|“|“|“|--‘?¬app_solicitŽ¡|–¿|“|“|“|“|--‘?¬base_reachable_timeŽ¡|–¿|“|“|“|“|--‘?¬delay_first_probe_timeŽ¡|–¿|“|“|“|“|--‘?¬gc_stale_timeŽ¡|–¿|“|“|“|“|--‘?¬locktimeŽ¡|–¿|“|“|“|“|--‘?¬mcast_solicitŽ¡|–¿|“|“|“|“|--‘?¬proxy_delayŽ¡|–¿|“|“|“|“|--‘?¬proxy_qlenŽ¡|–¿|“|“|“|“|--‘?¬retrans_timeŽ¡|–¿|“|“|“|“|--‘?¬ucast_solicitŽ¡|–¿|“|“|“|“`--‘?¬unres_qlenŽ¡|–¿|“|“|“|--‘?¬eth1Ž¡|–¿|“|“|“|“|--‘?¬anycast_delayŽ¡|–¿|“|“|“|“|--‘?¬app_solicitŽŽŽŒ‹" Ø Û_2 ý ~?Ÿ„€ÕÁGŽÄ5.‘ñ8Pš®>eculiarita'–Õdi“Lin˜ux’R‡´¹34ŽŽ ÕÁ ýV¯º|–¿|“|“|“|“|--‘?¬base_reachable_timeŽ¤ ®|–¿|“|“|“|“|--‘?¬delay_first_probe_timeŽ¡|–¿|“|“|“|“|--‘?¬gc_stale_timeŽ¡|–¿|“|“|“|“|--‘?¬locktimeŽ¡|–¿|“|“|“|“|--‘?¬mcast_solicitŽ¡|–¿|“|“|“|“|--‘?¬proxy_delayŽ¡|–¿|“|“|“|“|--‘?¬proxy_qlenŽ¡|–¿|“|“|“|“|--‘?¬retrans_timeŽ¡|–¿|“|“|“|“|--‘?¬ucast_solicitŽ¡|–¿|“|“|“|“`--‘?¬unres_qlenŽ¡|–¿|“|“|“`--‘?¬loŽ¡|–¿|“|“|‘$½´|--‘?¬anycast_delayŽ¡|–¿|“|“|‘$½´|--‘?¬app_solicitŽ¡|–¿|“|“|‘$½´|--‘?¬base_reachable_timeŽ¡|–¿|“|“|‘$½´|--‘?¬delay_first_probe_timeŽ¡|–¿|“|“|‘$½´|--‘?¬gc_stale_timeŽ¡|–¿|“|“|‘$½´|--‘?¬locktimeŽ¡|–¿|“|“|‘$½´|--‘?¬mcast_solicitŽ¡|–¿|“|“|‘$½´|--‘?¬proxy_delayŽ¡|–¿|“|“|‘$½´|--‘?¬proxy_qlenŽ¡|–¿|“|“|‘$½´|--‘?¬retrans_timeŽ¡|–¿|“|“|‘$½´|--‘?¬ucast_solicitŽ¡|–¿|“|“|‘$½´`--‘?¬unres_qlenŽ¡|–¿|“|“|--‘?¬routeŽ¡|–¿|“|“|“|--‘?¬error_burstŽ¡|–¿|“|“|“|--‘?¬error_costŽ¡|–¿|“|“|“|--‘?¬flushŽ¡|–¿|“|“|“|--‘?¬gc_elasticityŽ¡|–¿|“|“|“|--‘?¬gc_intervalŽ¡|–¿|“|“|“|--‘?¬gc_min_intervalŽ¡|–¿|“|“|“|--‘?¬gc_threshŽ¡|–¿|“|“|“|--‘?¬gc_timeoutŽ¡|–¿|“|“|“|--‘?¬max_delayŽ¡|–¿|“|“|“|--‘?¬max_sizeŽ¡|–¿|“|“|“|--‘?¬min_adv_mssŽ¡|–¿|“|“|“|--‘?¬min_delayŽ¡|–¿|“|“|“|--‘?¬min_pmtuŽ¡|–¿|“|“|“|--‘?¬mtu_expiresŽ¡|–¿|“|“|“|--‘?¬redirect_loadŽ¡|–¿|“|“|“|--‘?¬redirect_numberŽ¡|–¿|“|“|“`--‘?¬redirect_silenceŽ¡|–¿|“|“|--‘?¬tcp_abort_on_overflowŽ¡|–¿|“|“|--‘?¬tcp_adv_win_scaleŽ¡|–¿|“|“|--‘?¬tcp_app_winŽ¡|–¿|“|“|--‘?¬tcp_dsackŽ¡|–¿|“|“|--‘?¬tcp_ecnŽ¡|–¿|“|“|--‘?¬tcp_fackŽ¡|–¿|“|“|--‘?¬tcp_fin_timeoutŽ¡|–¿|“|“|--‘?¬tcp_keepalive_intvlŽ¡|–¿|“|“|--‘?¬tcp_keepalive_probesŽŽŽŒ‹# Û_2 ý ~?Ÿ„€ÕÁGŽÄ5.‘ñ8Pš®>eculiarita'–Õdi“Lin˜ux’R‡´¹35ŽŽ ÕÁ ýV¯º|–¿|“|“|--‘?¬tcp_keepalive_timeŽ¤ ®|–¿|“|“|--‘?¬tcp_max_orphansŽ¡|–¿|“|“|--‘?¬tcp_max_syn_backlogŽ¡|–¿|“|“|--‘?¬tcp_max_tw_bucketsŽ¡|–¿|“|“|--‘?¬tcp_memŽ¡|–¿|“|“|--‘?¬tcp_orphan_retriesŽ¡|–¿|“|“|--‘?¬tcp_reorderingŽ¡|–¿|“|“|--‘?¬tcp_retrans_collapseŽ¡|–¿|“|“|--‘?¬tcp_retries1Ž¡|–¿|“|“|--‘?¬tcp_retries2Ž¡|–¿|“|“|--‘?¬tcp_rfc1337Ž¡|–¿|“|“|--‘?¬tcp_rmemŽ¡|–¿|“|“|--‘?¬tcp_sackŽ¡|–¿|“|“|--‘?¬tcp_stdurgŽ¡|–¿|“|“|--‘?¬tcp_syn_retriesŽ¡|–¿|“|“|--‘?¬tcp_synack_retriesŽ¡|–¿|“|“|--‘?¬tcp_syncookiesŽ¡|–¿|“|“|--‘?¬tcp_timestampsŽ¡|–¿|“|“|--‘?¬tcp_tw_recycleŽ¡|–¿|“|“|--‘?¬tcp_window_scalingŽ¡|–¿|“|“`--‘?¬tcp_wmemŽ¡|–¿|“`--‘?¬unixŽ¡|‘¿|‘$½´`--‘?¬max_dgram_qlenŽ¡|‘¿|--‘?¬procŽ¡|‘¿`--‘?¬vmŽ¡|‘$½´|--‘?¬bdflushŽ¡|‘$½´|--‘?¬kswapdŽ¡|‘$½´|--‘?¬max-readaheadŽ¡|‘$½´|--‘?¬min-readaheadŽ¡|‘$½´|--‘?¬overcommit_memoryŽ¡|‘$½´|--‘?¬page-clusterŽ¡|‘$½´`--‘?¬pagetable_cacheŽ¡|--‘?¬sysvipcŽ¡|‘¿|--‘?¬msgŽ¡|‘¿|--‘?¬semŽ¡|‘¿`--‘?¬shmŽ¡|--‘?¬ttyŽ¡|‘¿|--‘?¬driverŽ¡|–¿|“`--‘?¬serialŽ¡|‘¿|--‘?¬driversŽ¡|‘¿|--‘?¬ldiscŽ¡|‘¿`--‘?¬ldiscsŽ¡|--‘?¬uptimeŽ¡`--‘?¬versionŽŸؼ¹Nella–¾:directory“sono“presenš¸èti“anc˜he“tutti“i“T‘ÿ*¸asks“attivi“tramite“il“PID‘¾(c˜he“funge“da“nome“della“directory)Ž¡tramite–Wjcui“si“puo'“a•¸èv“ere–Wjaccesso“alle“informazioni“relativ¸èe“ai“T‘ÿ*¸asks,›Wücome“pGercorso“del“le“binario,˜memoriaŽ¡usata–U e“cosi'“via).ŽŸؼIl–|xpunš¸èto“piu'“in˜teressan˜te“e'“c˜he“non“e'“soltan˜to“pGossibile“v˜edere‘QÀalcuni“v‘ÿqÐalori,‘†Nma“anc˜he“moGdicarli,‘†NcomeŽ¡quelli–U nella“sottošGdirectory“/pro˜c/sys:ŽŽŽŒ‹$9 Û_2 ý ~?Ÿ„€ÕÁGŽÄ5.‘ñ8Pš®>eculiarita'–Õdi“Lin˜ux’R‡´¹36ŽŽ ÕÁ ýV¯º/proc/sys/Ž¤ ®‘4|¸acpiŽ¡‘4|¸devŽ¡‘4|¸debugŽ¡‘4|¸fsŽ¡‘4|¸procŽ¡‘4|¸netŽ¡‘4|¸vmŽ¡‘4|¸kernelŽ© ÖÄ5.6.1Ž‘#!\/proQÂc/sys/k®>ernelŽŸMª¹Sotto–U seguono“alcuni“le“utili“pšGer“mo˜dicare“dei“settaggi“del“k¸èernel:ŽŸؼºoverflowgidŽ¡overflowuidŽ¡randomŽ¡threads-max–?¬//“Massimo“numero“dei“Threads,“tipicamente“16384Ž¡sysrq–?¬//“kernel“hack:“per“consultare“istantaneamente“i“valori“dei“registri“del“processoreŽ¡semŽ¡msgmnbŽ¡msgmniŽ¡msgmaxŽ¡shmmniŽ¡shmallŽ¡shmmaxŽ¡rtsig-maxŽ¡rtsig-nrŽ¡modprobe–?¬//“percorso“di“modprobeŽ¡printkŽ¡ctrl-alt-delŽ¡cap-boundŽ¡panicŽ¡domainname–?¬//“domain“name“del“Linux“boxŽ¡hostname–?¬//“host“name“del“Linux“boxŽ¡version–?¬//“data“del“KernelŽ¡osrelease–?¬//“versione“del“kernel“(i.e.“2.4.5)Ž¡ostype–?¬//“Linux!Ž¦Ä5.6.2Ž‘#!\/proQÂc/sys/netŽŸMª¹Questa–)”puo'“essere“cosiderate“la“piu'“utile“sottošGdirectory“del“k¸èernel:‘[ºp˜ermette“di“cam¸èbiare“alcuni“imp˜ortan¸ètiŽ¡settaggi–U della“rete“del“Kernel:ŽŸؼºcoreŽ¡ipv4Ž¡ipv6Ž¡unixŽ¡ethernetŽ¡802ŽŽŽŒ‹%"L Û_2 ý ~?Ÿ„€ÕÁGŽÄ6.‘ñ8Multitasking–Õdi“Lin®>ux’K×Ĺ37ŽŽ ÕÁ ýV¯Ä/proQÂc/sys/net/core‘ ÿ`¹Sotto–RÜsono“elencati“alcuni“settaggi“di“rete“generali“come“"netdev_max_bac¸èklog"Ž¤ ®(tipicamen•¸ète)›Œc“he˜indica˜la˜lunghezza˜massima˜della˜coGda˜di˜tutti˜i˜pacc“hetti˜di˜rete.‘¾ÃQuesto˜v‘ÿqÐalore˜puo'Ž¡limitare–¼óla“banda“della“rete“quando“si“ricevš¸èono“i“pacc˜hetti,‘ÖçpGerc˜he'“Lin˜ux“dev˜e“attendere“no“al“successiv˜oŽ¡tempšGo–>zdi“sc¸èhedulazione“(1000/HZ‘>=ms)“p˜er“p˜oter“svuotare“tale“buer“di“pacc¸èhetti“(p˜er“il“meccanismo“delŽ¡bGottom‘U half‘Ç).Ž©ؼ‘ Xº300‘þ°*‘)ý`100‘D;¼=‘>\30‘?¬000Ž¡pacchetti‘þ°HZ(freq‘?¬Timeslice)‘/= pacchetti/sŽ¡¡30–?¬000‘¿*‘$½´1000‘D;¼=‘~30“MŽ¡pacchetti‘>\Media(Bytes/packet)‘¿throughput‘?¬Bytes/sŽ¦¹P•¸èer›Uäaumen“tare˜le˜prestazioni˜bisogna˜aumen“tare˜necessariamen“te˜il˜v‘ÿqÐalore˜di˜netdev_max_bac“klog,‘–digi-Ž¡tando:Ž¦ºecho–?¬4000“>“/proc/sys/net/core/netdev_max_backlogŽ¦¹Nota:‘g¢Aš¸èttenzione–Adai“v‘ÿqÐalori“di“HZ:“alcune“arc˜hitetture“(come“alpha“o“arm-tbGo˜x)“utilizzano“1000,‘EWc˜he“pGermet-Ž¡tono–U quindi“di“arriv‘ÿqÐare“a“300“MBytes/s“di“banda“media.Ž© ÖÄ/proQÂc/sys/net/ip®>v4‘ ÿ`¹"ip_forwš¸èard",‘ùabilita–ØKo“disabilita“l'ip“forw˜arding“nel“Lin˜ux“bGo˜x:‘wÕquesto“e'“un“set-Ž¡taggio–U generale,“ma“e'“pšGossibile“sp˜ecicare“p˜er“ogni“inš¸èterfaccia“un“v‘ÿqÐalore“div˜erso.Ž¦Ä/proQÂc/sys/net/ip•®>v4/conf/in“terface‘ ÿ`¹Ritengo–Ïquesto“sia“la“directory“/prošGc“piu'“utile,‘¬in“quan¸èto“p˜ermetteŽ¡di–™æcamš¸èbiare“molti“settaggi“di“rete“utili“soprattutto“in“caso“di“reti“wireless“(si“v˜eda“il“ÃWir‘ÿ}/eless-HO¾˜WTOŽ¡ºhttp://www.bertolinux.com–U ¹pGer“maggiori“informazioni).ŽŸؼEcco–U alcuni“esempi“di“utilizzo:ŽŸؼ‘¸ŽŽŽ‘¹"forwš¸èarding",–U pGer“abilitare“l'ip“forw˜arding“pGer“una“singola“in˜terfacciaŽ©®‘¸ŽŽŽ‘¹"proš¸èxy_arp",‘Gzto–Dabilitare“o“disabilitare“il“pro˜xy“arp.‘kÐP˜er“ulteriori“informazioni“sul“Pro˜xy“arp“si“cerc˜hiŽ¡‘il›ý×Pro•¸èxy“arp-HO“WTO‘ýisu˜ÃLinux–lDo›ÿ}/cumentation“Pr˜oje˜ct–ý׺http://www.tldp.org“¹e“ÃWir˜eless-HO¾˜WTOŽ¡‘ºhttp://www.bertolinux.com–U ¹pGer“l'utilizzo“del“pro¸èxy“arp“nelli“reti“Wireless.Ž¦‘¸ŽŽŽ‘¹"send_redirects"–ˆ"pGer“evitare“cš¸èhe“le“in˜terfacce“mandino“i“pacc˜hetti“di“tipGo“ICMP_REDIRECT‘ˆ(comeŽ¡‘prima–U si“v¸èeda“ÃWir‘ÿ}/eless-HO¾˜WTO“ºhttp://www.bertolinux.com“¹pGer“maggiori“informazioni).ŽŸ(ÀœÀ6Ž‘ÁMultitasking–G\di“LincuxŽŸèÂ6.1Ž‘¾In tro_úduzioneŽ¤Mª¹Questa–U capitolo“analizza“le“strutture“dati“e“funzionamenš¸èto“del“Multitasking“di“Lin˜uxŽŸ ÖÄ6.1.1Ž‘#!\Stati–Õdei“T‘ÿ ºasksŽ¡¹Un–U T‘ÿ*¸ask“Linš¸èux“puo'“esssere“in“uno“dei“seguen˜ti“stati“(come“da“le“[include/lin˜ux.h]):ŽŸؼ‘ 9b1.ŽŽŽ‘T‘ÿ*¸ASK_Rš¸èUNNING,–U signica“c˜he“il“T‘ÿ*¸ask“e'“nella“"Ready“List"“(quindi“pron˜to“pGer“l'esecuzione)ŽŽŽŒ‹&&Þ Û_2 ý ~?Ÿ„€ÕÁGŽÄ6.‘ñ8Multitasking–Õdi“Lin®>ux’K×Ĺ38ŽŽ ÕÁ ýV¯‘ 9b2.ŽŽŽ‘T–ÿ*¸ASK_INTERR¸èUPTIBLE,›U T“ask˜in˜attesa˜di˜un˜segnale˜o˜di˜una˜risorsa˜(sta'˜dormendo)Ž¤®‘ 9b3.ŽŽŽ‘T–ÿ*¸ASK_UNINTERR¸èUPTIBLE,›U T“ask˜in˜attesa˜di˜una˜risorsa,˜presen¸ète˜nella˜W“ait˜Queue"˜relativ‘ÿqÐaŽ¡‘ 9b4.ŽŽŽ‘T–ÿ*¸ASK_ZOMBIE,›U T“ask˜senza˜padre˜(pGoi˜adottato˜da˜init)Ž¡‘ 9b5.ŽŽŽ‘T–ÿ*¸ASK_STOPPED,›U T“ask˜in˜moGdo˜debuggingŽŸ ÖÄ6.1.2Ž‘#!\In®>terazione‘ÕgracaŽ©Mª‘$½´º______________‘>\CPU‘?¬Disponibile‘¿_______________Ž¤ ®‘~|‘I{h|– X---------------->“|‘N»|Ž¡‘~|–?¬TASK_RUNNING“|‘n9|Vera“esecuzione|Ž¡‘~|______________|– X<----------------“|_______________|Ž¡’·$CPU‘?¬OccupataŽ¡‘>ü|‘¿/|\Ž¡In–?¬attesa“di|‘þ°|“RisorsaŽ¡una–?¬Risorsa“|‘þ°|“DisponibileŽ¡‘9¼d\|/‘¿|Ž¡‘þ°______________________Ž¡‘¿|‘sxÈ|Ž¡‘¿|–?¬TASK_INTERRUPTIBLE“/“|Ž¡‘¿|–?¬TASK-UNINTERRUPTIBLE“|Ž¡‘¿|______________________|Ž¡¡‘n9Flusso–?¬Principale“MultitaskingŽŸ#ÃÂ6.2Ž‘¾TimeSliceŽ¦Ä6.2.1Ž‘#!\Programmazione–Õdel“PIT“8253Ž¦¹Ogni–¤¦10“ms“(a“seconda“del“v›ÿqÐalore“di“HZ)‘¤‘arriv˜a“un“IR•¸èQ0,‘¸‡c“he–¤¦pGermmette“di“gestire“il“m¸èultitasking:‘‹questoŽ¡segnale–ä·arriv‘ÿqÐa“dal“PIC‘ä’8259“(nell'arcš¸èhitettura“386+)“connesso“a“sua“v˜olta“con“il“PIT‘ä’8253“a˜v˜en˜te“cloGc˜k“diŽ¡1.19318‘U MHz.ŽŸؼ‘þ°º_____‘/= ______‘)ý`______Ž¡‘¿|–?¬CPU“|<------|“8259“|------|“8253“|Ž¡‘¿|_____|‘?¬IRQ0‘ X|______|‘~|___/|\|Ž¡’¼ô0|_____–?¬CLK“1.193.180“MHzŽ¡¡//–?¬From“include/asm/param.hŽ¡#ifndef‘?¬HZŽ¡#define–?¬HZ“100Ž¡#endifŽ¡¡//–?¬From“include/asm/timex.hŽ¡#define–?¬CLOCK_TICK_RATE“1193180“/*“Underlying“HZ“*/Ž¡¡//–?¬From“include/linux/timex.hŽ¡#define–?¬LATCH“((CLOCK_TICK_RATE“+“HZ/2)“/“HZ)“/*“For“divider“*/Ž¡ŽŽŒ‹'2} Û_2 ý ~?Ÿ„€ÕÁGŽÄ6.‘ñ8Multitasking–Õdi“Lin®>ux’K×Ĺ39ŽŽ ÕÁ ýV¯º//–?¬From“arch/i386/kernel/i8259.cŽ¤ ®outb_p(0x34,0x43);–?¬/*“binary,“mode“2,“LSB/MSB,“ch“0“*/Ž¡outb_p(LATCH–?¬&“0xff“,“0x40);“/*“LSB“*/Ž¡outb(LATCH–?¬>>“8“,“0x40);“/*“MSB“*/Ž¡Ÿê\¹Quindi–ù;quello“cš¸èhe“si“fa“e'“programmare“l'8253“(PIT,“Programmable“In˜terv‘ÿqÐal“Timer)“con“LA‘ÿ*¸TCH‘øŒ=Ž¡(1193180/HZ)‘]·=›]û11931.8,‘ 2do•¸èv“e˜HZ=100˜(default).‘ŒLA‘ÿ*¸TCH‘]·indica˜il˜fattore˜di˜divisione˜frequenza˜pGer˜ilŽ¡cloGc¸èk.Ž©ؼLA‘ÿ*¸TCH‘F‰=–FÇ11931.8“fornisce“all'8253“(in“output)“una“frequenza“di“1193180“/“11931.8“=“100“Hz,‘ƒ1quindi“ilŽ¡p•Gerio“do–U tra“2“IR¸èQ0“e'“di“10msŽ¦Quindi–U il“Timeslice“si“misura“come“1/HZ.Ž¦Ogni– BTimeSlice“viene“sospšGeso“il“pro˜cesso“attualmenš¸ète“di“esecuzione“(senza“T‘ÿ*¸ask“Switc˜hing),‘Õe“viene“fatto“delŽ¡la•¸èv“oro–U di“manš¸èutenzione,“dopGo“di“c˜he“il“con˜trollo“ritorna“al“proGcesso“preceden˜temen˜te“in˜terrotto.ŽŸ €öÄ6.2.2Ž‘#!\Linš®>ux–ÕTimer“IR˜Q“ICAŽŸMªºLinux–?¬Timer“IRQŽ¡IRQ–?¬0“[Timer]Ž¡‘?¬|Ž¡\|/Ž¡|IRQ0x00_interrupt‘)ý`//‘¿wrapper–?¬IRQ“handlerŽ¡‘¿|SAVE_ALL‘I{h---Ž¡‘~|do_IRQ‘SúÀ|‘¿wrapper‘?¬routinesŽ¡‘/= |handle_IRQ_event‘ X---Ž¡‘>ü|handler()–?¬->“timer_interrupt‘ X//“registered“IRQ“0“handlerŽ¡‘N»|do_timer_interruptŽ¡‘^z|do_timerŽ¡‘n9|jiffies++;Ž¡‘n9|update_process_timesŽ¡‘n9|if–?¬(--counter“<=“0)“{“//“if“time“slice“ended“thenŽ¡‘}ø |counter–?¬=“0;‘)ý`//‘¿reset“counterŽ¡‘}ø |need_resched–?¬=“1;–¿//“prepare–?¬to“rescheduleŽ¡‘n9|}Ž¡‘/= |do_softirqŽ¡‘/= |while–?¬(need_resched)“{“//“if“necessaryŽ¡‘>ü|schedule‘D;¼//‘¿rescheduleŽ¡‘>ü|handle_softirqŽ¡‘/= |}Ž¡‘¿|RESTORE_ALLŽ¡¤ê\¹Le–U F‘ÿ*¸unzioni“si“tro¸èv‘ÿqÐano:Ž¡‘¸ŽŽŽ‘¹IR•¸èQ0x00_in“terrupt,–U SA‘þã VE_ALL“[include/asm/h¸èw_irq.h]Ž¤èT‘¸ŽŽŽ‘¹do_IR•¸èQ,›U handle_IR“Q_ev“en“t˜[arc“h/i386/k“ernel/irq.c]Ž¡‘¸ŽŽŽ‘¹timer_in•¸èterrupt,›U do_timer_in“terrupt˜[arc“h/i386/k“ernel/time.c]Ž¡‘¸ŽŽŽ‘¹do_timer,›U up•Gdate_pro“cess_times˜[k¸èernel/timer.c]ŽŽŽŒ‹(9Õ Û_2 ý ~?Ÿ„€ÕÁGŽÄ6.‘ñ8Multitasking–Õdi“Lin®>ux’K×Ĺ40ŽŽ ÕÁ ýV¯‘¸ŽŽŽ‘¹do_softirq‘U [k¸èernel/soft_irq.c]Ž©W†‘¸ŽŽŽ‘¹RESTORE_ALL,–U while“loGop“[arc•¸èh/i386/k“ernel/en“try‘ÿ*¸.S]Ž¤€WNote:Ž¡‘ 9b1.ŽŽŽ‘La–?&F‘ÿ*¸unzione“"IR•¸èQ0x00_in“terrupt"–?&(come“le“altre“IR•¸èQ0xXY_in“terrupt)–?&e'“direttamenš¸ète“pun˜tata“dallaŽ¤ ®‘IDT‘³(Inš¸èterrupt–žJDescriptor“T‘ÿ*¸able,‘0•simile“all'In˜terrupt“V›ÿ*¸ector“T˜able“del“moGdo“reale,‘0•si“v¸èeda“CapŽ¡‘11–ÚypGer“informazioni),‘;Ðcosiccš¸èhe'“OGNI‘Úin˜terrupt“in“arriv˜o“al“proGcessore“v˜enga“gestito“dalla“routineŽ¡‘"IR•¸èQ0x#NR_in“terrupt"›Û5routine,‘<»do“v“e˜#NR‘ÚÑe'˜il˜n“umero˜dell'in“terrupt.‘ ÀP“ossiamo˜denire˜questeŽ¡‘macro–U come“"wrappGer“irq“handler".Ž¦‘ 9b2.ŽŽŽ‘Le–ìwrappGer“routines“vš¸èengono“eseguite,‘ QÑcome“anc˜he“le“"do_IR˜Q"“e“handle_IR˜Q_ev˜en˜t"Ž¡‘[arc•¸èh/i386/k“ernel/irq.c].Ž¦‘ 9b3.ŽŽŽ‘DopGo– ßdi“questo,‘8Nil“conš¸ètrollo“passa“alla“routing“IR˜Q‘ °uciale‘à'(pun˜tata“da“"handler()"),‘8Npreceden˜te-Ž¡‘menš¸ète–>žregistrata“con“request_irq"“[arc˜h/i386/k˜ernel/irq.c]:‘f?nel“caso“IR˜Q0“a˜vremo“"timer_in˜terrupt"Ž¡‘[arc•¸èh/i386/k“ernel/time.c].Ž¦‘ 9b4.ŽŽŽ‘Viene–U eseguita“la“"timer_inš¸èterrupt"“[arc˜h/i386/k˜ernel/time.c]“e,“quando“termina,Ž¦‘ 9b5.ŽŽŽ‘il–U conš¸ètrollo“torna“ad“alcune“routines“assem˜bler“[arc˜h/i386/k˜ernel/en˜try‘ÿ*¸.S].ŽŸ€WDescrizione:Ž©ؼPš¸èer–×gestire“il“Multitasking“quindi,‘PLin˜ux“(come“ogni“sistema“Unix-lik˜e)“utilizza“un“con˜tatore‘ópGer“tenereŽ¡traccia–U di“quan¸èto“e'“stata“utilizzata“la“CPU“dal“T‘ÿ*¸ask.Ž¦Quindi,›ůad–¯,ogni“IR¸èQ‘¯0,˜il“conš¸ètatore“viene“decremen˜tato“(pun˜to“4)“e,›ůquando“raggiunge“0,˜siamo“dobbiamoŽ¡eettuare–2¡un“T‘ÿ*¸ask“Switcš¸èhing“(pun˜to“4,‘9ˆla“v‘ÿqÐariabile“"need_resc˜hed"“viene“settata“ad“1,‘9ˆcosicc˜he'“nel“pun˜to“5Ž¡tale–U v‘ÿqÐalore“pGorta“a“cš¸èhiamare“la“"sc˜hedule"“[k˜ernel/sc˜hed.c]).ŽŸ"ŠOÂ6.3Ž‘¾Sc hedulerŽŸMª¹Lo–U scš¸èheduler“e'“quella“parte“di“coGdice“c˜he“sceglie“QUALE“T‘ÿ*¸ask“dev˜e“v˜enir“eseguito“di“v˜olta“in“v˜olta.Ž¦Ogni–U vš¸èolta“c˜he“si“dev˜e“cam˜biare“T‘ÿ*¸ask“viene“scelto“un“candidato.Ž¦Segue–U la“funzione“scš¸èhedule“[k˜ernel/sc˜hed.c].ŽŸ€Wº|scheduleŽ¡‘¿|do_softirq–?¬//“manages“post-IRQ“workŽ¡‘¿|for–?¬each“taskŽ¡‘~|calculate‘?¬counterŽ¡‘¿|prepare_to__switch–?¬//“does“anythingŽ¡‘¿|switch_mm–?¬//“change“Memory“context“(change“CR3“value)Ž¡‘¿|switch_to‘?¬(assembler)Ž¡‘~|SAVE‘?¬ESPŽ¡‘~|RESTORE‘?¬future_ESPŽ¡‘~|SAVE‘?¬EIPŽ¡‘~|push–?¬future_EIP“***“push“parametro“come“se“facessimo“una“callŽ¡‘/= |jmp–?¬__switch_to“(funzione“per“gestire“alcuni“registri)Ž¡‘/= |__switch_to()‘¿(si–?¬veda“dopo“per“la“spiegazione“del“funzionamento“del“Task“SwitchingŽ¡‘4|¸..Ž¡‘/= |ret–?¬***“ret“dalla“call“usando“il“nuovo“EIPŽ¡‘~new_taskŽŽŽŒ‹)B< Û_2 ý ~?Ÿ„€ÕÁGŽÄ6.‘ñ8Multitasking–Õdi“Lin®>ux’K×Ĺ41ŽŽ ÕÁ ýV¯Â6.4Ž‘¾Bottom–¸Half,“T›þàask“Queues“e“T˜askletsŽ¤MªÄ6.4.1Ž‘#!\In®>troQÂduzioneŽ¡¹Nei–'Ýclassici“Unix,›0êquando“arriv‘ÿqÐa“un“IR¸èQ‘'Ñ(da“un“device),˜il“sistema“eettua“il“T‘ÿ*¸ask“Switcš¸èhing“pGer“in˜terrogareŽ© ®il–U T‘ÿ*¸ask“c¸èhe“ha“fatto“accesso“al“Device.Ž¤ؼPš¸èer–U migliorare“le“pGerformance,“Lin˜ux“pGosticipa“il“la˜v˜oro“non“urgen˜te.Ž¡Questa–¾0funzionalita'“e'“stata“gestita“n“dalle“prime“vš¸èersioni“(k˜ernel“1.x“in“pšGoi)“dai“cosiddetti“"b˜ottom“halv¸èes"Ž¦(BH).–™éIn“sostanza“l'IR¸èQ‘™×handler“marca‘o1un“bšGottom“half“(ag),‘«p˜er“essere“eseguito“piu'“tardi,‘«e“duran¸ète“laŽ¦sc•¸èhedulazione›U v“engono˜pGoi˜eseguiti˜tutti˜i˜BH˜attivi.Ž¡Negli–ŒQultimi“Kernels“compare“il“meccanismo“del“"T‘ÿ*¸ask“Queue"“piu'“dinamico“del“BH‘Œe“nascono“anc¸èhe“iŽ¦"T‘ÿ*¸asklet"–U pšGer“gestire“i“sistemi“m¸èultipro˜cessore.Ž¡Lo–U sc¸èhema“e':ŽŸؼ‘ 9b1.ŽŽŽ‘Dic¸èhiarazioneŽ¤®‘ 9b2.ŽŽŽ‘MarcaturaŽ¡‘ 9b3.ŽŽŽ‘EsecuzioneŽ¤ ÖÄ6.4.2Ž‘#!\Dic®>hiarazioneŽŸMªº#define–?¬DECLARE_TASK_QUEUE(q)“LIST_HEAD(q)Ž¦#define–?¬LIST_HEAD(name)“\Ž¦‘¿struct–?¬list_head“name“=“LIST_HEAD_INIT(name)Ž¦struct–?¬list_head“{Ž¦‘¿struct–?¬list_head“*next,“*prev;Ž¦};Ž¦#define–?¬LIST_HEAD_INIT(name)“{“&(name),“&(name)“}Ž¦¦‘~''DECLARE_TASK_QUEUE''–?¬[include/linux/tqueue.h,“include/linux/list.h]ŽŸؼ¹La–»amacro“"DECLARE_T‘ÿ*¸ASK_QUEUE(q)"“viene“usata“pGer“dicš¸èhiarare“una“struttura“c˜hiamata“"q"“pGerŽ¦gestire–U i“T‘ÿ*¸ask“Queue.Ž¡Ä6.4.3Ž‘#!\MarcaturaŽŸMª¹Segue–U lo“scš¸èhema“ICA“pGer“la“"mark_bh"“[include/lin˜ux/in˜terrupt.h]:Ž¤ؼº|mark_bh(NUMBER)Ž¦‘¿|tasklet_hi_schedule(bh_task_vec–?¬+“NUMBER)Ž¦‘~|insert–?¬into“tasklet_hi_vecŽ¦‘/= |__cpu_raise_softirq(HI_SOFTIRQ)Ž¦‘>ü|soft_active–?¬|=“(1“<<“HI_SOFTIRQ)Ž¦¦‘c¹Ä''mark_bh''[include/linux/interrupt.h]Ž¡¹Quindi,–¦ad›zìesempio,“quando˜un˜IR•¸èQ‘zµhandler˜vuole˜pGosticipare˜del˜la“v“oro,‘¦basta˜c“he˜esegua˜una˜marcatura˜conŽ¦la›ºmark_bh(NUMBER)",‘·5do•¸èv“e˜NUMBER–ˆe'˜un˜BH“preceden•¸ètemen“te˜dic“hiarato˜(si˜v“eda˜sezione˜preceden“te).ŽŽŽŒ‹*Mî Û_2 ý ~?Ÿ„€ÕÁGŽÄ6.‘ñ8Multitasking–Õdi“Lin®>ux’K×Ĺ42ŽŽ ÕÁ ýV¯Ä6.4.4Ž‘#!\EsecuzioneŽŸMª¹V‘ÿ*¸ediamo–U l'esecuzione“a“partire“dalla“funzione“"do_IRš¸èQ"“[arc˜h/i386/k˜ernel/irq.c]:Ž¤ؼºif‘?¬(softirq_pending(cpu))Ž© ®‘ Xdo_softirq();Ž¡¹quindi–U la“do_softirq.c"“[k¸èernel/softirq.c]:Ž¡ºasmlinkage–?¬void“do_softirq()“{Ž¦‘ Xint–?¬cpu“=“smp_processor_id();Ž¦‘ X__u32‘?¬pending;Ž¦‘ Xlong‘?¬flags;Ž¦‘ X__u32‘?¬mask;Ž¦‘ Xdebug_function(DO_SOFTIRQ,NULL);Ž¦‘ Xif‘?¬(in_interrupt())Ž¦‘þ°return;Ž¦‘ Xlocal_irq_save(flags);Ž¦‘ Xpending–?¬=“softirq_pending(cpu);Ž¦‘ Xif–?¬(pending)“{Ž¦‘þ°struct–?¬softirq_action“*h;Ž¦‘þ°mask–?¬=“~pending;Ž¦‘þ°local_bh_disable();Ž¦‘þ°restart:Ž¦‘)ý`/*–?¬Reset“the“pending“bitmask“before“enabling“irqs“*/Ž¦‘þ°softirq_pending(cpu)–?¬=“0;Ž¦‘þ°local_irq_enable();Ž¦‘þ°h–?¬=“softirq_vec;Ž¦‘þ°do‘?¬{Ž¦‘~if–?¬(pending“&“1)Ž¦‘)ý`h->action(h);Ž¦‘~h++;Ž¦‘~pending–?¬>>=“1;Ž¦‘þ°}–?¬while“(pending);Ž¦‘þ°local_irq_disable();Ž¦‘þ°pending–?¬=“softirq_pending(cpu);Ž¦‘þ°if–?¬(pending“&“mask)“{Ž¦‘~mask–?¬&=“~pending;Ž¦‘~goto‘?¬restart;Ž¦‘þ°}Ž¦‘þ°__local_bh_enable();Ž¦‘þ°if‘?¬(pending)Ž¦‘~wakeup_softirqd(cpu);Ž¦‘ X}Ž¦‘ Xlocal_irq_restore(flags);Ž¦}Ž¡¹"h-µ>¹action(h);"–U rappresenš¸èta“la“funzione“preceden˜temen˜te“accoGdata.ŽŽŽŒ‹+V¼ Û_2 ý ~?Ÿ„€ÕÁGŽÄ6.‘ñ8Multitasking–Õdi“Lin®>ux’K×Ĺ43ŽŽ ÕÁ ýV¯Â6.5Ž‘¾Routines–¸a“bassissimo“liv elloŽ©Mª¹set_in¸ètr_gateŽ¤ؼset_trap_gateŽ¡set_task_gate–U (non“used).Ž¡(*in•¸èterrupt)[NR_IR“QS](v“oid)–U =“¸f“¹IR•¸èQ0x00_in“terrupt,›U IR“Q0x01_in“terrupt,˜..¸gŽ¡¹NR_IRš¸èQS–U =“224“[k˜ernel“2.4.2]Ž¡D¸èAF‘þã ARE:‘U DescrizioneŽŸ#ÃÂ6.6Ž‘¾T‘þàask‘¸Switc hingŽ¦Ä6.6.1Ž‘#!\Quando‘Õa®>vviene?Ž¦¹Il–U T‘ÿ*¸ask“Switc¸èhing“e'“necessario“in“molti“casi:ŽŸؼ‘¸ŽŽŽ‘¹quando–U termina“il“TimeSlice,“dobbiamo“scegliere“un“n•¸èuo“v“o–U T‘ÿ*¸ask“da“eseguireŽ¤®‘¸ŽŽŽ‘¹quando–U un“T‘ÿ*¸ask“decide“di“accedere“ad“una“risorsa,“si“addormen¸èta“e“rilascia“la“CPUŽ¡‘¸ŽŽŽ‘¹quando–Äpun“T‘ÿ*¸ask“aspšGetta“p˜er“una“pip˜e,‘á`dobbiamo“dare“accesso“ad“un“altro“T‘ÿ*¸ask“(c¸èhe“magari“sara'“quelloŽ¤ ®‘c•¸èhe›U scriv“era'˜nella˜pip•Ge˜e˜fara'˜p“oi˜risv¸èegliare˜il˜pro“cesso).ŽŸ ÖÄ6.6.2Ž‘#!\T‘ÿ ºask‘ÕSwitc®>hingŽ¦’·$ºTRUCCO–?¬DEL“TASK“SWITCHINGŽ¡¡–?¬#define“switch_to(prev,next,last)“do“{’­5,\Ž¡‘)ý`asm–?¬volatile("pushl“%%esi\n\t"’²tØ\Ž¡‘n9"pushl‘?¬%%edi\n\t"’²tØ\Ž¡‘n9"pushl‘?¬%%ebp\n\t"’²tØ\Ž¡‘n9"movl–?¬%%esp,%0\n\t"‘)ý`/*“save“ESP“*/‘4|¸\Ž¡‘n9"movl–?¬%3,%%esp\n\t"‘)ý`/*“restore“ESP“*/‘$½´\Ž¡‘n9"movl–?¬$1f,%1\n\t"›4|¸/*“save“EIP“*/˜\Ž¡‘n9"pushl–?¬%4\n\t"‘D;¼/*“restore“EIP“*/‘$½´\Ž¡‘n9"jmp‘?¬__switch_to\n"’§õ€\Ž¡‘n9"1:\t"’ì1<\Ž¡‘n9"popl‘?¬%%ebp\n\t"’·´„\Ž¡‘n9"popl‘?¬%%edi\n\t"’·´„\Ž¡‘n9"popl‘?¬%%esi\n\t"’·´„\Ž¡‘n9:"=m"–?¬(prev->thread.esp),"=m"“(prev->thread.eip),‘ X\Ž¡‘sxÈ"=b"‘?¬(last)’̳4\Ž¡‘n9:"m"–?¬(next->thread.esp),"m"“(next->thread.eip),‘þ°\Ž¡‘sxÈ"a"–?¬(prev),“"d"“(next),’·$\Ž¡‘sxÈ"b"‘?¬(prev));’Çsˆ\Ž¡}–?¬while“(0)ŽŸؼ¹Come–U si“puo'“notare“il“trucco“sta'“nelŽŸؼIl–U trucco“sta'“qui:ŽŽŽŒ‹,\F Û_2 ý ~?Ÿ„€ÕÁGŽÄ6.‘ñ8Multitasking–Õdi“Lin®>ux’K×Ĺ44ŽŽ ÕÁ ýV¯‘ 9b1.ŽŽŽ‘pushl–U %4‘*hcš¸èhe“inserisce“nello“stac˜k“il“n˜uo˜v˜o“EIP“(del“futuro“T‘ÿ*¸ask)ŽŸ®‘ 9b2.ŽŽŽ‘jmp›}ª__switc•¸èh_to‘Ròc“he˜esegue˜la˜‘ÕH__switc“h_to,‘‡Íma˜c“he˜al˜con“trario˜di˜una˜call,‘‡Íci˜fa˜ritornare˜alŽ¤ ®‘v‘ÿqÐalore–U messo“nello“stacš¸èk“al“pun˜to“1“(quindi“al“n˜uo˜v˜o“T‘ÿ*¸ask!)Ž©ؼ¡¡›>\ºU–?¬S“E“R‘¿M“O“D“E‘Y:lK“E“R“N“E“L˜M“O“D“EŽ¡¡‘?¬|–4|¸|›>\|“|‘$½´|“|˜|“|Ž¡›?¬|–4|¸|‘>\|“|˜Timer˜|“|‘>\|“|Ž¡‘?¬|›4|¸|‘>\|– XNormal“|“IRQ“|˜|‘>\|˜|Ž¡‘?¬|‘4|¸|›>\|–¿Exec“|------>|Timer_Int.|˜|‘4|¸|Ž¡›?¬|‘4|¸|–>\|“|‘þ°|–$½´|˜..“|‘>\|‘4|¸|Ž¡›?¬|‘4|¸|–>\|‘þ°\|/‘¿|‘$½´|schedule()|“|˜Task1˜Ret|Ž¡›?¬|–4|¸|‘>\|“|‘$½´|_switch_to|<--– X|“Address˜|Ž¡‘?¬|__________|‘>\|__________|‘$½´|›4|¸|– X|“|˜|Ž¡’Â3Ü|–4|¸|‘ X|S‘?¬|“|Ž¡Task1–?¬Data/Stack‘¿Task1“Code‘)ý`|›4|¸|‘ X|w“|˜|Ž¡’Â3Ü|›4|¸|–?¬T|i“|˜|Ž¡’Â3Ü|›4|¸|–?¬a|t“|˜|Ž¡›?¬|–4|¸|‘>\|“|‘$½´|“|˜s|c˜|“|Ž¡›?¬|–4|¸|‘>\|“|˜Timer˜|“|˜k|h˜|“|Ž¡‘?¬|›4|¸|‘>\|– XNormal“|“IRQ“|˜|“|i‘?¬|˜|Ž¡›?¬|‘4|¸|‘>\|–¿Exec“|------>|Timer_Int.|‘ X|n˜|‘4|¸|Ž¡›?¬|‘4|¸|–>\|“|‘þ°|–$½´|˜..“|‘ X|g˜|‘4|¸|Ž¡›?¬|‘4|¸|‘>\|‘þ°\|/‘¿|‘$½´|schedule()|– X|“|˜Task2˜Ret|Ž¡›?¬|–4|¸|‘>\|“|‘$½´|_switch_to|<--– X|“Address˜|Ž¡‘?¬|__________|–>\|__________|‘$½´|__________|“|__________|Ž¡¡Task2–?¬Data/Stack‘¿Task2“Code‘)ý`Kernel“Code‘ XKernel“Data/StackŽŸ#ÃÂ6.7Ž‘¾F‘þàorkŽ¤MªÄ6.7.1Ž‘#!\In®>troQÂduzioneŽ¡¹La–U F›ÿ*¸ork“e'“usata“pGer“creare“un“n•¸èuo“v“o‘U T˜ask.ŽŸؼSi–U parte“dal“T›ÿ*¸ask“padre,“e“si“copiano“le“strutture“dati“al“T˜ask“glio.Ž¦¤ ®’¢µÔº|‘/= |Ž¡’¢µÔ|‘?¬..‘~|Ž¡–/= Task‘?¬Parent‘9¼d|“|Ž¡–/= |“|‘9¼d|“|Ž¡‘/= |– Xfork‘¿|---------->|“CREATE‘?¬|Ž¡–/= |“|‘4|¸/|–¿NEW“|Ž¡–/= |_________|“/‘?¬|‘¿TASK‘ X|Ž¡’’öÐ/‘ X|‘/= |Ž¡‘D;¼---‘9¼d/‘¿|‘/= |Ž¡‘D;¼---‘4|¸/‘þ°|‘?¬..‘~|ŽŽŽŒ‹-cÄ Û_2 ý ~?Ÿ„€ÕÁGŽÄ6.‘ñ8Multitasking–Õdi“Lin®>ux’K×Ĺ45ŽŽ ÕÁ ýV¯’ƒ7̺/‘>\|‘/= |Ž¤ ®‘/= Task‘?¬Child‘>\/Ž¡–/= |“|‘¿/Ž¡‘/= |‘ Xfork‘¿|<-/Ž¡–/= |“|Ž¡‘/= |_________|Ž¡¡‘x¸tFork‘?¬SysCallŽŸ ÖÄ6.7.2Ž‘#!\Cosa–Õnon“viene“copiatoŽŸMª¹Il–U T›ÿ*¸ask“appGena“creato“(T˜ask“glio)“e'“quasi“iden¸ètico“al“padre“(T˜ask“padre),“as“eccezione“di:ŽŸؼ‘ 9b1.ŽŽŽ‘PID,‘U o•¸èvviamen“te!Ž©®‘ 9b2.ŽŽŽ‘La–èÍfork()‘¾del“glio“ritorna“con“0,‘ ¸men¸ètre“quella“del“padre“con“il“T‘ÿ*¸ask“del“glio“(pGer“distinguerli“inŽ¡‘User‘U MoGde)Ž¦‘ 9b3.ŽŽŽ‘T‘ÿ*¸utte–£\le“pagine“del“glio“sono“marcate“READ‘£+“EXECUTE,“senza“il“diritto“"WRITE‘xN(men¸ètreŽ¡‘il–úpadre“con•¸ètin“ua–úad“a•¸èv“ere–úi“diritti“come“prima)“cosiccš¸èhe',‘Gpquando“viene“fatta“una“ric˜hiesta“di“scrit-Ž¡‘tura,‘µéviene–¢Žscatenata“una“eccezione“di“Pš¸èage“F‘ÿ*¸ault‘wÖc˜he“creera'“a“questo“pun˜to“un“pagina“sicamen˜teŽ¡‘indipGendenš¸ète:‘öƒquesto–—¢meccanismo“viene“c˜hiamata“Cop˜y“on“W‘ÿ*¸rite‘lê(si“v˜eda“il“Cap.10“pGer“ulterioriŽ¡‘informazioni).ŽŸ ÖÄ6.7.3Ž‘#!\F‘ÿ ºork‘ÕICAŽŸMªº|sys_forkŽ¡‘¿|do_forkŽ¡‘~|alloc_task_structŽ¡‘/= |__get_free_pagesŽ¡‘$½´|p->state–?¬=“TASK_UNINTERRUPTIBLEŽ¡‘$½´|copy_flagsŽ¡‘$½´|p->pid–?¬=“get_pidŽ¡‘$½´|copy_filesŽ¡‘$½´|copy_fsŽ¡‘$½´|copy_sighandŽ¡‘$½´|copy_mm–?¬//“gestisce“la“CopyOnWrite“(I“parte)Ž¡‘4|¸|allocate_mmŽ¡‘4|¸|mm_initŽ¡‘D;¼|pgd_alloc–?¬->“get_pgd_fastŽ¡‘SúÀ|get_pgd_slowŽ¡‘4|¸|dup_mmapŽ¡‘D;¼|copy_page_rangeŽ¡‘SúÀ|ptep_set_wrprotectŽ¡‘c¹Ä|clear_bit–?¬//“marca“la“pagina“read-onlyŽ¡‘4|¸|copy_segments–?¬//“per“LDTŽ¡‘$½´|copy_threadŽ¡‘4|¸|childregs->eax–?¬=“0Ž¡‘4|¸|p->thread.esp–?¬=“childregs“//“figlio“ritorna“0Ž¡‘4|¸|p->thread.eip–?¬=“ret_from_fork“//“figlio“ricomincia“fall'uscita“della“forkŽ¡‘$½´|retval–?¬=“p->pid“//“la“fork“del“padre“ritorna“il“pid“del“figlioŽŽŽŒ‹.k Û_2 ý ~?Ÿ„€ÕÁGŽÄ6.‘ñ8Multitasking–Õdi“Lin®>ux’K×Ĺ46ŽŽ ÕÁ ýV¯‘$½´º|SET_LINKS–?¬//“Il“Task“viene“inserito“nella“lista“dei“processiŽ¤ ®‘$½´|nr_threads++–?¬//“variabile“globaleŽ¡‘$½´|wake_up_process(p)–?¬//“Adesso“possiamo“svegliare“il“Task“figlioŽ¡‘$½´|return‘?¬retvalŽ¡¡‘sxÈfork‘?¬ICAŽ¡©ؼ‘¸ŽŽŽ‘¹sys_fork‘U [arc•¸èh/i386/k“ernel/proGcess.c]Ž¤®‘¸ŽŽŽ‘¹do_fork‘U [k¸èernel/fork.c]Ž¡‘¸ŽŽŽ‘¹allo•Gc_task_struct‘U [include/asm/pro“cessor.c]Ž¡‘¸ŽŽŽ‘¹__get_free_pages‘U [mm/page_alloGc.c]Ž¡‘¸ŽŽŽ‘¹get_pid‘U [k¸èernel/fork.c]Ž¡‘¸ŽŽŽ‘¹cop¸èy_lesŽ¡‘¸ŽŽŽ‘¹cop¸èy_fsŽ¡‘¸ŽŽŽ‘¹cop¸èy_sighandŽ¡‘¸ŽŽŽ‘¹cop¸èy_mmŽ¡‘¸ŽŽŽ‘¹alloGcate_mmŽ¡‘¸ŽŽŽ‘¹mm_initŽ¡‘¸ŽŽŽ‘¹pgd_allošGc–U -µ>“¹get_pgd_fast“[include/asm/pgallo˜c.h]Ž¡‘¸ŽŽŽ‘¹get_pgd_slo¸èwŽ¡‘¸ŽŽŽ‘¹dup_mmap‘U [k¸èernel/fork.c]Ž¡‘¸ŽŽŽ‘¹cop¸èy_page_range‘U [mm/memory‘ÿ*¸.c]Ž¡‘¸ŽŽŽ‘¹ptep_set_wrprotect‘U [include/asm/pgtable.h]Ž¡‘¸ŽŽŽ‘¹clear_bit‘U [include/asm/bitops.h]Ž¡‘¸ŽŽŽ‘¹cop•¸èy_segmen“ts‘U [arc“h/i386/k“ernel/proGcess.c]Ž¡‘¸ŽŽŽ‘¹cop¸èy_threadŽ¡‘¸ŽŽŽ‘¹SET_LINKS‘U [include/lin•¸èux/sc“hed.h]Ž¡‘¸ŽŽŽ‘¹w•¸èak“e_up_proGcess‘U [k“ernel/sc“hed.c]ŽŸ ÖÄ6.7.4Ž‘#!\Cop®>y–Õon“W‘ÿ ºriteŽŸMª¹P•¸èer›U implemen“tare˜la˜Cop“y˜on˜W‘ÿ*¸rite˜Lin“ux:Ž¦‘ 9b1.ŽŽŽ‘Marca–ˆÔtutte“le“pagine“copiate“come“READ-ONL›ÿ*¸Y,“facendo“pGoi“scaturire“un“P¸èage“F˜ault“al“primo“ten-ŽŸ ®‘tativ¸èo–U di“scrittura“della“pagina.Ž¡‘ 9b2.ŽŽŽ‘Il–U gestore“di“Pš¸èage“F‘ÿ*¸ault“crea“una“n˜uo˜v‘ÿqÐa“ed“indipGenden˜te“copia“della“paginaŽŽŽŒ‹/sJ Û_2 ý ~?Ÿ„€ÕÁGŽÄ7.‘ñ8Gestione–Õdella“Memoria“su“Lin®>ux’i9¹47ŽŽ ÕÁ ýV¯¤ ®–?¬º|“PageŽ¡–?¬|“FaultŽ¡–?¬|“ExceptionŽ¡‘?¬|Ž¡‘?¬|Ž¡–?¬----------->“|do_page_faultŽ¡‘Y:l|handle_mm_faultŽ¡‘hùp|handle_pte_faultŽ¡‘x¸t|do_wp_pageŽ¡’ˆwx|alloc_page‘~//–?¬Allocata“una“nuova“paginaŽ¡’ˆwx|break_cowŽ¡’˜6||copy_cow_page–?¬//“Copia“la“vecchia“pagina“su“quella“nuovaŽ¡’˜6||establish_pte–?¬//“riconfigura“i“puntatori“della“Page“TableŽ¡’§õ€|set_pteŽ¡¡‘hùpPage–?¬Fault“ICAŽ¡©ؼ‘¸ŽŽŽ‘¹do_page_fault‘U [arc¸èh/i386/mm/fault.c]Ž¤®‘¸ŽŽŽ‘¹handle_mm_fault‘U [mm/memory‘ÿ*¸.c]Ž¡‘¸ŽŽŽ‘¹handle_pte_faultŽ¡‘¸ŽŽŽ‘¹do_wp_pageŽ¡‘¸ŽŽŽ‘¹alloGc_page‘U [include/lin¸èux/mm.h]Ž¡‘¸ŽŽŽ‘¹break_co¸èw‘U [mm/memory‘ÿ*¸.c]Ž¡‘¸ŽŽŽ‘¹cop•¸èy_co“w_pageŽ¡‘¸ŽŽŽ‘¹establish_pteŽ¡‘¸ŽŽŽ‘¹set_pte‘U [include/asm/pgtable-3lev¸èel.h]ŽŸ(ÀœÀ7Ž‘ÁGestione–G\della“Memoria“su“LincuxŽŸèÂ7.1Ž‘¾In tro_úduzioneŽ¤Mª¹Linš¸èux–U usa“la“segmen˜tazione“paginata“c˜he“semplica“molto“la“notazione.ŽŸ ÖÄ7.1.1Ž‘#!\Segmen®>tiŽ¡¹V‘ÿ*¸engono–U utilizzati“soltanš¸èto“4“segmen˜ti:Ž¦‘¸ŽŽŽ‘¹2–pñsegmenš¸èti“(coGdice“e“dati/stac˜k)“pGer“il“KERNEL–pêMODE“da–pñ[0xC000“0000]“(3“GB)›pêa“[0xFFFF˜FFFF]ŽŸ ®‘(4‘U GB)ŽŸ®‘¸ŽŽŽ‘¹2–U segmenš¸èti“(coGdice“e“dati/stac˜k)“pGer“lo“USER“MODE“da“[0]“(0“GB)“a“[0xBFFF“FFFF]“(3“GB)ŽŽŽŒ‹0zf Û_2 ý ~?Ÿ„€ÕÁGŽÄ7.‘ñ8Gestione–Õdella“Memoria“su“Lin®>ux’i9¹48ŽŽ ÕÁ ýV¯’¢µÔº__Ž¤ ®‘¿4‘?¬GB--->|‘SúÀ|‘þ°|Ž¡‘9¼d|–>\Kernel“|‘þ°|‘ XKernel–?¬Mode“(Codice“+“Dati/Stack)Ž¡‘9¼d|‘SúÀ|‘ X__|Ž¡‘¿3‘?¬GB--->|----------------|‘ X__Ž¡‘9¼d|‘SúÀ|‘þ°|Ž¡‘9¼d|‘SúÀ|‘þ°|Ž¡‘¿2‘?¬GB--->|‘SúÀ|‘þ°|Ž¡‘9¼d|‘>\Tasks‘~|‘þ°|‘ XUser–?¬Mode“(Codice“+“Dati/Stack)Ž¡‘9¼d|‘SúÀ|‘þ°|Ž¡‘¿1‘?¬GB--->|‘SúÀ|‘þ°|Ž¡‘9¼d|‘SúÀ|‘þ°|Ž¡‘9¼d|________________|‘ X__|Ž¡‘?¬0x00000000Ž¡‘4|¸Indirizzi–?¬Lineari“Kernel/UserŽ¡Ÿ#ÃÂ7.2Ž‘¾Implemen tazione‘¸386+ŽŸMª¹Lin•¸èux›E„implemen“ta˜la˜P“aginazione˜usando˜3˜Lev“elli˜di˜P“agine,‘H£ma˜su˜arc“hitettura˜386+˜solo˜2˜sono˜eettiv‘ÿqÐa-Ž¡men¸ète‘U utilizzati:ŽŸؼ¡‘¿º-----------------------------------------------------------------Ž¡–¿I“N“D“I“R“I“Z“Z“I‘$½´L“I“N“E“A“R“IŽ¡‘¿-----------------------------------------------------------------Ž¡‘)ý`\___/‘Y:l\___/‘n9\_____/Ž¡¡‘>\PD–?¬offset‘I{hPF“offset‘Y:lFrame“offsetŽ¡‘>\[10–?¬bits]‘I{h[10“bits]‘Y:l[12“bits]Ž¡‘4|¸|‘n9|’ˆwx|Ž¡–4|¸|‘n9|‘>\-----------“|Ž¡‘4|¸|‘n9|‘>\|‘?¬Valore‘ X|----------|---------Ž¡‘4|¸|–>\|‘/= |“|“|---------|‘¿/|\‘þ°|‘)ý`|Ž¡‘4|¸|–>\|›/= |“|“|˜|‘þ°|“|‘)ý`|Ž¡‘4|¸|–>\|›/= |“|“|˜|‘þ°|–?¬Frame“offset“|Ž¡‘4|¸|–>\|›/= |“|“|˜|‘¿\|/‘D;¼|Ž¡‘4|¸|–>\|‘/= |“|“|---------|<------‘>ü|Ž¡‘4|¸|–>\|›/= |“|“|˜|‘~|‘>ü|Ž¡‘4|¸|–>\|›/= |“|“|˜|‘~|–?¬x“4096‘>\|Ž¡‘4|¸|‘>\|‘/= |‘ XPF‘?¬offset|_________|-------‘>ü|Ž¡‘4|¸|‘>\|–/= |‘$½´/|\‘?¬|“|‘c¹Ä|Ž¡‘~PD–?¬offset“|_________|-----‘¿|‘ X|‘/= |‘4|¸_________|Ž¡‘>ü/|\‘?¬|–/= |‘þ°|‘¿|‘ X|“|‘4|¸|Ž¡‘D;¼|– X|›/= |‘þ°|“\|/‘?¬|˜|˜\|/Ž¡–?¬_____‘$½´|‘ X|‘/= |‘þ°------>|_________|‘¿INDIRIZZO“FISICOŽ¡|–>\|“\|/–?¬|›/= |‘þ°x“4096“|˜|Ž¡|–?¬CR3“|-------->|–/= |‘9¼d|“|Ž¡|_____|‘/= |–?¬.......“|‘9¼d|“.......“|Ž¡‘SúÀ|–/= |‘9¼d|“|ŽŽŽŒ‹1€U Û_2 ý ~?Ÿ„€ÕÁGŽÄ7.‘ñ8Gestione–Õdella“Memoria“su“Lin®>ux’i9¹49ŽŽ ÕÁ ýV¯¤ ®‘N»ºPage–?¬Directory‘4|¸Page“FileŽ¡¡‘x¸tPaginazione–?¬su“386+Ž¡¡Ÿ#ÃÂ7.3Ž‘¾Mappatura‘¸MemoryŽŸMª¹Linš¸èux–ýŠgestisce“il“Con˜trollo“di“A˜ccesso“soltan˜to“sulla“P˜aginazione,‘quindi“T‘ÿ*¸asks“dieren˜ti“pGossono“condividereŽ¡lo–íƒstesso“indirizzo“di“Segmenš¸èto“ma,‘›a˜v˜endo“dieren˜ti“v‘ÿqÐalori“nel“registro“CR3“(usato“pGer“pun˜tare“alla“P˜ageŽ¡Directory),–U punš¸ètano“eettiv‘ÿqÐamen˜te“a“dieren˜ti“P˜agine.Ž©ؼIn–‘User“mošGde“un“T‘ÿ*¸ask“non“puo'“sup˜erare“il“limite“di“3“GB‘ñ(0“x“C0“00“00“00),‘Ÿùquindi“soltan¸èto“le“prime“768Ž¡page–U directories“hanno“senso“(768*4MB“=“3GB,“pGerc¸èhe'“ogni“page“directory“e'“grande“4MB).Ž¦Quando–¡Sun“T‘ÿ*¸ask“enš¸ètra“in“Kernel“MoGde“(tramite“System“call“o“IR˜Q)‘ ýle“altre“256“pages“directories“sonoŽ¡eettiv‘ÿqÐamenš¸ète–, utilizzate“e“sono“in“com˜une“rispGetto“a“tutti“gli“altri“T‘ÿ*¸asks“(quindi“sempre“le“stesse“aree“diŽ¡memoria).Ž¦Si–U noti“cš¸èhe“lo“Spazio“Lineare“del“Kernel“(e“soltan˜to“del“Kernel)“e'“uguale“allo“Spazio“Fisico,“cosicc˜he':Ž©ؼ¡‘>üº________________‘?¬_____Ž¡‘9¼d|Altri–?¬Dati“Kernel|___– X|“|‘c¹Ä|Ž¡‘9¼d|-----------------|‘¿|‘?¬|__|‘c¹Ä|Ž¡‘9¼d|‘>\Kernel‘~|\‘ X|____|‘¿Spazio‘?¬Reale‘þ°|Ž¡‘ X3–?¬GB“--->|-----------------|“\‘~|“Altri“Dati“Kernel“|Ž¡‘9¼d|‘Y:l|\‘?¬\‘>\|‘c¹Ä|Ž¡‘9¼d|‘I{h___|_\_\____|__‘¿Spazio‘)ý`|Ž¡‘9¼d|–~Tasks“|‘ X\‘?¬\‘¿|‘>\Reale‘/= |Ž¡‘9¼d|‘I{h___|___\_\__|__‘¿Tasks‘/= |Ž¡‘9¼d|‘Y:l|‘þ°\–?¬\“|‘c¹Ä|Ž¡‘9¼d|‘Y:l|‘>\\‘?¬\|-------------------|Ž¡‘9¼d|‘Y:l|‘~\–?¬|Spazio“Reale“Kernel|Ž¡‘9¼d|_________________|‘$½´\|___________________|Ž¡¡‘9¼dIndirizzi–?¬Logici‘4|¸Indirizzi“FisiciŽ¡¦¹Lo–K’Spazio“Lineare“del“Kernel“corrispGonde“allo“Spazio“Fisico“traslato“di“3“GB‘Kin“basso“(infatti“le“page“tablesŽ¡sono–nKdel“tipGo“¸f“¹"00000000",›t–"00000001"“¸g¹,˜di“mošGdo“c¸èhe“p˜ossano“la•¸èv“orare–nKsenza“virtualizzazione,‘t–rip˜ortandoŽ¡semplicemen¸ète–U il“v‘ÿqÐalore“lineare“su“quello“sico).ŽŸؼSi–uønoti“come“non“esista“neancš¸èhe“conitto“tra“gli“indirizzi“sici“Kernel“e“quelli“User“pGerc˜he'“il“Kernel“haŽ¡un'allošGcazione–Ddi“tip˜o“statica“(quindi“conosciamo“subito“do•¸èv“e–Dpiazzare“i“dati):‘hÿp˜er“quan¸èto“riguarda“i“mo˜duliŽ¡o–Ži“dati“aggiunš¸ètivi,‘œ[basta“scegliere“i“v‘ÿqÐalori“in“moGdo“tale“c˜he“non“v‘ÿqÐadano“in“conitto“con“le“P˜age“T‘ÿ*¸ables“gia'Ž¡presen¸èti–U dello“User“MoGde.ŽŽŽŒ‹2‡ì Û_2 ý ~?Ÿ„€ÕÁGŽÄ7.‘ñ8Gestione–Õdella“Memoria“su“Lin®>ux’i9¹50ŽŽ ÕÁ ýV¯Â7.4Ž‘¾Allo_úcazione–¸della“memoria“a“basso“liv elloŽ¤MªÄ7.4.1Ž‘#!\Inizializzazione–Õdi“A‘þ¸øvvioŽ¡¹Si–U parte“dalla“funzione“kmem_cacš¸èhe_init‘*h(lanciata“da“start_k˜ernel“[init/main.c]“all'a˜vvio):Ž¤ؼº|kmem_cache_initŽ© ®‘¿|kmem_cache_estimateŽ¡‘¸ŽŽŽ‘¹kmem_cac¸èhe_init‘U [mm/slab.c]ŽŸ®‘¸ŽŽŽ‘¹kmem_cac¸èhe_estimateŽ¡Con•¸ètin“uiamo–U con“mem_init‘*h(ancš¸èh'essa“lanciata“da“start_k˜ernel[init/main.c])Ž¡º|mem_initŽ¦‘¿|free_all_bootmemŽ¦‘~|free_all_bootmem_coreŽ¡‘¸ŽŽŽ‘¹mem_init‘U [arc¸èh/i386/mm/init.c]Ž¤®‘¸ŽŽŽ‘¹free_all_b•Go“otmem‘U [mm/b“o“otmem.c]Ž¡‘¸ŽŽŽ‘¹free_all_b•Go“otmem_coreŽŸ ÖÄ7.4.2Ž‘#!\AlloQÂcazione‘ÕRun-timeŽŸMª¹Su–euLinš¸èux,‘iŠquando“v˜ogliamo“alloGcate“memoria,‘iŠad“esempio“duran˜te“la“"cop˜y_on_write"“(si“v˜eda“il“Cap.10),Ž¦c¸èhiamiamo:Ž¤ؼº|copy_mmŽ¦‘¿|allocate_mm–?¬=“kmem_cache_allocŽ¦‘~|__kmem_cache_allocŽ¦‘/= |kmem_cache_alloc_oneŽ¦‘>ü|alloc_new_slabŽ¦‘N»|kmem_cache_growŽ¦‘^z|kmem_getpagesŽ¦‘n9|__get_free_pagesŽ¦‘}ø |alloc_pagesŽ¦’·$|alloc_pages_pgdatŽ¦’v(|__alloc_pagesŽ¦’­5,|rmqueueŽ¦’­5,|reclaim_pagesŽ¡‘¸ŽŽŽ‘¹cop•¸èy_mm‘U [k“ernel/fork.c]Ž¤®‘¸ŽŽŽ‘¹alloGcate_mm‘U [k¸èernel/fork.c]Ž¡‘¸ŽŽŽ‘¹kmem_cac¸èhe_alloGc‘U [mm/slab.c]Ž¡‘¸ŽŽŽ‘¹__kmem_cac¸èhe_alloGcŽ¡‘¸ŽŽŽ‘¹kmem_cac¸èhe_alloGc_oneŽŽŽŒ‹3‘ó Û_2 ý ~?Ÿ„€ÕÁGŽÄ7.‘ñ8Gestione–Õdella“Memoria“su“Lin®>ux’i9¹51ŽŽ ÕÁ ýV¯‘¸ŽŽŽ‘¹alloGc_new_slabŽ¤®‘¸ŽŽŽ‘¹kmem_cac•¸èhe_gro“wŽ¡‘¸ŽŽŽ‘¹kmem_getpagesŽ¡‘¸ŽŽŽ‘¹__get_free_pages‘U [mm/page_alloGc.c]Ž¡‘¸ŽŽŽ‘¹alloGc_pages‘U [mm/n¸èuma.c]Ž¡‘¸ŽŽŽ‘¹alloGc_pages_pgdatŽ¡‘¸ŽŽŽ‘¹__allo•Gc_pages‘U [mm/page_allo“c.c]Ž¡‘¸ŽŽŽ‘¹rm_queueŽ¡‘¸ŽŽŽ‘¹reclaim_pages‘U [mm/vmscan.c]Ž©ؼD¸èAF‘þã ARE:–U Capire“le“ZoneŽŸ#ÃÂ7.5Ž‘¾Sw appingŽ¤MªÄ7.5.1Ž‘#!\In®>troQÂduzioneŽ¡¹Lo–U Swš¸èapping“viene“gestito“dal“demone“ksw˜apGd‘*h(Kernel“Thread).ŽŸ ÖÄ7.5.2Ž‘#!\ksw®>apQÂdŽ¡¹Come–U tutti“i“Kernel“Threads,“kswš¸èapGd‘*hha“un“ciclo“principale“in“attesa“di“essere“sv˜egliato.Ž¦º|kswapdŽ¤ ®‘¿|//–?¬routines“di“inizializzazioneŽ¡‘¿|for–?¬(;;)“{“//“Ciclo“principaleŽ¡‘~|do_try_to_free_pagesŽ¡‘~|recalculate_vm_statsŽ¡‘~|refill_inactive_scanŽ¡‘~|run_task_queueŽ¡‘~|interruptible_sleep_on_timeout–?¬//“In“attesa“di“essere“svegliatiŽ¡‘¿|}Ž¦‘¸ŽŽŽ‘¹ksw¸èapGd‘U [mm/vmscan.c]Ž¤®‘¸ŽŽŽ‘¹do_try_to_free_pagesŽ¡‘¸ŽŽŽ‘¹recalculate_vm_stats‘U [mm/sw¸èap.c]Ž¡‘¸ŽŽŽ‘¹rell_inactiv•¸èe_scan‘U [mm/vmsw“ap.c]Ž¡‘¸ŽŽŽ‘¹run_task_queue‘U [k¸èernel/softirq.c]Ž¡‘¸ŽŽŽ‘¹in•¸èterruptible_sleep_on_timeout‘U [k“ernel/sc“hed.c]ŽŽŽŒ‹4˜# Û_2 ý ~?Ÿ„€ÕÁGŽÄ8.‘ñ8La–ÕRete“su“Lin®>ux’b¯:¹52ŽŽ ÕÁ ýV¯Ä7.5.3Ž‘#!\Quando–Õabbiamo“bisogno“dello“sw®>apping?ŽŸMª¹Lo–o Swš¸èapping“e'“necessario“quando“dobbiamo“accedere“ad“una“pagina“c˜he“non“e'“presen˜te“in“memoria“sica:Ž¤ ®il–U tutto“viene“scatenato“da“un'eccezione“(generata“dall'accesso“non“autorizzato):Ž©ؼ–?¬º|“Page“Fault“ExceptionŽ¡–?¬|“cause“by“all“these“conditions:Ž¡–?¬|‘¿a-)“User“pageŽ¡–?¬|‘¿b-)“Read“or“write“accessŽ¡–?¬|‘¿c-)“Page“not“presentŽ¡‘?¬|Ž¡‘?¬|Ž¡–?¬----------->“|do_page_faultŽ¡‘Y:l|handle_mm_faultŽ¡‘hùp|pte_allocŽ¡‘x¸t|pte_alloc_oneŽ¡’ˆwx|__get_free_page–?¬=“__get_free_pagesŽ¡’˜6||alloc_pagesŽ¡’§õ€|alloc_pages_pgdatŽ¡’·´„|__alloc_pagesŽ¡’Çsˆ|wakeup_kswapd–?¬//“Svegliamo“kswapdŽ¡¡‘c¹ÄPage–?¬Fault“ICAŽ¡¦‘¸ŽŽŽ‘¹do_page_fault‘U [arc¸èh/i386/mm/fault.c]Ž¤®‘¸ŽŽŽ‘¹handle_mm_fault‘U [mm/memory‘ÿ*¸.c]Ž¡‘¸ŽŽŽ‘¹pte_alloGcŽ¡‘¸ŽŽŽ‘¹pte_allo•Gc_one‘U [include/asm/pgallo“c.h]Ž¡‘¸ŽŽŽ‘¹__get_free_page‘U [include/lin¸èux/mm.h]Ž¡‘¸ŽŽŽ‘¹__get_free_pages‘U [mm/page_alloGc.c]Ž¡‘¸ŽŽŽ‘¹alloGc_pages‘U [mm/n¸èuma.c]Ž¡‘¸ŽŽŽ‘¹alloGc_pages_pgdatŽ¡‘¸ŽŽŽ‘¹__alloGc_pagesŽ¡‘¸ŽŽŽ‘¹w•¸èak“eup_ksw“apGd‘U [mm/vmscan.c]ŽŸ(ÀœÀ8Ž‘ÁLa–G\Rete“su“LincuxŽŸèÂ8.1Ž‘¾Come–¸viene“gestita“la“Rete“su“Lin ux?ŽŸMª¹Pš¸èer–…:ogni“tipGo“di“NIC‘…-vi“e'“un“device“driv˜er“c˜he“lo“gestisce“(ad“esempio“pGer“la“il“device“NE2000“compatibileŽ¤ ®oppure–U pšGer“la“p˜eriferica“3COM“3C59X,“ecc.).ŽŸؼDopGo–K‹il“device“a“basso“liv•¸èello,‘É%Lin“ux›K‹c“hiama˜SEMPRE‘K la˜routine˜di˜routing˜ad˜alto˜liv“ello˜"netif_rxŽ¡[net/core/dev.c]",–U cš¸èhe“con˜trolla:ŽŽŽŒ‹5ó Û_2 ý ~?Ÿ„€ÕÁGŽÄ8.‘ñ8La–ÕRete“su“Lin®>ux’b¯:¹53ŽŽ ÕÁ ýV¯‘¸ŽŽŽ‘¹A–U quale“protoGcollo“di“3“livš¸èello“appartiene“il“pacc˜hetto“in“questioneŽŸ®‘¸ŽŽŽ‘¹Quale–U cš¸èhiamata“(tramite“pun˜tatori“virtuali)“eseguire“pGer“gestirloŽŸ#ÃÂ8.2Ž‘¾Esempio‘¸pratico:‘ÿ TCPŽ¤Mª¹V‘ÿ*¸edremo– $un“esempio“di“quello“cš¸èhe“accade“quando“mandamo“dobbiamo“ricev˜ere“un“pacc˜hetto“TCP‘ÿ*¸,“partendoŽ© ®dalla–U netif_rx“[net/core/dev.c]›*h(in“sostanza“analizziamo“a“grandi“linee˜lo“stacš¸èk“TCP/IP“di“Lin˜ux).ŽŸ ÖÄ8.2.1Ž‘#!\Gestione‘ÕIn®>terrupt:‘ "netif_rx"Ž¡º|netif_rxŽ¦‘¿|__skb_queue_tailŽ¦‘~|qlen++Ž¦‘~|*–?¬Inserimento“tramite“puntatori“nella“coda“pacchetti*Ž¦‘¿|cpu_raise_softirqŽ¦‘~|softirq_active(cpu)–?¬|=“(1“<<“NET_RX_SOFTIRQ)“//“settiamo“il‘ Xbit“NET_RX_SOFTIRQ“nel“vettore“BHŽ¦Ÿؼ‘¸ŽŽŽ‘¹__skb_queue_tail‘U [include/lin¸èux/skbu.h]ŽŸ®‘¸ŽŽŽ‘¹cpu_raise_softirq‘U [k¸èernel/softirq.c]ŽŸ ÖÄ8.2.2Ž‘#!\Gestione–ÕPš®>ost“In˜terrupt:‘ "net_rx_action"Ž¡¹Una–)@vš¸èolta“c˜he“l'in˜terazione“IR˜Q‘)4e'“terminata,‘2seguiamo“cosa“accade“in“fase“di“sc˜heduling“quando“si“esegue“ilŽ¦BH‘$ÿrelativš¸èo–% alla“rete“c˜he“abbiamo“attiv‘ÿqÐato“tramite“NET_RX_SOFTIR˜Q:“in“pratica“andiamo“a“c˜hiamare“laŽ¦net_rx_action–U [net/core/dev.c]‘*hcome“spGecicato“da“"net_dev_init“[net/core/dev.c]".ŽŸؼº|net_rx_actionŽ¦‘¿|skb–?¬=“__skb_dequeue“(operazione“inversa“della“__skb_queue_tail)Ž¦‘¿|for–?¬(ptype“=“first_protocol;“ptype“<“max_protocol;“ptype++)“//“DeterminiamoŽ¦‘~|if–?¬(skb->protocol“==“ptype)’¢µÔ//“qual'e'“il“protocollo“di“reteŽ¦‘/= |ptype->func–?¬->“ip_rcv“//“come“specificato“sulla“''struct“ip_packet_type“[net/ipv4/ip_output.c]''Ž¦¦‘þ°****–?¬ADESSO“SAPPIAMO“CHE“IL“PACCHETTO“E'“DI“TIPO“IP“****Ž¦‘/= |ip_rcvŽ¦‘>ü|NF_HOOK‘?¬(ip_rcv_finish)Ž¦‘N»|ip_route_input–?¬//“accediamo“alla“tabella“di“routing“per“capire“qual“e'“la“funzione“da“chiamare“(qual“e'“cioe'“l'interfaccia)Ž¦‘^z|skb->dst->input–?¬->“ip_local_deliver“//“come“da“controllo“della“tabella“di“routing“la“destinazione“e'“la“macchina“localeŽ¦‘n9|ip_defrag–?¬//“riassembliamo“i“frammenti“IPŽ¦‘}ø |NF_HOOK‘?¬(ip_local_deliver_finish)Ž¦’·$|ipprot->handler–?¬->“tcp_v4_rcv“//“come“da“''tcp_protocol“[include/net/protocol.c]''Ž¦¦‘>\****–?¬ADESSO“SAPPIAMO“CHE“IL“PACCHETTO“E'“TCP“****Ž¦’·$|tcp_v4_rcvŽ¦’v(|sk–?¬=“__tcp_v4_lookupŽ¦’v(|tcp_v4_do_rcvŽ¦’­5,|switch(sk->state)Ž¦ŽŽŒ‹6¥ Û_2 ý ~?Ÿ„€ÕÁGŽÄ8.‘ñ8La–ÕRete“su“Lin®>ux’b¯:¹54ŽŽ ÕÁ ýV¯‘>\º***–?¬Il“pacchetto“puo'“essere“mandato“al“Task“tramite“il“socket“aperto“***Ž¤ ®’­5,|case‘?¬TCP_ESTABLISHED:Ž¡’¼ô0|tcp_rcv_establishedŽ¡’̳4|__skb_queue_tail–?¬//“accoda“il“pacchetto“sul“socketŽ¡’̳4|sk->data_ready–?¬->“sock_def_readableŽ¡’Ür8|wake_up_interruptibleŽ¡¡¡‘>\***–?¬Dobbiamo“gestire“il“3-way“TCP“handshake“***Ž¡’­5,|case‘?¬TCP_LISTEN:Ž¡’¼ô0|tcp_v4_hnd_reqŽ¡’̳4|tcp_v4_search_reqŽ¡’̳4|tcp_check_reqŽ¡’Ür8|syn_recv_sock–?¬->“tcp_v4_syn_recv_sockŽ¡’̳4|__tcp_v4_lookup_establishedŽ¡’­5,|tcp_rcv_state_processŽ¡¡‘hùp***–?¬3-Way“TCP“Handshake“***Ž¡’¼ô0|switch(sk->state)Ž¡’¼ô0|case–?¬TCP_LISTEN:“//“Riceviamo“il“SYNŽ¡’̳4|conn_request–?¬->“tcp_v4_conn_requestŽ¡’Ür8|tcp_v4_send_synack–?¬//“Mandiamo“SYN“+“ACKŽ¡’ì1<|tcp_v4_synq_add–?¬//“settiamo“lo“stato“SYNŽ¡’¼ô0|case–?¬TCP_SYN_SENT:“//“riceviamo“SYN“+“ACKŽ¡’̳4|tcp_rcv_synsent_state_processŽ¡’Ür8tcp_set_state(TCP_ESTABLISHED)Ž¡’ì1<|tcp_send_ackŽ¡’ûð@|tcp_transmit_skbŽ¡’ ¯D|queue_xmit–?¬->“ip_queue_xmitŽ¡’nH|ip_queue_xmit2Ž¡’+-L|skb->dst->outputŽ¡’¼ô0|case–?¬TCP_SYN_RECV:“//“Riceviamo“ACKŽ¡’̳4|if‘?¬(ACK)Ž¡’Ür8|tcp_set_state(TCP_ESTABLISHED)Ž¡ŸH‘¸ŽŽŽ‘¹net_rx_action‘U [net/core/dev.c]Ž¤‘¸ŽŽŽ‘¹__skb_dequeue‘U [include/lin¸èux/skbu.h]Ž¡‘¸ŽŽŽ‘¹ip_rcv‘U [net/ip¸èv4/ip_input.c]Ž¡‘¸ŽŽŽ‘¹NF_HOOK–U -µ>“¹nf_hoGok_slo¸èw“[net/core/netlter.c]Ž¡‘¸ŽŽŽ‘¹ip_rcv_nish‘U [net/ip¸èv4/ip_input.c]Ž¡‘¸ŽŽŽ‘¹ip_route_input‘U [net/ip¸èv4/route.c]Ž¡‘¸ŽŽŽ‘¹ip_loGcal_deliv•¸èer‘U [net/ip“v4/ip_input.c]Ž¡‘¸ŽŽŽ‘¹ip_defrag‘U [net/ip•¸èv4/ip_fragmen“t.c]Ž¡‘¸ŽŽŽ‘¹ip_loGcal_deliv•¸èer_nish‘U [net/ip“v4/ip_input.c]Ž¡‘¸ŽŽŽ‘¹tcp_v4_rcv‘U [net/ip•¸èv4/tcp_ip“v4.c]ŽŽŽŒ‹7¯ Û_2 ý ~?Ÿ„€ÕÁGŽÄ8.‘ñ8La–ÕRete“su“Lin®>ux’b¯:¹55ŽŽ ÕÁ ýV¯‘¸ŽŽŽ‘¹__tcp_v4_loGokupŽ¤VꑸŽŽŽ‘¹tcp_v4_do_rcvŽ¡‘¸ŽŽŽ‘¹tcp_rcv_established‘U [net/ip¸èv4/tcp_input.c]Ž¡‘¸ŽŽŽ‘¹__skb_queue_tail‘U [include/lin¸èux/skbu.h]Ž¡‘¸ŽŽŽ‘¹so•Gcš¸èk_def_readable‘U [net/core/so“c˜k.c]Ž¡‘¸ŽŽŽ‘¹w•¸èak“e_up_in“terruptible‘U [include/lin“ux/sc“hed.h]Ž¡‘¸ŽŽŽ‘¹tcp_v4_hnd_req‘U [net/ip•¸èv4/tcp_ip“v4.c]Ž¡‘¸ŽŽŽ‘¹tcp_v4_searc¸èh_reqŽ¡‘¸ŽŽŽ‘¹tcp_c•¸èhec“k_reqŽ¡‘¸ŽŽŽ‘¹tcp_v4_syn_recv_soGc¸èkŽ¡‘¸ŽŽŽ‘¹__tcp_v4_loGokup_establishedŽ¡‘¸ŽŽŽ‘¹tcp_rcv_state_proGcess‘U [net/ip¸èv4/tcp_input.c]Ž¡‘¸ŽŽŽ‘¹tcp_v4_conn_request‘U [net/ip•¸èv4/tcp_ip“v4.c]Ž¡‘¸ŽŽŽ‘¹tcp_v4_send_synac¸èkŽ¡‘¸ŽŽŽ‘¹tcp_v4_synq_addŽ¡‘¸ŽŽŽ‘¹tcp_rcv_synsen•¸èt_state_proGcess‘U [net/ip“v4/tcp_input.c]Ž¡‘¸ŽŽŽ‘¹tcp_set_state‘U [include/net/tcp.h]Ž¡‘¸ŽŽŽ‘¹tcp_send_ac•¸èk‘U [net/ip“v4/tcp_output.c]Ž¤~ÑDescrizione:Ž¡‘¸ŽŽŽ‘¹Prima–U determiniamo“il“tipšGo“di“proto˜collo“(IP‘ÿ*¸,“p˜oi“TCP)Ž¤VꑸŽŽŽ‘¹NF_HOOK‘((funzione)–Ue'“una“routine“di“incapsulazione“cš¸èhe“prima“gestisce“il“ltro“di“rete“(rew˜all),Ž© ®‘eppGoi–U c¸èhiama“la“funzione.Ž¡‘¸ŽŽŽ‘¹DopGo–U gestiamo“il“3-w•¸èa“y–U TCP“Handshak¸èe:Ž¤~ѺSERVER–?¬(LISTENING)‘x¸tCLIENT“(CONNECTING)Ž¦’·$SYNŽ¦‘c¹Ä<-------------------Ž¦¦¦‘}ø SYN–?¬+“ACKŽ¦‘c¹Ä------------------->Ž¦¦¦’·$ACKŽ¦‘c¹Ä<-------------------Ž¦¦‘hùp3-Way–?¬TCP“handshakeŽ¡‘¸ŽŽŽ‘¹Alla–øÃne“dobbiamo“solo“piu'“lanciare“"tcp_rcv_established“[net/ipš¸èv4/tcp_input.c]"“c˜he“manda“il“pac-Ž¦‘cš¸èhetto–U al“soGc˜k˜et“e“sv˜eglia“il“proGcesso“in“attesa“dello“stessoŽŽŽŒ‹8¶¥ Û_2 ý ~?Ÿ„€ÕÁGŽÄ9.‘ñ8Lin®>ux–ÕFile“System’^_¹56ŽŽ ÕÁ ýV¯À9Ž‘ÁLincux–G\File“SystemŽŸ¿:¹D¸èAF‘þã AREŽŸ(ÀœÀ10Ž‘¬%Utili‘G\NoteŽŸèÂ10.1Ž‘%}¨Stac k–¸e“HeapŽ¤MªÄ10.1.1Ž‘(áIn®>troQÂduzioneŽ¡¹Qui–U vš¸èediamo“come“v˜engono“alloGcati“in“memoria“"stac˜k"“ed“"heap".ŽŸ ÖÄ10.1.2Ž‘(áAlloQÂcazione–Õdi“memoriaŽ¡ºFF..‘)ý`|‘Y:l|–?¬<--“inizio“dello“stackŽ¤ ®‘$½´/|\‘ X|‘Y:l|‘¿|Ž¡–?¬valori“|–¿|‘Y:l|“|“stackŽ¡piu'alti|‘¿|‘Y:l|– X\|/“crescenteŽ¡di‘?¬memoria‘ X|‘Y:l|Ž¡XX..‘)ý`|‘Y:l|–?¬<--“attuale“puntatore“stackŽ¡‘>ü|‘Y:l|Ž¡‘>ü|‘Y:l|Ž¡‘>ü|‘Y:l|Ž¡00..‘)ý`|_________________|–?¬<--“fine“dello“stack“[Stack“Segment]Ž¡¡‘c¹ÄStackŽ©ؼ¹Gli–ãindirizzi“di“memoria“partono“da“00..‘W(cš¸èhe“e'“il“do˜v˜e“il“Segmen˜to“dello“Stac˜k“comincia)“e“aumen˜tano“v˜ersoŽ¡il–þæv‘ÿqÐalore“FF..,‘)Xmenš¸ètre“lo“stac˜k“cresce“all'opp•Gosto,‘)Xcio“e'–þædal“v›ÿqÐalore“FF..‘nÓal“v˜aloGce“00..‘nÓv¸èerso“v˜alori“bassi“diŽ¡memoriaŽ¤ؼXX..‘q€e'–U il“v‘ÿqÐalore“attuale“dello“Stacš¸èk“P˜oin˜ter.Ž¡Lo–U Stacš¸èk“viene“solitamen˜te“usato“pGer:Ž¦‘ 9b1.ŽŽŽ‘v‘ÿqÐariabili‘U globaliŽ¤®‘ 9b2.ŽŽŽ‘v‘ÿqÐariabili‘U loGcaliŽ¡‘ 9b3.ŽŽŽ‘indirizzo–U di“ritornoŽ¦A¸èd–U esempio“una“classica“funzioneŽ¦–?¬º|int“funzione“(parametro_1,“parametro_2,“...,“parametro_N)“{Ž¤ ®‘þ°|dichiarazione‘?¬variabile_1;Ž¡‘þ°|dichiarazione‘?¬variabile_2;Ž¡‘~..Ž¡‘þ°|dichiarazione‘?¬variabile_N;Ž¡¡‘þ°|//–?¬Corpo“della“funzioneŽ¡‘þ°|dichiarazione‘?¬variabile_dinamica_1;ŽŽŽŒ‹9¾ Û_2 ý ~?Ÿ„€ÕÁGŽÄ10.‘ñ8Utili‘ÕNote’€è\¹57ŽŽ ÕÁ ýV¯‘þ°º|dichiarazione‘?¬variabile_dinamica_2;Ž¤ ®‘>\..Ž¡‘þ°|dichiarazione‘?¬variabile_dinamica_N;Ž¡¡‘þ°|//–?¬Il“Codice“e'“all'interno“del“Segmento“di“Codice,“non“nel“Segmento“Dati/Stack!Ž¡¡‘þ°|return–?¬(ret-type)“valore;“//“Spesso“finisce“in“qualche“registro,“per“386+:“registro“''eax''Ž¡‘?¬|}Ž¤z¯‘'ÿ¹utilizza–U uno“stac¸èk“del“tipGoŽ¡‘4|¸º|‘x¸t|Ž¤ ®‘4|¸|–?¬1.“parametro_1“pushato|“\Ž¡‘þ°S‘>\|–?¬2.“parameter_2“pushato|‘ X|“Prima“dellaŽ¡‘þ°T‘>\|–?¬...................‘¿|‘ X|“chiamataŽ¡‘þ°A‘>\|–?¬N.“parameter_N“pushato|“/Ž¡‘þ°C‘>\|–?¬*Indirizzo“di“Ritorno*|“--“ChiamataŽ¡‘þ°K‘>\|–?¬1.“variabile_1“locale“|“\Ž¡‘4|¸|–?¬2.“variabile_2“locale“|‘ X|“Dopo“laŽ¡‘4|¸|–?¬.................‘>\|‘ X|“chiamataŽ¡‘4|¸|–?¬N.“variabile_N“locale“|“/Ž¡‘4|¸|‘x¸t|Ž¡‘/= ...‘n9...‘¿StackŽ¡‘/= ...‘n9...‘¿LiberoŽ¡‘4|¸|‘x¸t|Ž¡‘þ°H‘>\|–?¬N.variabile_N“dinamica|“\Ž¡‘þ°E‘>\|–?¬...................‘¿|‘ X|“Allocato“dalleŽ¡‘þ°A‘>\|–?¬2.variabile_2“dinamica|‘ X|“malloc“&“kmallocŽ¡‘þ°P‘>\|–?¬1.variabile_1“dinamica|“/Ž¡‘4|¸|_______________________|Ž¡¡‘>üUtilizzo–?¬tipico“dello“StackŽ¡©z¯¹Nota:‘î¼L'ordine–“¾delle“v‘ÿqÐariabile“puo'“essere“dierenš¸ète“a“seconda“dell'arc˜hitettura“hardw˜are“(come“sempre“quiŽ¡si–U ipGotizza“l'utilizzo“del“386+).Ž¦Ÿ"á~Â10.2Ž‘%}¨Applicazione–¸vs“T‘þàaskŽ¤MªÄ10.2.1Ž‘(áDenizioni–Õdi“BaseŽ¡¹Distinguiamo–U 2“2“concetti:ŽŸz®‘¸ŽŽŽ‘¹Applicazione:‘q€cš¸èhe–U e'“il“coGdice“c˜he“v˜ogliamo“eseguireŽŸ"‘¸ŽŽŽ‘¹ProGcesso:‘c•¸èhe›Žrappresen“ta˜l'Immagine˜in˜memoria˜dell'applicazione˜(dipGende˜dalla˜strategia˜di˜memoriaŽŸ ®‘utilizzata,–U Segmenš¸ètazione“e/o“P˜aginazione).Ž¦SpšGesso–U i“Pro˜cessi“vš¸èengono“c˜hiamati“T‘ÿ*¸ask“o“Thread.ŽŽŽŒ‹:ÄR Û_2 ý ~?Ÿ„€ÕÁGŽÄ10.‘ñ8Utili‘ÕNote’€è\¹58ŽŽ ÕÁ ýV¯Â10.3Ž‘%}¨Lo_úc ksŽ¤MªÄ10.3.1Ž‘(áIn®>troQÂduzioneŽ¡¹2–U tipi“di“loGc¸èks:ŽŸؼ‘ 9b1.ŽŽŽ‘in¸ètraCPUŽŸ®‘ 9b2.ŽŽŽ‘in¸èterCPUŽŸ#ÃÂ10.4Ž‘%}¨Cop y_on_writeŽ¡¹Il–ê¬meccanismo“della“Copš¸èy_on_write“consen˜te“di“ridurre“l'utilizzo“di“memoria,‘ÿöp•Gostp“onendo›ê¬l'allo“cazione˜p“erŽ¤ ®un›U n•¸èuo“v“o˜Thread˜no˜a˜quando˜non˜e'˜strettamen“te˜necessario.Ž©ؼAš¸èd–+esempio,‘quando“un“T‘ÿ*¸ask“esegue“la“"fork()"“pGer“creare“un“n˜uo˜v˜o“ProGcesso,‘le“pagine“del“v˜ecc˜hio“proGcessoŽ¡non–Ì~vš¸èengono“copiate,‘çÒma“v˜engono“soltan˜to“"referenziate"“in“mošGdalita'“READ–Ì\ONL‘ÿ*¸Y“(sia–Ì~p˜er“il“padre“c¸èhe“p˜erŽ¡il––Rglio)“in“moGdo“cš¸èhe,‘¦žquando“qualcuno“andra'“a“scriv˜ervi“sopra,‘¦žl'eccezione“generata“si“o•Gccup“era'––Rdi“creareŽ¡una›U n•¸èuo“v‘ÿqÐa˜copia˜della˜pagina˜marcandola,˜questa˜v“olta˜READ˜+˜WRITE.Ž¦Ecco–U uno“scš¸èhema“riassun˜tiv˜o:ŽŸؼº1-)–?¬La“Pagina“X“e'“condivisa“tra“Il“Task“Padre“e“quello“figlioŽ¡–?¬Task“PadreŽ¡–?¬|‘/= |“Accesso“RO“________Ž¡–?¬|‘/= |---------->|Pagina“X|Ž¡‘?¬|_________|‘9¼d|________|Ž¡’ˆwx/|\Ž¡’·$|Ž¡–?¬Task“Figlio‘N»|Ž¡–?¬|‘/= |“Accesso“RO‘þ°|Ž¡‘?¬|‘/= |----------------Ž¡‘?¬|_________|Ž¡¡¡2-)–?¬Richiesta“di“ScritturaŽ¡–?¬Task“FiglioŽ¡–?¬|‘/= |“Accesso“RO“________Ž¡–?¬|‘/= |---------->|Pagina“X|“(tentativo“di“scrittura)Ž¡‘?¬|_________|–9¼d|________|“|Ž¡’ˆwx/|\‘N»|Ž¡’·$|‘N»\|/Ž¡–?¬Task“Figlio‘N»|‘>üECCEZIONEŽ¡–?¬|‘/= |“Accesso“RO‘þ°|Ž¡‘?¬|‘/= |----------------Ž¡‘?¬|_________|Ž¡¡¡3-)–?¬Configurazione“Finale:“il“Task“Padre“e“quello“Figlio“hanno“ognuno“una“copia“indipendente“della“Pagina,“X“e“YŽ¡–?¬Task“PadreŽ¡–?¬|‘/= |“Accesso“RW“________Ž¡–?¬|‘/= |---------->|Pagina“X|ŽŽŽŒ‹;ËÇ Û_2 ý ~?Ÿ„€ÕÁGŽÄ11.‘ñ8Dettagli–ÕspQÂecici“su“386+’3AÖ¹59ŽŽ ÕÁ ýV¯‘?¬º|_________|‘9¼d|________|Ž¤ ®¡¡–?¬Task“FiglioŽ¡–?¬|‘/= |“Accesso“RW“________Ž¡–?¬|‘/= |---------->|Pagina“Y|Ž¡‘?¬|_________|‘9¼d|________|ŽŸ(ÀœÀ11Ž‘¬%Dettagli–G\sppœecici“su“386+ŽŸèÂ11.1Ž‘%}¨A‘þ€vvioŽ©Mªºbbootsect.s‘?¬[arch/i386/boot]Ž¡setup.S‘?¬(+video.S)Ž¡head.S–?¬(+misc.c)“[arch/i386/boot/compressed]Ž¡start_kernel‘?¬[init/main.c]ŽŸ#ÃÂ11.2Ž‘%}¨Descrittori‘¸386+Ž¦Ä11.2.1Ž‘(áIn®>troQÂduzioneŽ¦¹I–U Descrittori“sono“delle“strutture“dati“usate“nell'arc¸èhitettura“i386+“pGer“utilizzare“la“memoria“virtuale.ŽŸ ÖÄ11.2.2Ž‘(áTipi–Õdi“descrittoriŽŸ#‘¸ŽŽŽ‘¹GDT–U (Global“Descriptor“T‘ÿ*¸able)Ž¤®‘¸ŽŽŽ‘¹LDT–U (LoGcal“Descriptor“T‘ÿ*¸able)Ž¡‘¸ŽŽŽ‘¹IDT–U (In¸èterrupt“Descriptor“T‘ÿ*¸able)ŽŸ(ÀœÀ12Ž‘¬%IRcQŽŸèÂ12.1Ž‘%}¨In tro_úduzioneŽ¦¹L'IR¸èQ‘k‡e'–kun“segnale“asincrono“mandato“al“microprošGcessore“p˜er“a•¸èvv“ertirlo›kc“he˜un˜la“v“oro˜e'˜stato˜completatoŽ¤ ®o–U cš¸èhe“si“e'“v˜ericato“un“errore.ŽŸ#ÃÂ12.2Ž‘%}¨Scš hema–¸di“In˜terazioneŽ¦’­5,º|<-->‘ XIRQ(0)‘?¬[Timer]Ž¡’­5,|<-->‘ XIRQ(1)–?¬[Device“1]Ž¡’­5,|‘?¬..Ž¡’­5,|<-->‘ XIRQ(n)–?¬[Device“n]Ž¡‘þ°_____________________________|Ž¡‘>\/|\‘~/|\‘4|¸/|\Ž¡‘~|‘)ý`|‘>ü|Ž¡‘>\\|/‘~\|/‘4|¸\|/ŽŽŽŒ‹<Ó Û_2 ý ~?Ÿ„€ÕÁGŽÄ13.‘ñ8F‘ÿ ºunzioni–Õdi“com®>une“utilizzo’)Ê@¹60ŽŽ ÕÁ ýV¯¤ ®‘þ°ºTask(1)‘ XTask(2)‘?¬..‘¿Task(N)Ž¡¡¡‘D;¼Schema–?¬di“interazione“Tasks-IRQŽ¡Ÿ ÖÄ12.2.1Ž‘(áCosa‘Õaccade?ŽŸMª¹Un–àO.S.“tipico“utilizza“molti“segnali“IRš¸èQ‘ËpGer“in˜terrompšGere“la“normale“esecuzione“di“un“pro˜cesso“e“gestire“delŽ¡la•¸èv“oro›U relativ“o˜ad˜un˜device.‘q€Lo˜sc“hema˜e'˜il˜seguen“te:Ž©ؼ‘ 9b1.ŽŽŽ‘Arriv‘ÿqÐa–U un“IRš¸èQ“(i)“e“il“T‘ÿ*¸ask(j)“viene“in˜terrottoŽ¤®‘ 9b2.ŽŽŽ‘Viene–U eseguito“il“relativš¸èo“IR˜Q(i)_handlerŽ¡‘ 9b3.ŽŽŽ‘Il–U conš¸ètrollo“torna“al“T‘ÿ*¸ask(j)“preceden˜temen˜te“in˜terrottoŽ¦In–YÅparticolare“Linš¸èux,‘Œ quando“arriv‘ÿqÐa“un“IR˜Q‘Y…esegue“prima“di“tutto“la“funzione“di“incapsulazione“IR˜Q‘Y…(c˜hiamataŽ¤ ®"in•¸èterrupt0x??"),‘¿Me›ªsoltan“to˜dopGo˜l'IR“Q(i)_handler˜ucile.‘pSQuesto˜p•Germette˜di˜eseguire˜alcune˜op“erazioniŽ¡comš¸èuni–U a“tutti“gli“IR˜Q“come“la“gestione“del“TimeSlice.ŽŸ(ÀœÀ13Ž‘¬%F‘þ®(unzioni–G\di“comcune“utilizzoŽŸèÂ13.1Ž‘%}¨list_en• try‘¸[include/lin“ux/list.h]ŽŸMª¹DenizioneŽ¦º#define–?¬list_entry(ptr,“type,“member)“\Ž¡((type–?¬*)((char“*)(ptr)-(unsigned“long)(&((type“*)0)->member)))Ž¦¹Signicato:Ž©ؼLa–}¯o“"list_enš¸ètry"“viene“usata“pGer“rica˜v‘ÿqÐare“il“pun˜tatore“ad“una“struttura“utilizzando“soltan˜to“un“elemen˜toŽ¡in¸èterno–U alla“struttura.Ž¦EsempioŽŸؼºstruct–?¬__wait_queue“{Ž¡‘¿unsigned–?¬int“flags;Ž¡‘¿struct–?¬task_struct“*“task;Ž¡‘¿struct–?¬list_head“task_list;Ž¡};Ž¡struct–?¬list_head“{Ž¡‘¿struct–?¬list_head“*next,“*prev;Ž¡};Ž¡¡//–?¬e“con“la“definizione“del“tipo:Ž¡typedef–?¬struct“__wait_queue“wait_queue_t;Ž¡¡//‘?¬avremo:ŽŽŽŒ‹=ت Û_2 ý ~?Ÿ„€ÕÁGŽÄ13.‘ñ8F‘ÿ ºunzioni–Õdi“com®>une“utilizzo’)Ê@¹61ŽŽ ÕÁ ýV¯ºwait_queue_t–?¬*out“list_entry(tmp,“wait_queue_t,“task_list);Ž¤ ®¡//–?¬dove“tmp“punta“a“list_headŽ¤ؼ¹Quindi,–U in“questo“caso,“usando“il“punš¸ètatore“*tmp“[list_head]“tro˜viamo“il“pun˜tatore“*out“[w˜ait_queue_t].Ž¡–?¬º____________“<----“*out“[abbiamo“calcolato“questo]Ž¤ ®|flags‘$½´|‘D;¼/|\Ž¡|task‘?¬*-->‘¿|‘I{h|Ž¡|task_list‘¿|<----‘þ°list_entryŽ¡|‘ Xprev–?¬*“-->|‘þ°|‘/= |Ž¡|‘ Xnext–?¬*“-->|‘þ°|‘/= |Ž¡|____________|‘þ°-----–?¬*tmp“[partendo“da“questo]Ž¡Ÿ#ÃÂ13.2Ž‘%}¨SleepŽ¤MªÄ13.2.1Ž‘(áCoQÂdice–Õdi“SleepŽ¡¹Files:Ž©ؼ‘¸ŽŽŽ‘¹k•¸èernel/sc“hed.cŽ¤®‘¸ŽŽŽ‘¹include/lin•¸èux/sc“hed.hŽ¡‘¸ŽŽŽ‘¹include/lin•¸èux/w“ait.hŽ¡‘¸ŽŽŽ‘¹include/lin¸èux/list.hŽ¦F‘ÿ*¸unzioni:Ž¦‘¸ŽŽŽ‘¹in¸èterruptible_sleep_onŽ¡‘¸ŽŽŽ‘¹in¸èterruptible_sleep_on_timeoutŽ¡‘¸ŽŽŽ‘¹sleep_onŽ¡‘¸ŽŽŽ‘¹sleep_on_timeoutŽ¦F‘ÿ*¸unzioni‘U c¸èhiamate:Ž¦‘¸ŽŽŽ‘¹init_w•¸èaitqueue_en“tryŽ¡‘¸ŽŽŽ‘¹__add_w¸èait_queueŽ¡‘¸ŽŽŽ‘¹list_addŽ¡‘¸ŽŽŽ‘¹__list_addŽ¡‘¸ŽŽŽ‘¹__remo•¸èv“e_w“ait_queueŽ¦In¸èterCallings‘U Analysis:ŽŽŽŒ‹>ߟ Û_2 ý ~?Ÿ„€ÕÁGŽÄ13.‘ñ8F‘ÿ ºunzioni–Õdi“com®>une“utilizzo’)Ê@¹62ŽŽ ÕÁ ýV¯º|sleep_onŽ¤ ®‘¿|init_waitqueue_entry‘ X--Ž¡–¿|__add_wait_queue‘)ý`|“Accodamento–?¬della“richiesta“sulla“lista“della“risorsaŽ¡‘~|list_add‘I{h|Ž¡‘/= |__list_add‘)ý`--Ž¡‘¿|schedule‘I{h---‘>\Attesa–?¬che“la“richiesta“venga“eseguitaŽ¡‘~|__remove_wait_queue‘?¬--Ž¡‘~|list_del‘I{h|‘¿Disaccodamento–?¬richiesta“dalla“lista“della“risorsaŽ¡‘/= |__list_del‘)ý`--Ž¡Ÿ«³¹Descrizione:Ž©ؼOgni–ùrisorsa“(in“teoria“ogni“oggetto“condiviso“tra“piu'“uten¸èti“e“piu'“prošGcessi),‘gha“una“cosa“p˜er“gestire“TUTTIŽ¡i–U T‘ÿ*¸asks“cš¸èhe“la“ric˜hiedono.Ž¦Questo–‡metošGdo“di“acco˜damenš¸èto“viene“c˜hiamato“"w˜ait“queue"“e“consiste“di“molti“elemen˜ti“c˜hiamati"w˜aitŽ¡queue‘U elemen¸èt":Ž©«³º***‘¿struttura–?¬wait“queue“[include/linux/wait.h]‘ X***Ž¡¡¡struct–?¬__wait_queue“{Ž¡‘¿unsigned–?¬int“flags;Ž¡‘¿struct–?¬task_struct“*“task;Ž¡‘¿struct–?¬list_head“task_list;Ž¡}Ž¡struct–?¬list_head“{Ž¡‘¿struct–?¬list_head“*next,“*prev;Ž¡};Ž¦¹Rappresen¸ètazione‘U graca:Ž¦‘)ý`º***› Xelemento–?¬wait“queue˜***Ž¡¡’˜6|/|\Ž¡’v(|Ž¡‘$½´<--[prev–?¬*,“flags,“task“*,“next“*]-->Ž¡¡¡¡¡‘Y:l***‘ XLista–?¬wait“queue“***Ž¡¡‘4|¸/|\–9¼d/|\“/|\‘SúÀ/|\Ž¡‘9¼d|–D;¼|“|‘^z|Ž¡-->–?¬<--[task1]-->“<--[task2]-->“<--[task3]-->“....“<--[taskN]-->“<--Ž¡|’ZjX|Ž¡|__________________________________________________________________|Ž¡¡¡ŽŽŒ‹?ä· Û_2 ý ~?Ÿ„€ÕÁGŽÄ13.‘ñ8F‘ÿ ºunzioni–Õdi“com®>une“utilizzo’)Ê@¹63ŽŽ ÕÁ ýV¯‘I{hº***‘¿Testa–?¬wait“queue“***Ž¤ ®¡‘$½´task1–?¬<--[prev“*,“lock,“next“*]-->“taskNŽ¡¡©ؼ¹La–U T‘ÿ*¸esta“"wš¸èait“queue"“pun˜ta“al“primo“(con“next“*)“e“last“(com“prev“*)“all'ultimo“della“lista“"w˜ait“queue".ŽŸؼQuando–Éþdevš¸èe“v˜enire“inserito“un“n˜uo˜v˜o“elemen˜to“viene“c˜hiamata“la“"__add_w˜ait_queue"“[in-Ž¡clude/lin•¸èux/w“ait.h],–U dopGo“di“cš¸èhe“v˜erra'“eseguita“la“generica“routine“"list_add"“[include/lin˜ux/w˜ait.h]:Ž¦º***‘¿funzione–?¬list_add“[include/linux/list.h]‘ X***Ž¡¡//–?¬classico“inserimento“doppio“linkatoŽ¡static–?¬__inline__“void“__list_add“(struct“list_head“*“new,‘ X\Ž¡’·´„struct–?¬list_head“*“prev,“\Ž¡’·´„struct–?¬list_head“*“next)“{Ž¡‘¿next->prev–?¬=“new;Ž¡‘¿new->next–?¬=“next;Ž¡‘¿new->prev–?¬=“prev;Ž¡‘¿prev->next–?¬=“new;Ž¡}Ž¦¹Pš¸èer–›Æcompletare“la“descrizione“v˜ediamo“anc˜he“la“"__list_del"“[include/lin˜ux/list.h]“c˜hiamata“da“"list_del"Ž¡[include/lin•¸èux/list.h]›U all'in“terno˜di˜"remo“v“e_w“ait_queue"˜[include/lin“ux/w“ait.h]:Ž¦º***‘¿funzione–?¬list_del“[include/linux/list.h]‘ X***Ž¡¡¡//–?¬classica“cancellazione“doppio“linkatoŽ¡static–?¬__inline__“void“__list_del“(struct“list_head“*“prev,“struct“list_head“*“next)“{Ž¡‘¿next->prev–?¬=“prev;Ž¡‘¿prev->next–?¬=“next;Ž¡}ŽŸ ÖÄ13.2.2Ž‘(áConsiderazioni–Õsullo“Stac®>kŽŸMª¹Una–œlista“tipica“(o“cošGda)“viene“normalmen¸ète“gestita“allo˜candola“nello“Heap“(si“v¸èeda“il“Cap.10“p˜er“denizioniŽ¡e–U gestione“delle“v‘ÿqÐariabili“nello“Heap“e“nello“Stac¸èk).ŽŸؼQui›¤in•¸èv“ece,‘4DalloGc“hiamo˜W‘ÿ*¸ait˜Queue‘Üìin˜una˜v‘ÿqÐariabile˜loGcale˜(quindi˜nello˜Stac“k),‘4DdopGo˜di˜c“he˜la˜funzioneŽ¡viene–U inš¸èterrotta“dalla“sc˜hedulazione“e,“al“risv˜eglio,“la“v‘ÿqÐariabile“loGcale“v˜erra'“cancellataŽ¦‘ Xºnew–?¬task“<----|›4|¸task1“<------|˜task2“<------|Ž¡‘SúÀ|–x¸t|“|Ž¡‘SúÀ|–x¸t|“|Ž¡|..........|–þ°|›$½´|..........|“|˜|..........|“|Ž¡|wait.flags|–þ°|›$½´|wait.flags|“|˜|wait.flags|“|Ž¡|wait.task_|____|–$½´|wait.task_|____|“|wait.task_|____|Ž¡|wait.prev–?¬|-->›/= |wait.prev“|-->˜|wait.prev“|-->Ž¡|wait.next–?¬|-->›/= |wait.next“|-->˜|wait.next“|-->ŽŽŽŒ‹@ꤠÛ_2 ý ~?Ÿ„€ÕÁGŽÄ14.‘ñ8V‘ÿ ºariabili‘ÕStatic®>he’\ìc¹64ŽŽ ÕÁ ýV¯º|..–)ý`|›>ü|..“|˜|..“|Ž¤ ®|schedule()|–>ü|schedule()|“|schedule()|Ž¡|..........|–>ü|..........|“|..........|Ž¡|__________|–>ü|__________|“|__________|Ž¡¡‘¿Stack–c¹ÄStack“StackŽŸ(ÀœÀ14Ž‘¬%V‘þ®(ariabili‘G\StaticcheŽŸèÂ14.1Ž‘%}¨In tro_úduzioneŽŸMª¹Lin¸èux–U e'“scritto“in“linguaggio“C,“e“come“ogni“applicazione“usa:Ž©ؼ‘ 9b1.ŽŽŽ‘V‘ÿ*¸ariabili‘U LoGcaliŽ¤®‘ 9b2.ŽŽŽ‘V‘ÿ*¸ariabili–U di“MoGdulo“(all'inš¸èterno“del“le“sorgen˜te“e“relativ˜e“soltan˜to“al“moGdulo)Ž¡‘ 9b3.ŽŽŽ‘V‘ÿ*¸ariabili–ŶGlobali/Staticš¸èhe“presen˜ti“soltan˜to“in“una“copia“nell'in˜tero“Kernel“(la“stessa“pšGer“tutti“i“mo˜duli)Ž¦Quando–Y3una“v‘ÿqÐariabile“Statica“viene“mošGdicata“da“un“mo˜dulo,‘Z7tutti“gli“altri“mo˜duli“p˜otranno“a•¸èv“ere–Y3a“disp˜o-Ž¤ ®sizione–U il“n•¸èuo“v“o‘U v‘ÿqÐalore.ŽŸؼLe–¢v‘ÿqÐariabili“Staticš¸èhe“sotto“Lin˜ux“sono“molto“imp•Gortan˜ti,‘µ>p“erc˜he'–¢rappresen˜tano“l'unico“metošGdo“p˜er“aggiun-Ž¡gere›Λn•¸èuo“v“e˜funzionalita'˜al˜Kernel:‘dvtipicamen“te˜pun“tano˜alla˜testa˜di˜liste˜do“v“e˜sono˜memorizzati˜elemen“tiŽ¡registrati,–U c¸èhe“pGossono“essere:Ž¦‘¸ŽŽŽ‘¹aggiun¸ètiŽ¤®‘¸ŽŽŽ‘¹cancellatiŽ¡‘¸ŽŽŽ‘¹anc¸èhe‘U moGdicatiŽ¦’·$º_______–~_______“_______Ž¤ ®Variabile–?¬Globale“------>“|Item(1)|“->“|Item(2)|“->“|Item(3)|‘ X..Ž¡’ˆwx|_______|–þ°|_______|“|_______|ŽŸ#ÃÂ14.2Ž‘%}¨V‘þàariabili‘¸principaliŽ¤MªÄ14.2.1Ž‘(áCurren®>tŽ¡’·$º__________________Ž¤ ®Current–?¬---------------->“|“Processo“attuale“|Ž¡’ˆwx|__________________|Ž¦¹Curren•¸èt›U pun“ta˜alla˜struttura˜task_struct,˜c“he˜con“tiene˜tutte˜le˜informazioni˜relativ“e˜ad˜un˜ProGcesso:Ž¦‘¸ŽŽŽ‘¹pid,–U nome,“stato,“conš¸ètatori,“pGolitica“di“sc˜hedulingŽŸ®‘¸ŽŽŽ‘¹pun¸ètatori–U ad“altre“strutture“dati“come:‘q€les,“vfs,“altri“proGcesses,“signals...Ž¦Currenš¸èt–U non“e'“una“v˜era“v‘ÿqÐariabile,“piuttosto“una“macro:ŽŽŽŒ‹Aóš Û_2 ý ~?Ÿ„€ÕÁGŽÄ14.‘ñ8V‘ÿ ºariabili‘ÕStatic®>he’\ìc¹65ŽŽ ÕÁ ýV¯ºstatic–?¬inline“struct“task_struct“*“get_current(void)“{Ž¤ ®‘¿struct–?¬task_struct“*current;Ž¡‘¿__asm__("andl–?¬%%esp,%0;“":"=r"“(current)“:“"0"“(~8191UL));Ž¡‘¿return‘?¬current;Ž¡}Ž¡#define–?¬current“get_current()Ž©ؼ¹Le––`linee“sopra“prendono“il“v‘ÿqÐalore“di“ESP‘k—(stacš¸èk“pGoin˜ter)“e“lo“rendono“dispGonibile“come“una“v‘ÿqÐariabile,‘¦°c˜heŽ¡pšGoi–U v¸èerra'“usata“p˜er“pun¸ètare“ad“una“struttura“task_struct.ŽŸؼDall'elemen•¸èto›ötcurren“t‘˼pGossiamo˜accedere˜quindi˜direttamen“te˜ad˜ogni˜struttura˜dati˜Kernel˜del˜proGcessoŽ¡(ready‘ÿ*¸,›Ê´stoppGed–³0o“in“qualunque“altro“stato),˜ad“esempio“pGossiamo“cam¸èbiargli“lo“stato“(come“fa“ad“esempioŽ¡un–U drivš¸èer“di“I/O),“il“PID,“la“presenza“o“meno“nella“Ready“List“o“nella“BloGc˜k˜ed“List,“ecc.ŽŸ ÖÄ14.2.2Ž‘(áFileSystem‘ÕRegistratiŽŸMª‘x¸tº______–~_______“______Ž¡file_systems‘ X------>–?¬|“ext2“|“->“|“msdos“|“->“|“ntfs“|Ž¡‘?¬[fs/super.c]‘/= |______|–þ°|_______|“|______|Ž¦¹Quando–›ôdigitiamo“il“comando“mo•Gdprob“e–›ôsome_fs‘qtatiŽŸMª‘}ø º______–~_______“______Ž¡mount_hash_table– X---->|‘¿/“|–?¬->“|“/usr‘ X|“->“|“/var“|Ž¡[fs/namespace.c]‘$½´|______|–þ°|_______|“|______|Ž¦¹Il–~wcomando“mounš¸èt‘S¿pGermette“di“aggiungere“un“le“system“alla“lista“dei“fs“gia'“mon˜tati“nel“sistema,‘ˆÍmen˜treŽ¡la–U umounš¸èt“cancella“la“relativ‘ÿqÐa“v˜oGce.ŽŸ ÖÄ14.2.4Ž‘(áNet•®>w“ork›ÕP“ac“k“et˜T“ypQÂe˜RegistratiŽŸMª‘}ø º______–~_______“______Ž¡‘>\ptype_all– X------>|“ip“|–?¬->“|– Xx25“|–?¬->“|“ipv6“|Ž¡[net/core/dev.c]‘$½´|______|–þ°|_______|“|______|Ž¦¹Aš¸èd–KÑesempio,‘M­se“si“vuole“aggiungere“l'IPv6“(caricando“il“moGdulo“relativ˜o)“sara'“necessario“inserire“la“v˜oGce“delŽ¡Net•¸èw“ork›U P“ac“k“et˜T“ypGe˜nella˜lista.ŽŸ ÖÄ14.2.5Ž‘(áNet•®>w“ork›ÕIn“ternet˜ProtoQÂcol˜RegistratiŽŸMª’ˆwxº______–~_______“_______Ž¡inet_protocol_base–?¬----->|“icmp“|“->“|– Xtcp“|–?¬->“|– Xudp“|Ž¡[net/ipv4/protocol.c]–þ°|______|“|_______|“|_______|Ž¦¹Ogni›[|Net•¸èw“ork˜P“ac“k“et˜T“ypGe˜puo'˜a“v“ere˜all'in“terno˜una˜serie˜di˜protoGcolli˜c“he˜si˜pGossono˜aggiungere˜alla˜listaŽ¡(come–U IPv6“c¸èhe“ha“i“protoGcolli“TCPv6).ŽŽŽŒ‹BûÏ Û_2 ý ~?Ÿ„€ÕÁGŽÄ15.‘ñ8Glossario’…Ît¹66ŽŽ ÕÁ ýV¯’ˆwxº______–~_______“_______Ž¤ ®inet6_protos–?¬----------->|icmpv6|“->“|“tcpv6“|“->“|“udpv6“|Ž¡[net/ipv6/protocol.c]–þ°|______|“|_______|“|_______|Ž© ÖÄ14.2.6Ž‘(áNet•®>w“ork–ÕDevice“registratiŽŸMª’ˆwxº______–~_______“_______Ž¡dev_base›?¬--------------->|– Xlo“|˜->˜|“eth0˜|˜->˜|“ppp0˜|Ž¡[drivers/core/Space.c]‘¿|______|–þ°|_______|“|_______|Ž¦Ä14.2.7Ž‘(áChar–ÕDevice“RegistratiŽŸMª’ˆwxº______–~_______“________Ž¡chrdevs›?¬---------------->|– Xlp“|˜->˜|˜keyb“|˜->˜|˜serial˜|Ž¡[fs/devices.c]‘9¼d|______|–þ°|_______|“|________|ŽŸؼ¹cš¸èhrdevs‘*hnon–U e'“in“realta'“un“v˜ero“pun˜tatore“ad“una“lista,“piuttosto“un“v˜ettore“standard.Ž¦Ä14.2.8Ž‘(áBloQÂc®>k–ÕDevice“RegistratiŽŸMª’ˆwxº______–~______“________Ž¡bdev_hashtable›?¬--------->|– Xfd“|˜->˜|“hd“|˜->˜|“scsi“|Ž¡[fs/block_dev.c]‘/= |______|–þ°|______|“|________|ŽŸؼ¹bGdev_hashš¸ètable‘*he'–U un“v˜ettore“di“hashŽŸ(ÀœÀ15Ž‘¬%GlossarioŽŸ#–D16Ž‘¬%LinksŽŸ¿:ÃSor‘ÿ}/genti–“°Uciali“del“Kernel“e“Patches‘U ºhttp://www.kernel.orgŽ©ؼÃOttima–j{do‘ÿ}/cumentazione“sul“Kernel‘(Vºhttp://jungla.dit.upm.es/~jmseyas/linux/kernel/hackers-‘€docs.Ž¡htmlŽ¦ÃMailing–öList“Uciale“del‘‚Ðlo“svilupp‘ÿ}/o“del“Linux“Kernel‘Àºhttp://www.uwsg.indiana.edu/hypermail/linux/Ž¡kernel/index.htmlŽ¦ÃGuide–“°Linux“Do›ÿ}/cumentation“Pr˜oje˜ct“p˜er“il“Linux“Kernel‘U ºhttp://www.tldp.org/guides.htmlŽŽŽŒø°ƒ’À;èÛ_2ÕÁGBó]fŒ ecbx1000ó½HЃ ecti1000ó¥!¢N ecbx1200ó&Lt$ffffecbx1440óø8‹ ecsi1000óŒ6 ecss1000óþÖëI½q½qecss2074óqLË ectt1000ó 1ê± ecrm1000ó !",š cmsy10ó  b> cmmi10ù ªßßßßßßß