). Pol'zovatel'skij kontekst sostoit iz komand i dannyh processa, steka zadachi i soderzhimogo sovmestno ispol'zuemogo prostranstva pamyati v virtual'nyh adresah processa. Te chasti virtual'nogo adresnogo pros- transtva processa, kotorye periodicheski otsutstvuyut v operativnoj pamyati vsledstvie vygruzki ili zameshcheniya stranic, takzhe vklyuchayutsya v pol'zovatel'- skij kontekst. Registrovyj kontekst sostoit iz sleduyushchih komponent: * Schetchika komand, ukazyvayushchego adres sleduyushchej komandy, kotoruyu budet vy- polnyat' central'nyj processor; etot adres yavlyaetsya virtual'nym adresom vnutri prostranstva yadra ili prostranstva zadachi. * Registra sostoyaniya processora (PS), kotoryj ukazyvaet apparatnyj status mashiny po otnosheniyu k processu. Registr PS, naprimer, obychno soderzhit podpolya, kotorye ukazyvayut, yavlyaetsya li rezul'tat poslednih vychislenij nulevym, polozhitel'nym ili otricatel'nym, perepolnen li registr s usta- novkoj bita perenosa i t.d. Operacii, vliyayushchie na ustanovku registra PS, vypolnyayutsya dlya otdel'nogo processa, potomu-to v registre PS i soderzhit- sya apparatnyj status mashiny po otnosheniyu k processu. V drugih imeyushchih vazhnoe znachenie podpolyah registra PS ukazyvaetsya tekushchij uroven' prery- vaniya processora, a takzhe tekushchij i predydushchij rezhimy vypolneniya proces- sa (rezhim yadra/zadachi). Po znacheniyu podpolya tekushchego rezhima vypolneniya processa ustanavlivaetsya, mozhet li process vypolnyat' privilegirovannye komandy i obrashchat'sya k adresnomu prostranstvu yadra. * Ukazatelya vershiny steka, v kotorom soderzhitsya adres sleduyushchego elementa steka yadra ili steka zadachi, v sootvetstvii s rezhimom vypolneniya proces- sa. V zavisimosti ot arhitektury mashiny ukazatel' vershiny steka pokazy- vaet na sleduyushchij svobodnyj element steka ili na poslednij ispol'zuemyj element. Ot arhitektury mashiny takzhe zavisit napravlenie uvelicheniya ste- ka (k starshim ili mladshim adresam), no dlya nas sejchas eti voprosy nesu- shchestvenny. * Registrov obshchego naznacheniya, v kotoryh soderzhitsya informaciya, sgeneriro- vannaya processom vo vremya ego vypolneniya. CHtoby oblegchit' posleduyushchie ob®yasneniya, vydelim sredi nih dva registra - registr 0 i registr 1 - dlya dopolnitel'nogo ispol'zovaniya pri peredache informacii mezhdu processami i yadrom. Sistemnyj kontekst processa imeet "staticheskuyu chast'" (pervye tri elementa v nizhesleduyushchem spiske) i "dinamicheskuyu chast'" (poslednie dva elementa). Na protyazhenii vsego vremeni vypolneniya process postoyanno ras- polagaet odnoj staticheskoj chast'yu sistemnogo konteksta, no mozhet imet' peremennoe chislo dinamicheskih chastej. Dinamicheskuyu chast' sistemnogo kon- teksta mozhno predstavit' v vide steka, elementami kotorogo yavlyayutsya kontekstnye urovni, kotorye pomeshcha- yutsya v stek yadrom ili vytalkivayutsya iz steka pri nastuplenii razlichnyh sobytij. Sistemnyj kontekst vklyuchaet v sebya sleduyushchie komponenty: * Zapis' v tablice processov, opisyvayushchaya sostoyanie processa (razdel 6.1) i soderzhashchaya razlichnuyu upravlyayushchuyu informaciyu, k kotoroj yadro vsegda mo- zhet obratit'sya. * CHast' adresnogo prostranstva zadachi, vydelennaya processu, gde hranitsya upravlyayushchaya informaciya o processe, dostupnaya tol'ko v kontekste proces- sa. Obshchie upravlyayushchie parametry, takie kak prioritet processa, hranyatsya v tablice processov, poskol'ku obrashchenie k nim dolzhno proizvodit'sya za predelami konteksta processa. --------------------------------------- (*) Ispol'zuemye v dannom razdele terminy "pol'zovatel'skij kontekst" (user-level context), "registrovyj kontekst" (register context), "sis- temnyj kontekst" (system-level context) i "kontekstnye urovni" (context layers) vvedeny avtorom. 148 * Zapisi chastnoj tablicy oblastej processa, obshchie tablicy oblastej i tab- licy stranic, neobhodimye dlya preobrazovaniya virtual'nyh adresov v fizi- cheskie, v svyazi s chem v nih opisyvayutsya oblasti komand, dannyh, steka i drugie oblasti, prinadlezhashchie processu. Esli neskol'ko processov sovmes- tno ispol'zuyut obshchie oblasti, eti oblasti vhodyat sostavnoj chast'yu v kon- tekst kazhdogo processa, poskol'ku kazhdyj process rabotaet s etimi oblas- tyami nezavisimo ot drugih processov. V zadachi upravleniya pamyat'yu vhodit identifikaciya uchastkov virtual'nogo adresnogo prostranstva processa, ne yavlyayushchihsya rezidentnymi v pamyati. * Stek yadra, v kotorom hranyatsya zapisi procedur yadra, esli process vypol- nyaetsya v rezhime yadra. Nesmotrya na to, chto vse processy pol'zuyutsya odnimi i temi zhe programmami yadra, kazhdyj iz nih imeet svoyu sobstvennuyu kopiyu steka yadra dlya hraneniya individual'nyh obrashchenij k funkciyam yadra. Pust', naprimer, odin process vyzyvaet funkciyu creat i priostanavlivaetsya v ozhidanii naznacheniya novogo indeksa, a drugoj process vyzyvaet funkciyu read i priostanavlivaetsya v ozhidanii zaversheniya peredachi dannyh s diska v pamyat'. Oba processa obrashchayutsya k funkciyam yadra i u kazhdogo iz nih imeetsya v nalichii otdel'nyj stek, v kotorom hranitsya posledovatel'nost' vypolnennyh obrashchenij. YAdro dolzhno imet' vozmozhnost' vosstanavlivat' so- derzhimoe steka yadra i polozhenie ukazatelya vershiny steka dlya togo, chtoby vozobnovlyat' vypolnenie processa v rezhime yadra. V razlichnyh sistemah stek yadra chasto raspolagaetsya v prostranstve processa, odnako etot stek yavlyaetsya logicheski-nezavisimym i, takim obrazom, mozhet pomeshchat'sya v sa- mostoyatel'noj oblasti pamyati. Kogda process vypolnyaetsya v rezhime zadachi, sootvetstvuyushchij emu stek yadra pust. * Dinamicheskaya chast' sistemnogo konteksta processa, sostoyashchaya iz neskol'- kih urovnej i imeyushchaya vid steka, kotoryj osvobozhdaetsya ot elementov v poryadke, obratnom poryadku ih postupleniya. Na kazhdom urovne sistemnogo konteksta soderzhitsya informaciya, neobhodimaya dlya vosstanovleniya predydu- shchego urovnya i vklyuchayushchaya v sebya registrovyj kontekst predydushchego urovnya. YAdro pomeshchaet kontekstnyj uroven' v stek pri vozniknovenii preryvaniya, pri obrashchenii k sistemnoj funkcii ili pri pereklyuchenii konteksta processa. Kontekstnyj uroven' vytalkivaetsya iz steka posle zaversheniya obrabotki prery- vaniya, pri vozvrate processa v rezhim zadachi posle vypolneniya sistemnoj funk- cii, ili pri pereklyuchenii konteksta. Takim obrazom, pereklyuchenie konteksta vlechet za soboj kak pomeshchenie kontekstnogo urovnya v stek, tak i izvlechenie urovnya iz steka: yadro pomeshchaet v stek kontekstnyj uroven' starogo processa, a izvlekaet iz steka kontekstnyj uroven' novogo processa. Informaciya, neob- hodimaya dlya vosstanovleniya tekushchego kontekstnogo urovnya, hranitsya v zapisi tablicy processov. Na Risunke 6.8 izobrazheny komponenty konteksta processa. Sleva na risun- ke izobrazhena staticheskaya chast' konteksta. V nee vhodyat: pol'zovatel'skij kontekst, sostoyashchij iz programm processa (mashinnyh instrukcij), dannyh, steka i razdelyaemoj pamyati (esli ona imeet- sya), a takzhe staticheskaya chast' sistemnogo konteksta, sostoyashchaya iz zapisi tablicy processov, prostranstva processa i zapisej chastnoj tablicy oblastej (informacii, neobhodimoj dlya translyacii virtual'nyh adresov pol'zovatel'sko- go konteksta). Sprava na risunke izobrazhena dinamicheskaya chast' konteksta. Ona imeet vid steka i vklyuchaet v sebya neskol'ko elementov, hranyashchih regist- rovyj kontekst predydushchego urovnya i stek yadra dlya tekushchego urovnya. Nulevoj kontekstnyj uroven' predstavlyaet soboj pustoj uroven', otnosyashchijsya k pol'zo- vatel'skomu kontekstu; uvelichenie steka zdes' idet v adresnom prostranstve zadachi, stek yadra nedejstvitelen. Strelka, soedinyayushchaya mezhdu soboj statiches- kuyu chast' sistemnogo konteksta i verhnij uroven' dinamicheskoj chasti konteks- ta, oznachaet to, chto v tablice processov hranitsya informaciya, pozvolyayushchaya yadru vosstanavlivat' tekushchij kontekstnyj uroven' processa. 149 Staticheskaya chast' konteksta Dinamicheskaya chast' konteksta +-------------------------+ logiches- | - | |Pol'zovatel'skij kontekst| kij uka- | - | | +---------------------+ | zatel' na| - | | | Programmy processa | | tekushchij | - | | | Dannye | |+-------->+----------------+ | | Stek | || kontek- | Stek yadra dlya | | | Razdelyaemye dannye | || stnyj | urovnya 3 | | +---------------------+ || uroven' | | | || | Sohranennyj re-| | Staticheskaya chast' ||Uroven' 3| gistrovyj kon- | | sistemnogo konteksta || | tekst urovnya 2 | | +---------------------+ || +----------------+ | | Zapis' tablicy pro- | || | Stek yadra dlya | | | cessov +-++ | urovnya 2 | | |Prostranstvo processa| | | | | | CHastnaya tablica ob- | | | Sohranennyj re-| | | lastej processa | | Uroven' 2| gistrovyj kon- | | +---------------------+ | | tekst urovnya 1 | +-------------------------+ +----------------+ | Stek yadra dlya | | urovnya 1 | | | | Sohranennyj re-| Uroven' 1| gistrovyj kon- | | tekst urovnya 0 | +----------------+ Kontekstnyj| | uroven'| (Pol'zovatel'- | yadra 0| skij uroven') | +----------------+ Risunok 6.8. Komponenty konteksta processa Process vypolnyaetsya v ramkah svoego konteksta ili, esli govorit' bolee tochno, v ramkah svoego tekushchego kontekstnogo urovnya. Kolichestvo kontekstnyh urovnej ogranichivaetsya chislom podderzhivaemyh v mashine urovnej preryvaniya. Naprimer, esli v mashine podderzhivayutsya raznye urovni preryvanij dlya prog- ramm, terminalov, diskov, vseh ostal'nyh periferijnyh ustrojstv i tajmera, to est' 5 urovnej preryvaniya, to, sledovatel'no, u processa mozhet byt' ne bolee 7 kontekstnyh urovnej: po odnomu na kazhdyj uroven' preryvaniya, 1 dlya sistemnyh funkcij i 1 dlya pol'zovatel'skogo konteksta. 7 urovnej budet dos- tatochno, dazhe esli preryvaniya budut postupat' v "naihudshem" iz vozmozhnyh po- ryadkov, poskol'ku preryvanie dannogo urovnya blokiruetsya (to est' ego obra- botka otkladyvaetsya central'nym processorom) do teh por, poka yadro ne obra- botaet vse preryvaniya etogo i bolee vysokih urovnej. Nesmotrya na to, chto yadro vsegda ispolnyaet kontekst kakogo-nibud' proces- sa, logicheskaya funkciya, kotoruyu yadro realizuet v kazhdyj moment, ne vsegda imeet otnoshenie k dannomu processu. Naprimer, esli vozvrashchaya dannye, disko- voe zapominayushchee ustrojstvo posylaet preryvanie, to preryvaetsya vypolnenie tekushchego processa i yadro obrabatyvaet preryvanie na novom kontekstnom urovne etogo processa, dazhe esli dannye otnosyatsya k drugomu processu. Programmy ob- rabotki preryvanij obychno ne obrashchayutsya k staticheskim sostavlyayushchim konteksta processa i ne vidoizmenyayut ih, tak kak eti chasti ne svyazany s preryvaniyami. 6.4 SOHRANENIE KONTEKSTA PROCESSA Kak uzhe govorilos' ranee, yadro sohranyaet kontekst processa, pomeshchaya v 150 stek novyj kontekstnyj uroven'. V chastnosti, eto imeet mesto, kogda sistema poluchaet preryvanie, kogda process vyzyvaet sistemnuyu funkciyu ili kogda yadro vypolnyaet pereklyuchenie konteksta. Kazhdyj iz etih sluchaev podrobno rassmatri- vaetsya v etom razdele. 6.4.1 Preryvaniya i osobye situacii Sistema otvechaet za obrabotku vseh preryvanij, postupili li oni ot appa- ratury (naprimer, ot tajmera ili ot periferijnyh ustrojstv), ot programm (v svyazi s vypolneniem instrukcij, vyzyvayushchih vozniknovenie "programmnyh prery- vanij") ili yavilis' rezul'tatom osobyh situacij (takih kak obrashchenie k ot- sutstvuyushchej stranice). Esli central'nyj processor vedet obrabotku na bolee nizkom urovne po sravneniyu s urovnem postupivshego preryvaniya, to pered vy- polneniem sleduyushchej instrukcii ego rabota preryvaetsya, a uroven' preryvaniya processora povyshaetsya, chtoby drugie preryvaniya s tem zhe (ili bolee nizkim) urovnem ne mogli imet' mesta do teh por, poka yadro ne obrabotaet tekushchee preryvanie, blagodarya chemu obespechivaetsya sohranenie celostnosti struktur dannyh yadra. V processe obrabotki preryvaniya yadro vypolnyaet sleduyushchuyu posle- dovatel'nost' dejstvij: 1. Sohranyaet tekushchij registrovyj kontekst vypolnyayushchegosya processa i sozdaet v steke (pomeshchaet v stek) novyj kontekstnyj uroven'. 2. Ustanavlivaet "istochnik" preryvaniya, identificiruya tip preryvaniya (nap- rimer, preryvanie po tajmeru ili ot diska) i nomer ustrojstva, vyzvavshe- go preryvanie (naprimer, esli preryvanie vyzvano diskovym zapominayushchim ustrojstvom). Pri vozniknovenii preryvaniya sistema poluchaet ot mashiny chislo, kotoroe ispol'zuet v kachestve smeshcheniya v tablice vektorov prery- vaniya. Soderzhimoe vektorov preryvaniya v raznyh mashinah razlichno, no, kak pravilo, v nih hranitsya adres programmy obrabotki preryvaniya, sootvetst- vuyushchej istochniku preryvaniya, i ukazyvaetsya put' poiska parametra dlya programmy. V kachestve primera rassmotrim tablicu vektorov preryvaniya, privedennuyu na Risunke 6.9. Esli istochnikom preryvaniya yavilsya terminal, yadro poluchaet ot apparatury nomer preryvaniya, ravnyj 2, i vyzyvaet prog- +-----------------------------------------+ | Nomer preryvaniya Programma obrabotki | | preryvaniya | | | | 0 clockintr | | 1 diskintr | | 2 ttyintr | | 3 devintr | | 4 softintr | | 5 otherintr | +-----------------------------------------+ Risunok 6.9. Primer vektorov preryvaniya rammu obrabotki preryvanij ot terminala, imenuemuyu ttyintr. 3. Vyzov programmy obrabotki preryvaniya. Stek yadra dlya novogo kontekstnogo urovnya, esli rassuzhdat' logicheski, dolzhen otlichat'sya ot steka yadra pre- dydushchego kontekstnogo urovnya. V nekotoryh razrabotkah stek yadra tekushchego processa ispol'zuetsya dlya hraneniya elementov, sootvetstvuyushchih programmam obrabotki preryvanij, v drugih razrabotkah eti elementy hranyatsya v glo- bal'nom steke preryvanij, blagodarya chemu obespechivaetsya vozvrat iz prog- rammy bez pereklyucheniya konteksta. 4. Programma zavershaet svoyu rabotu i vozvrashchaet upravlenie yadru. YAdro is- polnyaet nabor mashinnyh komand po vosstanovleniyu registrovogo konteksta i 151 steka yadra predydushchego kontekstnogo urovnya v tom vide, kotoryj oni imeli v moment preryvaniya, posle chego vozobnovlyaet vypolnenie vosstanovlennogo kontekstnogo urovnya. Programma obrabotki preryvanij mozhet povliyat' na povedenie processa, poskol'ku ona mozhet vnesti izmeneniya v global'nye struktury dannyh yadra i vozobnovit' vypolnenie priostanovlennyh proces- sov. Odnako, obychno process prodolzhaet vypolnyat'sya tak, kak esli by pre- ryvanie nikogda ne proishodilo. +-----------------------------------------------------+ | algoritm inthand /* obrabotka preryvanij */ | | vhodnaya informaciya: otsutstvuet | | vyhodnaya informaciya: otsutstvuet | | { | | sohranit' (pomestit' v stek) tekushchij kontekstnyj | | uroven'; | | ustanovit' istochnik preryvaniya; | | najti vektor preryvaniya; | | vyzvat' programmu obrabotki preryvaniya; | | vosstanovit' (izvlech' iz steka) predydushchij kon- | | tekstnyj uroven'; | | } | +-----------------------------------------------------+ Risunok 6.10. Algoritm obrabotki preryvanij Na Risunke 6.10 kratko izlozheno, kakim obrazom yadro obrabatyvaet prery- vaniya. S pomoshch'yu ispol'zovaniya v otdel'nyh sluchayah posledovatel'nosti mashin- nyh operacij ili mikrokomand na nekotoryh mashinah dostigaetsya bol'shij effekt po sravneniyu s tem, kogda vse operacii vypolnyayutsya programmnym obespecheniem, odnako imeyutsya uzkie mesta, svyazannye s chislom sohranyaemyh kontekstnyh urov- nej i skorost'yu vypolneniya mashinnyh komand, realizuyushchih sohranenie konteks- ta. Po etoj prichine opredelennye operacii, vypolneniya kotoryh trebuet reali- zaciya sistemy UNIX, yavlyayutsya mashinno-zavisimymi. Na Risunke 6.11 pokazan primer, v kotorom process zaprashivaet vypolnenie sistemnoj funkcii (sm. sleduyushchij razdel) i poluchaet preryvanie ot diska pri ee vypolnenii. Zapustiv programmu obrabotki preryvaniya ot diska, sistema po- luchaet preryvanie po tajmeru i vyzyvaet uzhe programmu obrabotki preryvaniya po tajmeru. Kazhdyj raz, kogda sistema poluchaet preryvanie (ili vyzyvaet sis- temnuyu funkciyu), ona sozdaet v steke novyj kontekstnyj uroven' i sohranyaet registrovyj kontekst predydushchego urovnya. 6.4.2 Vzaimodejstvie s operacionnoj sistemoj cherez vyzovy sistemnyh funkcij Takogo roda vzaimodejstvie s yadrom bylo predmetom rassmotreniya v predy- dushchih glavah, gde shla rech' ob obychnom vyzove funkcij. Ochevidno, chto obychnaya posledovatel'nost' komand obrashcheniya k funkcii ne v sostoyanii pereklyuchit' vy- polneniya processa s rezhima zadachi na rezhim yadra. Kompilyator s yazyka Si is- pol'zuet biblioteku funkcij, imena kotoryh sovpadayut s imenami sistemnyh funkcij, inache ssylki na sistemnye funkcii v pol'zovatel'skih programmah by- li by ssylkami na neopredelennye imena. V bibliotechnyh funkciyah obychno is- polnyaetsya komanda, perevodyashchaya vypolnenie processa v rezhim yadra i pobuzhdayu- shchaya yadro k zapusku ispolnyaemogo koda sistemnoj funkcii. V dal'nejshem eta ko- manda imenuetsya "vnutrennim preryvaniem operacionnoj sistemy". Bibliotechnye procedury ispolnyayutsya v rezhime zadachi, a vzaimodejstvie s operacionnoj sis- temoj cherez vyzov sistemnoj funkcii mozhno opredelit' v neskol'kih slovah kak 152 Posledovatel'nost' preryvanij +-------------------------------+ | Kontekstnyj uroven' yadra 3 | | Ispolnit' programmu obra- | | botki preryvaniya po tajmeru | | | | Sohranit' registrovyj kon- | | tekst programmy obrabotki | | preryvaniya ot diska | Preryvanie po tajmeru --------+-------------------------------+ ^ | Kontekstnyj uroven' yadra 2 | | | Ispolnit' programmu obra- | | | botki preryvaniya ot diska | | | | | | Sohranit' registrovyj kon- | | | tekst obrashcheniya k sistemnoj | | | funkcii | Preryvanie ot diska ----------+-------------------------------+ ^ | Kontekstnyj uroven' yadra 1 | | | Ispolnit' obrashchenie k sis- | | | temnoj funkcii | | | | | | Sohranit' registrovyj kon- | | | tekst pol'zovatel'skogo | | | urovnya | Vyzov sistemnoj funkcii ------+-------------------------------+ ^ | | Ispolnenie v rezhime zadachi Risunok 6.11. Primery preryvanij osobyj sluchaj programmy obrabotki preryvaniya. Bibliotechnye funkcii peredayut yadru unikal'nyj nomer sistemnoj funkcii odnim iz mashinno-zavisimyh sposobov - libo kak parametr vnutrennego preryvaniya operacionnoj sistemy, libo cherez otdel'nyj registr, libo cherez stek - a yadro takim obrazom opredelyaet tip vy- zyvaemoj funkcii. Obrabatyvaya vnutrennee preryvanie operacionnoj sistemy, yadro po nomeru sistemnoj funkcii vedet v tablice poisk adresa sootvetstvuyushchej procedury yad- ra, to est' tochki vhoda sistemnoj funkcii, i kolichestva peredavaemyh funkcii parametrov (Risunok 6.12). YAdro vychislyaet adres (pol'zovatel'skij) pervogo parametra funkcii, pribavlyaya (ili vychitaya, v zavisimosti ot napravleniya uve- licheniya steka) smeshchenie k ukazatelyu vershiny steka zadachi (analogichno dlya vseh parametrov funkcii). Nakonec, yadro kopiruet parametry zadachi v prost- ranstvo processa i vyzyvaet sootvetstvuyushchuyu proceduru, kotoraya vypolnyaet sistemnuyu funkciyu. Posle ispolneniya procedury yadro vyyasnyaet, ne bylo li oshibki. Esli oshibka byla, yadro delaet sootvetstvuyushchie ustanovki v sohranen- nom registrovom kontekste zadachi, pri etom v registre PS obychno ustanavliva- etsya bit perenosa, a v nulevoj registr zanositsya nomer oshibki. Esli pri vy- polnenii sistemnoj funkcii ne bylo oshibok, yadro ochishchaet v registre PS bit perenosa i zanosit vozvrashchaemye funkciej znacheniya v registry 0 i 1 v sohra- nennom registrovom kontekste zadachi. Kogda yadro vozvrashchaetsya posle obrabotki vnutrennego preryvaniya operacionnoj sistemy v rezhim zadachi, ono popadaet v sleduyushchuyu bibliotechnuyu instrukciyu posle preryvaniya. Bibliotechnaya funkciya in- terpretiruet vozvrashchennye yadrom znacheniya i peredaet ih programme pol'zovate- lya. 153 +------------------------------------------------------------+ | algoritm syscall /* algoritm zapuska sistemnoj funkcii */| | vhodnaya informaciya: nomer sistemnoj funkcii | | vyhodnaya informaciya: rezul'tat sistemnoj funkcii | | { | | najti zapis' v tablice sistemnyh funkcij, sootvetstvuyu-| | shchuyu ukazannomu nomeru funkcii; | | opredelit' kolichestvo parametrov, peredavaemyh funkcii;| | skopirovat' parametry iz adresnogo prostranstva zadachi | | v prostranstvo processa; | | sohranit' tekushchij kontekst dlya avarijnogo zaversheniya | | (sm. razdel 6.44); | | zapustit' v yadre ispolnyaemyj kod sistemnoj funkcii; | | esli (vo vremya vypolneniya funkcii proizoshla oshibka) | | { | | ustanovit' nomer oshibki v nulevom registre sohra- | | nennogo registrovogo konteksta zadachi; | | vklyuchit' bit perenosa v registre PS sohranennogo | | registrovogo konteksta zadachi; | | } | | v protivnom sluchae | | zanesti vozvrashchaemye funkciej znacheniya v registry 0 | | i 1 v sohranennom registrovom kontekste zadachi; | | } | +------------------------------------------------------------+ Risunok 6.12. Algoritm obrashcheniya k sistemnym funkciyam V kachestve primera rassmotrim programmu, kotoraya sozdaet fajl s razreshe- niem chteniya i zapisi v nego dlya vseh pol'zovatelej (rezhim dostupa 0666) i kotoraya privedena v verhnej chasti Risunka 6.13. Dalee na risunke izobrazhen otredaktirovannyj fragment sgenerirovannogo koda programmy posle kompilyacii i disassemblirovaniya (sozdaniya po ob®ektnomu kodu ekvivalentnoj programmy na yazyke assemblera) v sisteme Motorola 68000. Na Risunke 6.14 izobrazhena kon- figuraciya steka dlya sistemnoj funkcii sozdaniya. Kompilyator generiruet prog- rammu pomeshcheniya v stek zadachi dvuh parametrov, odin iz kotoryh soderzhit us- tanovku prav dostupa (0666), a drugoj - peremennuyu "imya fajla" (**). Zatem iz adresa 64 process vyzyvaet bibliotechnuyu funkciyu creat (adres 7a), analo- gichnuyu sootvetstvuyushchej sistemnoj funkcii. Adres tochki vozvrata iz funkcii - 6a, etot adres pomeshchaetsya processom v stek. Bibliotechnaya funkciya creat zasy- laet v registr 0 konstantu 8 i ispolnyaet komandu preryvaniya (trap), kotoraya pereklyuchaet process iz rezhima zadachi v rezhim yadra i zastavlyaet ego obratit'- sya k sistemnoj funkcii. Zametiv, chto process vyzyvaet sistemnuyu funkciyu, yad- ro vybiraet iz registra 0 nomer funkcii (8) i opredelyaet takim obrazom, chto vyzvana funkciya creat. Prosmatrivaya vnutrennyuyu tablicu, yadro obnaruzhivaet, chto sistemnoj funkcii creat neobhodimy dva parametra; vosstanavlivaya regist- rovyj kontekst predydushchego urovnya, yadro kopiruet parametry iz pol'zovatel'- skogo prostranstva v prostranstvo processa. Procedury yadra, kotorym ponado- byatsya eti parametry, mogut najti ih v opredelennyh mestah adresnogo prost- ranstva processa. Po zavershenii ispolneniya koda funkcii creat upravlenie vozvrashchaetsya programme obrabotki obrashchenij k operacionnoj sisteme, kotoraya proveryaet, ustanovleno li pole oshibki v prostranstve processa (to est' imela li mesto vo vremya vypolneniya funkcii oshibka); esli da, programma ustanavli- vaet v registre PS bit perenosa, zanosit v registr 0 kod oshibki i vozvrashchaet upravlenie yadru. Esli oshibok ne bylo, v registry 0 i 1 yadro zanosit kod za- versheniya. Vozvrashchaya up- --------------------------------------- (**) Ocherednost', v kotoroj kompilyator vychislyaet i pomeshchaet v stek parametry funkcii, zavisit ot realizacii sistemy. 154 +----------------------------------------+ | char name[] = "file"; | | main() | | { | | int fd; | | fd = creat(name,0666); | | } | +----------------------------------------+ +---------------------------------------------------------------+ | Fragmenty assemblernoj programmy, sgenerirovannoj v | | sisteme Motorola 68000 | | | | Adres Komanda | | - | | - | | # tekst glavnoj programmy | | - | | 58: mov &Ox1b6,(%sp) # pomestit' kod 0666 v stek | | 5e: mov &Ox204,-(%sp) # pomestit' ukazatel' vershiny | | # steka i peremennuyu "imya fajla"| | # v stek | | 64: jsr Ox7a # vyzov bibliotechnoj funkcii | | # sozdaniya fajla | | - | | - | | # tekst bibliotechnoj funkcii sozdaniya fajla | | 7a: movq &Ox8,%d0 # zanesti znachenie 8 v registr 0| | 7c: trap &Ox0 # vnutrennee preryvanie operaci-| | # onnoj sistemy | | 7e: bcc &Ox6 <86> # esli bit perenosa ochishchen, | | # perejti po adresu 86 | | 80: jmp Ox13c # perejti po adresu 13c | | 86: rts # vozvrat iz podprogrammy | | - | | - | | # tekst obrabotki oshibok funkcii | | 13c: mov %d0,&Ox20e # pomestit' soderzhimoe registra | | # 0 v yachejku 20e (peremennaya | | # errno) | | 142: movq &-Ox1,%d0 # zanesti v registr 0 konstantu | | # -1 | | 144: mova %d0,%a0 | | 146: rts # vozvrat iz podprogrammy | +---------------------------------------------------------------+ Risunok 6.13. Sistemnaya funkciya creat i sgenerirovannaya prog- ramma ee vypolneniya v sisteme Motorola 68000 ravlenie iz programmy obrabotki obrashchenij k operacionnoj sisteme v rezhim za- dachi, bibliotechnaya funkciya proveryaet sostoyanie bita perenosa v registre PS (po adresu 7): esli bit ustanovlen, upravlenie peredaetsya po adresu 13c, iz nulevogo registra vybiraetsya kod oshibki i pomeshchaetsya v global'nuyu peremennuyu errno po adresu 20, v registr 0 zanositsya -1, i upravlenie vozvrashchaetsya na sleduyushchuyu posle adresa 64 (gde proizvoditsya vyzov funkcii) komandu. Kod za- versheniya funkcii imeet znachenie -1, chto ukazyvaet na oshibku v vypolnenii 155 sistemnoj funkcii. Esli zhe bit perenosa v registre PS pri perehode iz rezhima yadra v rezhim zadachi imeet nulevoe znachenie, process s adresa 7 perehodit po adresu 86 i vozvrashchaet upravlenie vyzvavshej programme (adres 64); registr 0 soderzhit vozvrashchaemoe funkciej znachenie. +---------+ | - | | - | | - | | - | | - | | - | |stek yadra dlya kon-| | - | |tekstnogo urovnya 1| +---------+ | | | 1b6 | kod rezhima dostupa |posledovatel'nost'| | | (666 v vos'mirichnoj sisteme) |komand obrashcheniya k| | 204 | adres peremennoj "imya fajla" | funkcii creat | | 6a | adres tochki vozvrata posle +------------------+ | | vyzova bibliotechnoj funkcii |sohranennyj regis-| +---------+<-----+ | trovyj kontekst | | vnutren-| | | dlya urovnya 0 | | nee pre-| | |(pol'zovatel'sko- | | ryvanie | znachenie ukazatelya | go) | | v | vershiny steka v mo- | | | 7c | ment vnutrennego pre- | schetchik komand, | +---------+ ryvaniya operacionnoj | ustanovlennyj na | napravlenie sistemy | 7e | uvelicheniya steka | | | |ukazatel' vershiny | | | steka | v | | | registr PS | | | |registr 0 (vvedeno| | znachenie 8) | | | | drugie registry | |obshchego naznacheniya | +------------------+ Risunok 6.14. Konfiguraciya steka dlya sistemnoj funkcii creat Neskol'ko bibliotechnyh funkcij mogut otobrazhat'sya na odnu tochku vhoda v spisok sistemnyh funkcij. Kazhdaya tochka vhoda opredelyaet tochnye sintaksis i semantiku obrashcheniya k sistemnoj funkcii, odnako bolee udobnyj interfejs obespechivaetsya s pomoshch'yu bibliotek. Sushchestvuet, naprimer, neskol'ko konst- rukcij sistemnoj funkcii exec, takih kak execl i execle, vypolnyayushchih odni i te zhe dejstviya s nebol'shimi otlichiyami. Bibliotechnye funkcii, sootvetstvuyushchie etim konstrukciyam, pri obrabotke parametrov realizuyut zayavlennye svojstva, no v konechnom itoge, otobrazhayutsya na odnu i tu zhe funkciyu yadra. 6.4.3 Pereklyuchenie konteksta Esli obratit'sya k diagramme sostoyanij processa (Risunok 6.1), mozhno uvi- det', chto yadro razreshaet proizvodit' pereklyuchenie konteksta v chetyreh slucha- yah: kogda process priostanavlivaet svoe vypolnenie, kogda on zavershaetsya, kogda on vozvrashchaetsya posle vyzova sistemnoj funkcii v rezhim zadachi, no ne yavlyaetsya naibolee podhodyashchim dlya zapuska, ili kogda on vozvrashchaetsya v rezhim zadachi posle zaversheniya yadrom obrabotki preryvaniya, no tak zhe ne yavlyaetsya naibolee podhodyashchim dlya zapuska. Kak uzhe bylo pokazano v glave 2, yadro pod- 156 derzhivaet celostnost' i soglasovannost' svoih vnutrennih struktur dannyh, zapreshchaya proizvol'no pereklyuchat' kontekst. Prezhde chem pereklyuchat' kontekst, yadro dolzhno udostoverit'sya v soglasovannosti svoih struktur dannyh: to est' v tom, chto sdelany vse neobhodimye korrektirovki, vse ocheredi vystroeny nad- lezhashchim obrazom, ustanovleny sootvetstvuyushchie blokirovki, pozvolyayushchie izbe- zhat' vmeshatel'stva so storony drugih processov, chto net izlishnih blokirovok i t.d. Naprimer, esli yadro vydelyaet bufer, schityvaet blok iz fajla i prios- tanavlivaet vypolnenie do zaversheniya peredachi dannyh s diska, ono ostavlyaet bufer zablokirovannym, chtoby drugie processy ne smogli obratit'sya k buferu. No esli process ispolnyaet sistemnuyu funkciyu link, yadro snimaet blokirovku s pervogo indeksa pered tem, kak snyat' ee so vtorogo indeksa, i tem samym pre- dotvrashchaet vozniknovenie tupikovyh situacij (vzaimnoj blokirovki). YAdro vypolnyaet pereklyuchenie konteksta po zavershenii sistemnoj funkcii exit, poskol'ku v etom sluchae bol'she nichego ne ostaetsya delat'. Krome togo, pereklyuchenie konteksta dopuskaetsya, kogda process priostanavlivaet svoyu ra- botu, poskol'ku do momenta vozobnovleniya mozhet projti nemalo vremeni, v te- chenie kotorogo mogli by vypolnyat'sya drugie processy. Pereklyuchenie konteksta dopuskaetsya i togda, kogda process ne imeet preimushchestv pered drugimi pro- cessami pri ispolnenii, s tem, chtoby obespechit' bolee spravedlivoe planiro- vanie processov: esli po vyhode processa iz sistemnoj funkcii ili iz prery- vaniya obnaruzhivaetsya, chto sushchestvuet eshche odin process, kotoryj imeet bolee vysokij prioritet i zhdet vypolneniya, to bylo by nespravedlivo ostavlyat' ego v ozhidanii. Procedura pereklyucheniya konteksta pohozha na procedury obrabotki preryva- nij i obrashcheniya k sistemnym funkciyam, esli ne schitat' togo, chto yadro vmesto predydushchego kontekstnogo urovnya tekushchego processa vosstanavlivaet kontekst- nyj uroven' drugogo processa. Prichiny, vyzvavshie pereklyuchenie konteksta, pri etom ne imeyut znacheniya. Na mehanizm pereklyucheniya konteksta ne vliyaet i metod vybora sleduyushchego processa dlya ispolneniya. +--------------------------------------------------------+ | 1. Prinyat' reshenie otnositel'no neobhodimosti pereklyu- | | cheniya konteksta i ego dopustimosti v dannyj moment. | | 2. Sohranit' kontekst "prezhnego" processa. | | 3. Vybrat' process, naibolee podhodyashchij dlya ispolneniya,| | ispol'zuya algoritm dispetcherizacii processov, prive-| | dennyj v glave 8. | | 4. Vosstanovit' ego kontekst. | +--------------------------------------------------------+ Risunok 6.15. Posledovatel'nost' shagov, vypolnyaemyh pri pe- reklyuchenii konteksta Tekst programmy, realizuyushchej pereklyuchenie konteksta v sisteme UNIX, iz vseh programm operacionnoj sistemy samyj trudnyj dlya ponimaniya, ibo pri ras- smotrenii obrashchenij k funkciyam sozdaetsya vpechatlenie, chto oni v odnih slucha- yah ne vozvrashchayut upravlenie, a v drugih - voznikayut neponyatno otkuda. Prichi- noj etogo yavlyaetsya to, chto yadro vo mnogih sistemnyh realizaciyah sohranyaet kontekst processa v odnom meste programmy, no prodolzhaet rabotu, vypolnyaya pereklyuchenie konteksta i algoritmy dispetcherizacii v kontekste "prezhnego" processa. Kogda pozdnee yadro vosstanavlivaet kontekst processa, ono vozob- novlyaet ego vypolnenie v sootvetstvii s ranee sohranennym kontekstom. CHtoby razlichat' mezhdu soboj te sluchai, kogda yadro vosstanavlivaet kontekst novogo processa, i kogda ono prodolzhaet ispolnyat' ranee sohranennyj kontekst, mozhno var'irovat' znacheniya, vozvrashchaemye kriticheskimi funkciyami, ili ustanavlivat' iskusstvennym obrazom tekushchee znachenie schetchika komand. Na Risunke 6.16 privedena shema pereklyucheniya konteksta. Funkciya save_context sohranyaet informaciyu o kontekste ispolnyaemogo processa i vozv- 157 rashchaet znachenie 1. Krome vsego prochego, yadro sohranyaet tekushchee znachenie schetchika komand (v funkcii save_context) i znachenie 0 v nulevom registre pri vyhode iz funkcii. YAdro prodolzhaet ispolnyat' kontekst "prezhnego" processa (A), vybiraya dlya vypolneniya sleduyushchij process (B) i vyzyvaya funkciyu resume_context +------------------------------------------------------------+ | if (save_context()) /* sohranenie konteksta vypolnyayushchegosya| | processa */ | | { | | /* vybor sleduyushchego processa dlya vypolneniya */ | | - | | - | | - | | resume_context(new_process); | | /* syuda programma ne popadaet ! */ | | } | | /* vozobnovlenie vypolnenie processa nachinaetsya otsyuda */ | +------------------------------------------------------------+ Risunok 6.16. Psevdoprogramma pereklyucheniya konteksta dlya vosstanovleniya ego konteksta. Posle vosstanovleniya konteksta sistema vy- polnyaet process B; prezhnij process (A) bol'she ne ispolnyaetsya, no on ostavil posle sebya sohranennyj kontekst. Pozzhe, kogda budet vypolnyat'sya pereklyuchenie konteksta, yadro snova izberet process A (esli tol'ko, razumeetsya, on ne byl zavershen). V rezul'tate vosstanovleniya konteksta A yadro prisvoit schetchiku komand to znachenie, kotoroe bylo sohraneno processom A ranee v funkcii save_context, i vozvratit v registre 0 znachenie 0. YAdro vozobnovlyaet vypol- nenie processa A iz funkcii save_context, pust' dazhe pri vypolnenii program- my pereklyucheniya konteksta ono ne dobralos' eshche do funkcii resume_context. V konechnom itoge, process A vozvrashchaetsya iz funkcii save_context so znacheniem 0 (v nulevom registre) i vozobnovlyaet vypolnenie posle stroki kommentariya "vozobnovlenie vypolnenie processa nachinaetsya otsyuda". 6.4.4 Sohranenie konteksta na sluchaj avarijnogo zaversheniya Sushchestvuyut situacii, kogda yadro vynuzhdeno avarijno preryvat' tekushchij po- ryadok vypolneniya i nemedlenno perehodit' k ispolneniyu ranee sohranennogo konteksta. V posleduyushchih razdelah, gde pojdet rech' o priostanovlenii vypol- neniya i o signalah, budut opisany obstoyatel'stva, pri kotoryh processu pri- hoditsya vnezapno izmenyat' svoj kontekst; v dannom zhe razdele rassmatrivaetsya mehanizm ispolneniya predydushchego konteksta. Algoritm sohraneniya konteksta na- zyvaetsya setjmp, a algoritm vosstanovleniya konteksta - longjmp (***). Meha- nizm raboty algoritma setjmp pohozh na mehanizm funkcii save_context, rass- motrennyj v predydushchem razdele, esli ne schitat' togo, chto funkciya save_context pomeshchaet novyj kontekstnyj uroven' v stek, v to vremya kak setjmp sohranyaet kontekst v prostranstve processa i posle vyhoda iz nego vy- polnenie prodolzhaetsya v prezhnem kontekstnom urovne. Kogda yadru ponadobitsya vosstanovit' kontekst, --------------------------------------- (***) |ti algoritmy ne sleduet putat' s imeyushchimi te zhe nazvaniya bibliotechny- mi funkciyami, kotorye mogut vyzyvat'sya neposredstvenno iz pol'zova- tel'skih pro