GLAVA 10. PODSISTEMA UPRAVLENIYA VVODOM-VYVODOM Podsistema upravleniya vvodom-vyvodom pozvolyaet processam podderzhivat' svyaz' s periferijnymi ustrojstvami, takimi kak nakopiteli na magnitnyh dis- kah i lentah, terminaly, printery i seti, s odnoj storony, i s modulyami yad- ra, kotorye upravlyayut ustrojstvami i imenuyutsya drajverami ustrojstv, s dru- goj. Mezhdu drajverami ustrojstv i tipami ustrojstv obychno sushchestvuet odnoz- nachnoe sootvetstvie: v sisteme mozhet byt' odin diskovyj drajver dlya upravle- niya vsemi diskovodami, odin terminal'nyj drajver dlya upravleniya vsemi termi- nalami i odin lentochnyj drajver dlya upravleniya vsemi lentochnymi nakopitelya- mi. Esli v sisteme imeyutsya odnotipnye ustrojstva, poluchennye ot raznyh izgo- tovitelej - naprimer, dve marki lentochnyh nakopitelej, - v etom sluchae mozhno traktovat' odnotipnye ustrojstva kak ustrojstva dvuh razlichnyh tipov i imet' dlya nih dva otdel'nyh drajvera, poskol'ku takim ustrojstvam dlya vypolneniya odnih i teh zhe operacij mogut potrebovat'sya raznye posledovatel'nosti ko- mand. Odin drajver upravlyaet mnozhestvom fizicheskih ustrojstv dannogo tipa. Naprimer, odin terminal'nyj drajver mozhet upravlyat' vsemi terminalami, podk- lyuchennymi k sisteme. Drajver razlichaet ustrojstva, kotorymi upravlyaet: vy- hodnye dannye, prednaznachennye dlya odnogo terminala, ne dolzhny byt' poslany na drugoj. Sistema podderzhivaet "programmnye ustrojstva", s kazhdym iz kotoryh ne svyazano ni odno konkretnoe fizicheskoe ustrojstvo. Naprimer, kak ustrojstvo traktuetsya fizicheskaya pamyat', chtoby pozvolit' processu obrashchat'sya k nej izv- ne, pust' dazhe pamyat' ne yavlyaetsya periferijnym ustrojstvom. Komanda ps obra- shchaetsya k informacionnym strukturam yadra v fizicheskoj pamyati, chtoby soobshchit' statistiku processov. Eshche odin primer: drajvery mogut vesti trassirovku za- pisej v udobnom dlya otladki vide, a drajver trassirovki daet vozmozhnost' pol'zovatelyam chitat' eti zapisi. Nakonec, profil' yadra, rassmotrennyj v gla- ve 8, vypolnen kak drajver: process zapisyvaet adresa programm yadra, obnaru- zhennyh v tablice identifikatorov yadra, i chitaet rezul'taty profilirovaniya. V etoj glave rassmatrivaetsya vzaimodejstvie mezhdu processami i podsiste- moj upravleniya vvodom-vyvodom, a takzhe mezhdu mashinoj i drajverami ustrojstv. Issleduetsya obshchaya struktura i funkcionirovanie drajverov i v kachestve prime- rov obshchego vzaimodejstviya rassmatrivayutsya diskovye i terminal'nye drajvery. Zavershaet glavu opisanie novogo metoda realizacii drajverov potokovyh ust- rojstv. 10.1 VZAIMODEJSTVIE DRAJVEROV S PROGRAMMNOJ I APPARATNOJ SREDOJ V sisteme UNIX imeetsya dva tipa ustrojstv - ustrojstva vvodavyvoda blo- kami i ustrojstva nestrukturirovannogo ili posimvol'nogo vvoda-vyvoda. Kak uzhe govorilos' v glave 2, ustrojstva vvoda-vyvoda blokami, takie kak diski i lenty, dlya ostal'noj chasti sistemy vyglyadyat kak zapominayushchie ustrojstva s proizvol'noj vyborkoj; k ustrojstvam posimvol'nogo vvoda-vyvoda otnosyatsya vse drugie ustrojstva, v tom chisle terminaly i setevoe oborudovanie. Ustroj- stva vvoda-vyvoda blokami mogut imet' interfejs i s ustrojstvami posimvol'- nogo vvoda-vyvoda. Pol'zovatel' vzaimodejstvuet s ustrojstvami cherez posrednichestvo fajlo- voj sistemy (sm. Risunok 2.1). Kazhdoe ustrojstvo imeet imya, pohozhee na imya fajla, i pol'zovatel' obrashchaetsya k nemu kak k fajlu. Special'nyj fajl ust- rojstva imeet indeks i zanimaet mesto v ierarhii katalogov fajlovoj sistemy. Fajl ustrojstva otlichaetsya ot drugih fajlov tipom fajla, hranyashchimsya v ego indekse, libo "blochnyj", libo "simvol'nyj special'nyj", v zavisimosti ot us- 290 trojstva, kotoroe etot fajl predstavlyaet. Esli ustrojstvo imeet kak blochnyj, tak i simvol'nyj interfejs, ego predstavlyayut dva fajla: special'nyj fajl us- trojstva vvoda-vyvoda blokami i special'nyj fajl ustrojstva posimvol'nogo vvoda-vyvoda. Sistemnye funkcii dlya obychnyh fajlov, takie kak open, close, read i write, imeyut to zhe znachenie i dlya ustrojstv, v chem my ubedimsya pozzhe. Sistemnaya funkciya ioctl predostavlyaet processam vozmozhnost' upravlyat' ust- rojstvami posimvol'nogo vvoda-vyvoda, no ne primenima v otnoshenii k fajlam obychnogo tipa (*). Tem ne menee, drajveram ustrojstv net neobhodimosti pod- derzhivat' polnyj nabor sistemnyh funkcij. Naprimer, vysheupomyanutyj drajver trassirovki daet processam vozmozhnost' chitat' zapisi, sozdannye drugimi drajverami, no ne pozvolyaet sozdavat' ih. 10.1.1 Konfiguraciya sistemy Zadanie konfiguracii sistemy eto procedura ukazaniya administratorami znachenij parametrov, s pomoshch'yu kotoryh proizvoditsya nastrojka sistemy. Neko- torye iz parametrov ukazyvayut razmery tablic yadra, takih kak tablica proces- sov, tablica indeksov i tablica fajlov, a takzhe skol'ko buferov pomeshchaetsya v bufernom pule. S pomoshch'yu drugih parametrov ukazyvaetsya konfiguraciya ustroj- stv, to est' proizvodyatsya konkretnye ukazaniya yadru, kakie ustrojstva vklyucha- yutsya v dannuyu sistemnuyu realizaciyu i ih "adres". Naprimer, v konfiguracii mozhet byt' ukazano, chto terminal'naya plata vstavlena v sootvetstvuyushchij raz®- em na apparatnoj paneli. Sushchestvuet tri stadii, na kotoryh mozhet byt' ukazana konfiguraciya ust- rojstv. Vo-pervyh, administratory mogut kodirovat' informaciyu o konfiguracii v fajlah, kotorye transliruyutsya i komponuyutsya vo vremya postroeniya yadra. In- formaciya o konfiguracii obychno ukazyvaetsya v prostom formate, i programma konfiguracii preobrazuet ee v fajl, gotovyj dlya translyacii. Vo-vtoryh, admi- nistratory mogut ukazyvat' informaciyu o konfiguracii posle togo, kak sistema uzhe zapushchena; yadro dinamicheski korrektiruet vnutrennie tablicy konfiguracii. Nakonec, samoidentificiruyushchiesya ustrojstva dayut yadru vozmozhnost' uznat', ka- kie iz ustrojstv vklyucheny. YAdro schityvaet apparatnye klyuchi dlya samonastroj- ki. Podrobnosti zadaniya sistemnoj konfiguracii vyhodyat za predely etoj kni- gi, odnako vo vseh sluchayah rezul'tatom procedury zadaniya konfiguracii yavlya- etsya generaciya ili zapolnenie tablic, sostavlyayushchih osnovu programm yadra. Interfejs "yadro - drajver" opisyvaetsya v tablice klyuchej ustrojstv vvo- da-vyvoda blokami i v tablice klyuchej ustrojstv posimvol'nogo vvoda-vyvoda (Risunok 10.1). Kazhdyj tip ustrojstva imeet v tablice tochki vhoda, kotorye pri vypolnenii sistemnyh funkcij adresuyut yadro k sootvetstvuyushchemu drajveru. Funkcii open i close, vyzyvaemye fajlom ustrojstva, "propuskayutsya" cherez tablicy klyuchej ustrojstv v sootvetstvii s tipom fajla. Funkcii mount i umount tak zhe vyzyvayut vypolnenie procedur otkrytiya i zakrytiya ustrojstv, no dlya ustrojstv vvoda-vyvoda blokami. Funkcii read i write, vyzyvaemye ustroj- stvami vvoda-vyvoda blokami i fajlami v smontirovannyh fajlovyh sistemah, zapuskayut algoritmy raboty s bufernym keshem, iniciiruyushchie realizaciyu strate- gicheskoj procedury raboty s ustrojstvami. Nekotorye iz drajverov zapuskayut etu proceduru iznutri iz procedur chteniya i zapisi. Bolee podrobno vzaimodej- stvie s kazhdym drajverom rassmatrivaetsya v sleduyushchem razdele. Interfejs "apparatura - drajver" sostoit iz mashinno-zavisimyh upravlyayu- shchih registrov ili komand vvoda-vyvoda dlya upravleniya ustrojstvami i vektora- mi preryvanij: kogda proishodit preryvanie ot ustrojstva, sistema identifi- ciruet ustrojstvo, vyzvavshee preryvanie, i zapuskaet programmu obrabotki so- ---------------------------------------- (*) I naoborot, sistemnaya funkciya fcntl obespechivaet kontrol' nad dejstviya- mi, proizvodimymi na urovne deskriptora fajla, no ne na urovne ustrojst- va. V drugih realizaciyah funkciya ioctl primenima dlya fajlov vseh tipov. 291 otvetstvuyushchego preryvaniya. Ochevidno, chto "programmnye ustrojstva", takie kak drajver sistemy postroeniya profilya yadra (glava 8) ne imeyut apparatnogo in- terfejsa, odnako programmy obrabotki drugih preryvanij mogut obrashchat'sya k "obrabotchiku programmnogo preryvaniya" neposredstvenno. Naprimer, programma obrabotki preryvaniya po tajmeru obrashchaetsya k programme obrabotki preryvaniya sistemy postroeniya profilya yadra. Administratory ustanavlivayut special'nye fajly ustrojstv komandoj mknod, v kotoroj ukazyvaetsya tip fajla (blochnyj ili simvol'nyj), starshij i mladshij nomera ustrojstva. Komanda mknod zapuskaet vypolnenie sistemnoj funkcii s tem zhe imenem, sozdayushchej fajl ustrojstva. Naprimer, v komandnoj stroke mknod /dev/tty13 c 2 13 "/dev/tty13" - imya fajla ustrojstva, "c" ukazyvaet, chto tip fajla - "sim- vol'nyj special'nyj" ("b", sootvetstvenno, blochnyj), "2" - starshij nomer us- trojstva, "13" - mladshij nomer ustrojstva. Starshij nomer ustrojstva pokazy- vaet ego tip, kotoromu sootvetstvuet tochka vhoda v tablice klyuchej ustrojstv, mladshij nomer ustrojstva - eto poryadkovyj nomer edinicy ustrojstva dannogo tipa. Esli process otkryvaet special'nyj blochnyj fajl s imenem "/dev/dsk1" i kodom 0, yadro zapuskaet programmu gdopen v tochke 0 tablicy klyuchej ustrojstv blochnogo vvoda-vyvoda (Risunok 10.2); esli process chitaet special'nyj sim- vol'nyj fajl s imenem "/dev/mem" i kodom 3, Podsistema upravleniya fajlami +------------------------------------------------------------+ | open close | | open close read write ioctl read write | | mount umount | +--+-----+----+-----+-----+------------+-----+-----+-----+---+ | | | | | | | +-+-----+---+ | | | | | | | | funkcii | | | | | | | | | raboty s | | | | | | | | | bufernym | | | | | | | | | keshem | | | | | | | | +-----+-----+ +--+-----+----+-----+-----+-+ ++-----+---------+-----+ | Tablica klyuchej ustrojstv | | Tablica klyuchej ust- | | posimvol'nogo vvoda-vyvoda| | rojstv vvoda-vyvoda | | | | blokami | +--+-----+----+-----+-----+-+ +--+------+--------+---+ +--+-----+----+-----+-----+-+ +--+------+--------+---+ |open close read write ioctl| Tochki | open close strategy| | | vhoda | | | Drajver | dlya | Drajver | | | draj- | | |programma obrabotki prery- | verov | programma obrabotki | | vanij ot ustrojstva | |preryvanij ot ustrojst| +------------+--------------+ +-----------+----------+ +--------+----------+ +---------+---------+ | Vektor preryvaniya | | Vektor preryvaniya | +--------+----------+ +---------+---------+ +-------------------+----------------+ | Preryvaniya ot ustrojstv Risunok 10.1. Tochki vhoda dlya drajverov 292 yadro zapuskaet programmu mmread v tochke 3 tablicy klyuchej ustrojstv posim- vol'nogo vvoda-vyvoda. Programma nulldev - eto "pustaya" programma, ispol'zu- emaya v teh sluchayah, kogda otsutstvuet neobhodimost' v konkretnoj funkcii drajvera. S odnim starshim nomerom ustrojstva mozhet byt' svyazano mnozhestvo periferijnyh ustrojstv; mladshij nomer ustrojstva pozvolyaet otlichit' ih odno ot drugogo. Ne nuzhno sozdavat' special'nye fajly ustrojstv pri kazhdoj zag- ruzke sistemy; ih tol'ko nuzhno korrektirovat', esli izmenilas' konfiguraciya sistemy, naprimer, esli k ustanovlennoj konfiguracii byli dobavleny ustrojs- tva. 10.1.2 Sistemnye funkcii i vzaimodejstvie s drajverami V etom razdele rassmatrivaetsya vzaimodejstvie yadra s drajverami ustroj- stv. Pri vypolnenii teh sistemnyh funkcij, kotorye ispol'zuyut deskriptory fajlov, yadro, sleduya za ukazatelyami, hranyashchimisya v pol'zovatel'skom deskrip- tore fajla, obrashchaetsya k tablice +-----------------------------------------------+ | tablica klyuchej ustrojstv vvoda-vyvoda blokami | +-------+--------+---------+--------------------+ | vhod | open | close | strategy | +-------+--------+---------+--------------------+ | 0 | gdopen | gdclose | gdstrategy | +-------+--------+---------+--------------------+ | 1 | gtopen | gtclose | gtstrategy | +-------+--------+---------+--------------------+ +----------------------------------------------------------------+ | tablica klyuchej ustrojstv posimvol'nogo vvoda-vyvoda | +------+-----------+-----------+---------+-----------+-----------+ | vhod | open | close | read | write | ioctl | +------+-----------+-----------+---------+-----------+-----------+ | 0 | conopen | conclose | conread | conwrite | conioctl | +------+-----------+-----------+---------+-----------+-----------+ | 1 | dzbopen | dzbclose | dzbread | dzbwrite | dzbioctl | +------+-----------+-----------+---------+-----------+-----------+ | 2 | syopen | nulldev | syread | sywrite | syioctl | +------+-----------+-----------+---------+-----------+-----------+ | 3 | nulldev | nulldev | mmread | mmwrite | nodev | +------+-----------+-----------+---------+-----------+-----------+ | 4 | gdopen | gdclose | gdread | gdwrite | nodev | +------+-----------+-----------+---------+-----------+-----------+ | 5 | gtopen | gtclose | gtread | gtwrite | nodev | +------+-----------+-----------+---------+-----------+-----------+ Risunok 10.2. Primer zapolneniya tablic klyuchej ustrojstv vvoda- vyvoda blokami i simvolami fajlov yadra i k indeksu, gde ono proveryaet tip fajla, i perehodit k tablice klyuchej ustrojstv vvoda-vyvoda blokami ili simvolami. YAdro izvlekaet iz in- deksa starshij i mladshij nomera ustrojstva, ispol'zuet starshij nomer v kaches- tve ukazatelya na tochku vhoda v sootvetstvuyushchej tablice i vyzyvaet vypolnenie funkcii drajvera v sootvetstvii s vypolnyaemoj sistemnoj funkciej, peredavaya mladshij nomer v kachestve parametra. Vazhnym razlichiem v realizacii sistemnyh funkcij dlya fajlov ustrojstv i dlya fajlov obychnogo tipa yavlyaetsya to, chto in- deks special'nogo fajla ne blokiruetsya v to vremya, kogda yadro vypolnyaet programmu drajvera. Drajvery chasto priostanavlivayut svoyu rabotu, ozhidaya svya- zi s apparatnymi sredstvami ili postupleniya dannyh, poetomu yadro ne v sosto- 293 yanii opredelit', na kakoe vremya process budet priostanovlen. Esli indeks zablokirovan, drugie processy, obrativshiesya k indeksu (naprimer, posredstvom sistemnoj funkcii stat), priostanovyatsya na neopredelennoe vremya, poskol'ku odin process priostanovil drajver. Drajver ustrojstva interpretiruet parametry vyzova sistemnoj funkcii v otnoshenii ustrojstva. Drajver podderzhivaet struktury dannyh, opisyvayushchie sostoyanie kazhdoj kontroliruemoj edinicy dannogo tipa ustrojstva; funkcii drajvera i programmy obrabotki preryvanij realizuyutsya v sootvetstvii s sos- toyaniem drajvera i s tem, kakoe dejstvie vypolnyaetsya v etot moment (napri- mer, dannye vvodyatsya ili vyvodyatsya). Teper' rassmotrim kazhdyj interfejs bo- lee podrobno. +------------------------------------------------------------+ | algoritm open /* dlya drajverov ustrojstv */ | | vhodnaya informaciya: imya puti poiska | | rezhim otkrytiya | | vyhodnaya informaciya: deskriptor fajla | | { | | preobrazovat' imya puti poiska v indeks, uvelichit' znache-| | nie schetchika ssylok v indekse; | | vydelit' v tablice fajlov mesto dlya pol'zovatel'skogo | | deskriptora fajla, kak pri otkrytii obychnogo fajla; | | | | vybrat' iz indeksa starshij i mladshij nomera ustrojstva; | | | | sohranit' kontekst (algoritm setjmp) v sluchae peredachi | | upravleniya ot drajvera; | | | | esli (ustrojstvo blochnogo tipa) | | { | | ispol'zovat' starshij nomer ustrojstva v kachestve uka-| | zatelya v tablice klyuchej ustrojstv vvoda-vyvoda blo- | | kami; | | vyzvat' proceduru otkrytiya drajvera po dannomu indek-| | su: peredat' mladshij nomer ustrojstva, rezhimy otkry-| | tiya; | | } | | v protivnom sluchae | | { | | ispol'zovat' starshij nomer ustrojstva v kachestve uka-| | zatelya v tablice klyuchej ustrojstv posimvol'nogo vvo-| | da-vyvoda; | | vyzvat' proceduru otkrytiya drajvera po dannomu indek-| | su: peredat' mladshij nomer ustrojstva, rezhimy otkry-| | tiya; | | } | | | | esli (otkrytie v drajvere ne vypolnilos') | | privesti tablicu fajlov k pervonachal'nomu vidu, | | umen'shit' znachenie schetchika v indekse; | | } | +------------------------------------------------------------+ Risunok 10.3. Algoritm otkrytiya ustrojstva 10.1.2.1 Opep Pri otkrytii ustrojstva yadro sleduet toj zhe procedure, chto i pri otkry- 294 tii fajlov obychnogo tipa (sm. razdel 5.1), vydelyaya v pamyati indeksy, uveli- chivaya znachenie schetchika ssylok i prisvaivaya znachenie tochki vhoda v tablicu fajlov i pol'zovatel'skogo deskriptora fajla. Nakonec, yadro vozvrashchaet zna- chenie pol'zovatel'skogo deskriptora fajla vyzyvayushchemu processu, tak chto otk- rytie ustrojstva vyglyadit tak zhe, kak i otkrytie fajla obychnogo tipa. Odna- ko, pered tem, kak vernut'sya v rezhim zadachi, yadro zapuskaet zavisyashchuyu ot ustrojstva proceduru open (Risunok 10.3). Dlya ustrojstva vvo- da-vyvoda blokami zapuskaetsya procedura open, zakodirovannaya v tablice klyu- chej ustrojstv vvoda-vyvoda blokami, dlya ustrojstv posimvol'nogo vvoda-vyvoda - procedura open, zakodirovannaya v sootvetstvuyushchej tablice. Esli ustrojstvo imeet kak blochnyj, tak i simvol'nyj tip, yadro zapuskaet proceduru open, so- otvetstvuyushchuyu tipu fajla ustrojstva, otkrytogo pol'zovatelem: obe procedury mogut dazhe byt' identichny, v zavisimosti ot konkretnogo drajvera. Zavisyashchaya ot tipa ustrojstva procedura open ustanavlivaet svyaz' mezhdu vyzyvayushchim processom i otkryvaemym ustrojstvom i inicializiruet informacion- nye struktury drajvera. Naprimer, procedura open dlya terminala mozhet prios- tanovit' process do teh por, poka v mashinu ne postupit signal (apparatnyj) o tom, chto pol'zovatel' predprinyal popytku zaregistrirovat'sya. Posle etogo inicializiruyutsya informacionnye struktury drajvera v sootvetstvii s prinyaty- mi ustanovkami terminala (naprimer, skorost'yu peredachi informacii v bodah). Dlya "programmnyh ustrojstv", takih kak pamyat' sistemy, procedura open mozhet ne vklyuchat' v sebya inicializaciyu. Esli vo vremya otkrytiya ustrojstva processu prishlos' priostanovit'sya po kakoj-libo iz vneshnih prichin, mozhet tak sluchit'sya, chto sobytie, kotoroe dol- zhno bylo by vyzvat' vozobnovlenie vypolneniya processa, tak nikogda i ne pro- izojdet. Naprimer, esli na dannom terminale eshche ne zaregistrirovalsya ni odin iz pol'zovatelej, process getty, "otkryvshij" terminal (razdel 7.9), priosta- navlivaetsya do teh por, poka pol'zovatelem ne budet predprinyata popytka re- gistracii, pri etom mozhet projti dostatochno bol'shoj promezhutok vremeni. YAdro dolzhno imet' vozmozhnost' vozobnovit' vypolnenie processa i otmenit' vyzov funkcii open po poluchenii signala: emu sleduet sbrosit' indeks, otmenit' tochku vhoda v tablice fajlov i pol'zovatel'skij deskriptor fajla, kotorye byli vydeleny pered vhodom v drajver, poskol'ku otkrytie ne proizoshlo. YAdro sohranyaet kontekst processa, ispol'zuya algoritm setjmp (razdel 6.4.4), prezh- de chem zapustit' proceduru open; esli process vozobnovlyaetsya po signalu, yad- ro vosstanavlivaet kontekst processa v tom sostoyanii, kotoroe on imel pered obrashcheniem k drajveru, ispol'zuya algoritm longjmp (razdel 6.4.4), i vozvra- shchaet sisteme vse vydelennye procedure open struktury dannyh. Tochno tak zhe i drajver mozhet ulovit' signal i ochistit' dostupnye emu struktury dannyh, esli eto neobhodimo. YAdro takzhe pereustanavlivaet struktury dannyh fajlovoj sis- temy, kogda drajver stalkivaetsya s isklyuchitel'nymi situaciyami, takimi, kak popytka pol'zovatelya obratit'sya k ustrojstvu, otsutstvuyushchemu v dannoj konfi- guracii. V podobnyh sluchayah funkciya open ne vypolnyaetsya. Processy mogut ukazyvat' znacheniya razlichnyh parametrov, harakterizuyushchie osobennosti vypolneniya procedury otkrytiya. Iz nih naibolee chasto ispol'zuet- sya "no delay" (bez zaderzhki), oznachayushchee, chto process ne budet priostanovlen vo vremya vypolneniya procedury open, esli ustrojstvo ne gotovo. Sistemnaya funkciya open vozvrashchaet upravlenie nemedlenno i pol'zovatel'skij process ne uznaet, proizoshlo li apparatnoe soedinenie ili net. Otkrytie ustrojstva s parametrom "no delay", krome vsego prochego, zatronet semantiku vyzova funk- cii read, chto my uvidim dalee (razdel 10.3.4). Esli ustrojstvo otkryvaetsya mnogokratno, yadro obrabatyvaet pol'zovatel'- skie deskriptory fajlov, indeks i zapisi v tablice fajlov tak, kak eto opi- sano v glave 5, zapuskaya opredelyaemuyu tipom ustrojstva proceduru open pri kazhdom vyzove sistemnoj funkcii open. Takim obrazom, drajver ustrojstva mo- zhet podschitat', skol'ko raz ustrojstvo bylo "otkryto", i prervat' vypolnenie funkcii open, esli kolichestvo otkrytij prinyalo nedopustimoe znachenie. Napri- 295 mer, imeet smysl razreshit' processam mnogokratno "otkryvat'" terminal na za- pis' dlya togo, chtoby pol'zovateli mogli obmenivat'sya soobshcheniyami. No pri etom ne sleduet dopuskat' mnogokratnogo "otkrytiya" pechatayushchego ustrojstva dlya odnovremennoj zapisi, tak kak processy mogut zateret' drug drugu infor- maciyu. |ti razlichiya imeyut smysl skoree na praktike, nezheli na stadii razra- botki: razreshenie odnovremennoj zapisi na terminaly sposobstvuet ustanovle- niyu vzaimodejstviya mezhdu pol'zovatelyami; zapreshchenie odnovremennoj zapisi na printery sluzhit povysheniyu chitabel'nosti mashinogramm (**). +------------------------------------------------------------+ | algoritm close /* dlya ustrojstv */ | | vhodnaya informaciya: deskriptor fajla | | vyhodnaya informaciya: otsutstvuet | | { | | vypolnit' algoritm standartnogo zakrytiya (glava 5hhh); | | esli (znachenie schetchika ssylok v tablice fajlov ne 0) | | perejti na finish; | | esli (sushchestvuet eshche odin otkrytyj fajl, starshij i mlad-| | shij nomera kotorogo sovpadayut s nomerami zakryvaemogo | | ustrojstva) | | perejti na finish; /* ne poslednee zakrytie */ | | esli (ustrojstvo simvol'nogo tipa) | | { | | ispol'zovat' starshij nomer v kachestve ukazatelya v | | tablice klyuchej ustrojstva posimvol'nogo vvoda-vyvo- | | da; | | vyzvat' proceduru zakrytiya, opredelyaemuyu tipom draj- | | vera i peredat' ej v kachestve parametra mladshij no- | | mer ustrojstva; | | } | | esli (ustrojstvo blochnogo tipa) | | { | | esli (ustrojstvo montirovano) | | perejti na finish; | | perepisat' bloki ustrojstva iz bufernogo kesha na ust-| | rojstvo; | | ispol'zovat' starshij nomer v kachestve ukazatelya v | | tablice klyuchej ustrojstva vvoda-vyvoda blokami; | | vyzvat' proceduru zakrytiya, opredelyaemuyu tipom draj- | | vera i peredat' ej v kachestve parametra mladshij no- | | mer ustrojstva; | | sdelat' nedejstvitel'nymi bloki ustrojstva, ostavshie-| | sya v bufernom keshe; | | } | | finish: | | osvobodit' indeks; | | } | +------------------------------------------------------------+ Risunok 10.4. Algoritm zakrytiya ustrojstva ---------------------------------------- (**) Na praktike vyvod na pechat' obychno upravlyaetsya special'nymi processami buferizacii, i prava dostupa ustanavlivayutsya takim obrazom, chtoby tol'- ko sistema buferizacii mogla obrashchat'sya k printeru. 296 10.1.2.2 Close Process razryvaet svyaz' s otkrytym ustrojstvom, zakryvaya ego. Odnako, yadro zapuskaet opredelyaemuyu tipom ustrojstva proceduru close tol'ko v pos- lednem vyzove funkcii close dlya etogo ustrojstva, i to tol'ko esli ne osta- los' processov, kotorym ustrojstvo neobhodimo otkrytym, poskol'ku procedura zakrytiya ustrojstva zavershaetsya razryvom apparatnogo soedineniya; otsyuda yas- no, chto yadru sleduet podozhdat', poka ne ostanetsya ni odnogo processa, obra- shchayushchegosya k ustrojstvu. Poskol'ku yadro zapuskaet proceduru otkrytiya ustrojs- tva pri kazhdom vyzove sistemnoj funkcii open, a proceduru zakrytiya tol'ko odin raz, drajveru ustrojstva nevedomo, skol'ko processov ispol'zuyut ustroj- stvo v dannyj moment. Drajvery mogut legko vyjti iz stroya, esli pri ih napi- sanii ne soblyudalas' ostorozhnost': kogda pri vypolnenii procedury close oni priostanavlivayut svoyu rabotu i kakoj-nibud' process otkryvaet ustrojstvo do togo, kak zavershitsya procedura zakrytiya, ustrojstvo mozhet stat' nedostupnym dlya raboty, esli v rezul'tate kombinacii vyzovov open i close slozhilas' ne- raspoznavaemaya situaciya. Algoritm zakrytiya ustrojstva pohozh na algoritm zakrytiya fajla obychnogo tipa (Risunok 10.4). Odnako, do togo, kak yadro osvobozhdaet indeks, v nem vy- polnyayutsya dejstviya, specifichnye dlya fajlov ustrojstv. 1. Prosmatrivaetsya tablica fajlov dlya togo, chtoby ubedit'sya v tom, chto ni odnomu iz processov ne trebuetsya, chtoby ustrojstvo bylo otkryto. CHtoby ustanovit', chto vyzov funkcii close dlya ustrojstva yavlyaetsya poslednim, nedostatochno polozhit'sya na znachenie schetchika ssylok v tablice fajlov, poskol'ku neskol'ko processov mogut obrashchat'sya k odnomu i tomu zhe ust- rojstvu, ispol'zuya razlichnye tochki vhoda v tablice fajlov. Tak zhe nedos- tatochno polozhit'sya na znachenie schetchika v tablice indeksov, poskol'ku odnomu i tomu zhe ustrojstvu mogut sootvetstvovat' neskol'ko fajlov ust- rojstva. Naprimer, komanda ls -l pokazhet, chto odnomu i tomu zhe ustrojst- vu simvol'nogo tipa ("c" v nachale stroki) sootvetstvuyut dva fajla ust- rojstva, starshij i mladshij nomera u kotoryh (9 i 1) sovpadayut. Znachenie schetchika svyazej dlya kazhdogo fajla, ravnoe 1, govorit o tom, chto imeetsya dva indeksa. crw--w--w- 1 root vis 9, 1 Aug 6 1984 /dev/tty01 crw--w--w- 1 root unix 9, 1 May 3 15:02 /dev/tty01 Esli processy otkryvayut oba fajla nezavisimo odin ot drugogo, oni obra- tyatsya k raznym indeksam odnogo i togo zhe ustrojstva. 2. Esli ustrojstvo simvol'nogo tipa, yadro zapuskaet proceduru zakrytiya ust- rojstva i vozvrashchaet upravlenie v rezhim zadachi. Esli ustrojstvo blochnogo tipa, yadro prosmatrivaet tablicu rezul'tatov montirovaniya i proveryaet, ne raspolagaetsya li na ustrojstve smontirovannaya fajlovaya sistema. Esli takaya sistema est', yadro ne smozhet zapustit' proceduru zakrytiya ustrojs- tva, poskol'ku ne byl sdelan poslednij vyzov funkcii close dlya ustrojst- va. Dazhe esli na ustrojstve net smontirovannoj fajlovoj sistemy, v bu- fernom keshe eshche mogut nahodit'sya bloki s dannymi, ostavshiesya ot smonti- rovannoj ranee fajlovoj sistemy i ne perepisannye na ustrojstvo, pos- kol'ku imeli pometku "otlozhennaya zapis'". Poetomu yadro prosmatrivaet bu- fernyj kesh v poiskah takih blokov i perepisyvaet ih na ustrojstvo pered zapuskom procedury zakrytiya ustrojstva. Posle zakrytiya ustrojstva yadro vnov' prosmatrivaet bufernyj kesh i delaet nedejstvitel'nymi vse bufery, kotorye soderzhat bloki dlya tol'ko chto zakrytogo ustrojstva, v to zhe vre- mya pozvolyaya buferam s aktual'noj informaciej ostat'sya v keshe. 3. YAdro osvobozhdaet indeks fajla ustrojstva. Koroche govorya, procedura zakrytiya ustrojstva razryvaet svyaz' s ustrojst- vom i inicializiruet zanovo informacionnye struktury drajvera i apparatnuyu chast' ustrojstva s tem, chtoby yadro moglo by pozdnee otkryt' ustrojstvo 297 vnov'. 10.1.2.3 Read i Write Algoritmy chteniya i zapisi yadrom na ustrojstve pohozhi na analogichnye al- goritmy dlya fajlov obychnogo tipa. Esli process proizvodit chtenie ili zapis' na ustrojstve posimvol'nogo vvoda-vyvoda, yadro zapuskaet procedury read ili write, opredelyaemye tipom drajvera. Nesmotrya na chasto vstrechayushchiesya situa- cii, kogda yadro osushchestvlyaet peredachu dannyh neposredstvenno mezhdu adresnym prostranstvom zadachi i ustrojstvom, drajvery ustrojstv mogut buferizovat' informaciyu vnutri sebya. Naprimer, terminal'nye drajvery dlya buferizacii dan- nyh ispol'zuyut simvol'nye spiski (razdel 10.3.1). V takih sluchayah drajver ustrojstva vydelyaet "bufer", kopiruet dannye iz prostranstva zadachi pri vy- polnenii procedury write i vyvodit ih iz "bufera" na ustrojstvo. Procedura zapisi, upravlyaemaya drajverom, reguliruet ob®em vyvodimoj informacii (t.n. upravlenie potokom dannyh): esli processy generiruyut informaciyu bystree, chem ustrojstvo vyvodit ee, procedura zapisi priostanavlivaet vypolnenie proces- sov do teh por, poka ustrojstvo ne budet gotovo prinyat' sleduyushchuyu porciyu dannyh. Pri chtenii drajver ustrojstva pomeshchaet dannye, poluchennye ot ustroj- stva, v bufer i Pamyat' | | +-----+ 160110| CSR | +------+ +---------tty00 | RDB +---------+ dz00 +-+---------tty01 | TDB | +------+ | ... +-----+ +---------tty07 160120| CSR | +------+ +---------tty08 160122| RDB +---------+ dz01 +-+---------tty09 160126| TDB | +------+ | ... +-----+ +---------tty15 | | Risunok 10.5. Otobrazhenie v pamyati vvoda-vyvoda s ispol'zova- niem kontrollera VAX DZ11 kopiruet ih iz bufera v pol'zovatel'skie adresa, ukazannye v vyzove sistem- noj funkcii. Konkretnyj metod vzaimodejstviya drajvera s ustrojstvom opredelyaetsya oso- bennostyami apparatury. Nekotorye iz mashin obespechivayut otobrazhenie vvoda-vy- voda v pamyati, podrazumevayushchee, chto konkretnye adresa v adresnom prostranst- ve yadra yavlyayutsya ne nomerami yacheek v fizicheskoj pamyati, a special'nymi re- gistrami, kontroliruyushchimi sootvetstvuyushchie ustrojstva. Zapisyvaya v ukazannye registry upravlyayushchie parametry v sootvetstvii so specifikaciyami apparatnyh sredstv, drajver osushchestvlyaet upravlenie ustrojstvom. Naprimer, kontroller vvoda-vyvoda dlya mashiny VAX-11 soderzhit special'nye registry dlya zapisi in- formacii o sostoyanii ustrojstva (registry kontrolya i sostoyaniya) i dlya pere- dachi dannyh (bufernye registry), kotorye formiruyutsya po special'nym adresam v fizicheskoj pamyati. V chastnosti, terminal'nyj kontroller VAX DZ11 upravlyaet 8 asinhronnymi liniyami terminal'noj svyazi (sm. [Levy 80], gde bolee podrobno ob®yasnyaetsya arhitektura mashin VAX). Pust' registr kontrolya i sostoyaniya (CSR) dlya konkretnogo terminala DZ11 imeet adres 160120, peredayushchij bufernyj re- gistr (TDB) - adres 120126, a prinimayushchij bufernyj registr (RDB) - adres 160122 (Risunok 10.5). Dlya togo, chtoby peredat' simvol na terminal "/dev/tty09", drajver terminala zapisyvaet edinicu (1 = 9 po modulyu 8) v 298 ukazannyj dvoichnyj razryad registra kontrolya i sostoyaniya i zatem zapisyvaet simvol v peredayushchij bufernyj registr. Zapis' v peredayushchij bufernyj registr yavlyaetsya peredachej dannyh. Kontroller DZ11 vystavlyaet bit "vypolneno" v re- gistre kontrolya i sostoyaniya, kogda gotov prinyat' sleduyushchuyu porciyu dannyh. Dopolnitel'no drajver mozhet vystavit' bit "vozmozhno preryvanie peredachi" v registre kontrolya i sostoyaniya, chto zastavlyaet kontroller DZ11 preryvat' ra- botu sistemy, kogda on gotov prinyat' sleduyushchuyu porciyu dannyh. CHtenie dannyh iz DZ11 proizvoditsya analogichno. Na drugih mashinah imeetsya programmiruemyj vvod-vyvod, podrazumevayushchij, chto v mashine imeyutsya instrukcii po upravleniyu ustrojstvami. Drajvery uprav- lyayut ustrojstvami, vypolnyaya sootvetstvuyushchie instrukcii. Naprimer, v mashine IBM 370 imeetsya instrukciya "Start I/O" (Nachat' vvod-vyvod), kotoraya inicii- ruet operaciyu vvoda-vyvoda, svyazannuyu s ustrojstvom. Sposob svyazi drajvera s periferijnymi ustrojstvami nezameten dlya pol'zovatelya. Poskol'ku interfejs mezhdu drajverami ustrojstv i sootvetstvuyushchimi appa- ratnymi sredstvami yavlyaetsya mashinno-zavisimym, na etom urovne ne sushchestvuet standartnyh interfejsov. Kak v sluchae vvodavyvoda s otobrazheniem v pamyati, tak i v sluchae programmiruemogo vvoda-vyvoda drajver mozhet posylat' na ust- rojstvo upravlyayushchie posledovatel'nosti s cel'yu ustanovleniya rezhima pryamogo dostupa v pamyat' (PDP) dlya ustrojstva. Sistema pozvolyaet osushchestvlyat' masso- vuyu peredachu dannyh mezhdu ustrojstvom i pamyat'yu v rezhime PDP parallel'no s rabotoj central'nogo processora, pri etom ustrojstvo preryvaet rabotu siste- my po zavershenii peredachi dannyh. Drajver organizuet upravlenie virtual'noj pamyat'yu takim obrazom, chtoby yachejki pamyati s ih dejstvitel'nymi nomerami is- pol'zovalis' dlya PDP. Bystrodejstvuyushchie ustrojstva mogut inogda peredavat' dannye neposredst- venno v adresnoe prostranstvo zadachi, bez vmeshatel'stva bufera yadra. V re- zul'tate povyshaetsya skorost' peredachi dannyh, poskol'ku pri etom proizvodit- sya na odnu operaciyu kopirovaniya men'she, i, krome togo, ob®em dannyh, pereda- vaemyh za odnu operaciyu, ne ogranichivaetsya razmerom buferov yadra. Drajvery, osushchestvlyayushchie takuyu peredachu dannyh bez "obrabotki", obychno ispol'zuyut blochnyj interfejs dlya procedur posimvol'nogo chteniya i zapisi, esli u nih imeetsya dvojnik blochnogo tipa. 10.1.2.4 Strategicheskij interfejs YAdro ispol'zuet strategicheskij interfejs dlya peredachi dannyh mezhdu bu- fernym keshem i ustrojstvom, hotya, kak uzhe govorilos' ranee, procedury chteniya i zapisi dlya ustrojstv posimvol'nogo vvodavyvoda inogda pol'zuyutsya procedu- roj strategy (ih dvojnika blochnogo tipa) dlya neposredstvennoj peredachi dan- nyh mezhdu ustrojstvom i adresnym prostranstvom zadachi. Procedura strategy mozhet upravlyat' ocherednost'yu vypolneniya zadanij na vvod-vyvod, svyazannyj s ustrojstvom, ili vypolnyat' bolee slozhnye dejstviya po planirovaniyu vypolneniya podobnyh zadanij. Drajvery v sostoyanii privyazyvat' peredachu dannyh k odnomu fizicheskomu adresu ili ko mnogim. YAdro peredaet adres zagolovka bufera stra- tegicheskoj procedure drajvera; v zagolovke soderzhitsya spisok adresov (stra- nic pamyati) i razmery dannyh, peredavaemyh na ili s ustrojstva. Analogichnoe dejstvie imeet mesto pri rabote mehanizma svopinga, opisannogo v glave 9. Pri rabote s bufernym keshem yadro peredaet dannye s odnogo adresa; vo vremya svopinga yadro peredaet dannye, raspolozhennye po neskol'kim adresam (stranicy pamyati). Esli dannye kopiruyutsya iz ili v adresnoe prostranstvo zadachi, draj- ver dolzhen blokirovat' process (ili po krajnej mere, sootvetstvuyushchie strani- cy) v pamyati do zaversheniya peredachi dannyh. Naprimer, posle montirovaniya fajlovoj sistemy yadro identificiruet kazhdyj fajl v fajlovoj sisteme po nomeru ustrojstva i nomeru indeksa. V nomere ust- rojstva zakodirovany ego starshij i mladshij nomera. Kogda yadro obrashchaetsya k bloku, kotoryj prinadlezhit fajlu, ono kopiruet nomer ustrojstva i nomer blo- ka v zagolovok bufera, kak uzhe govorilos' ranee v glave 3. Obrashcheniya k dis- 299 ku, ispol'zuyushchie algoritmy raboty s bufernym keshem (naprimer, bread ili bwrite), iniciiruyut vypolnenie strategicheskoj procedury, opredelyaemoj star- shim nomerom ustrojstva. Strategicheskaya procedura ispol'zuet znacheniya polej mladshego nomera i nomera bloka iz zagolovka bufera dlya identifikacii mesta raspolozheniya dannyh na ustrojstve, a adres bufera - dlya identifikacii mesta naznacheniya peredavaemyh dannyh. Tochno tak zhe, kogda process obrashchaetsya k us- trojstvu vvoda-vyvoda blokami neposredstvenno (naprimer, otkryvaya ustrojstvo i chitaya ili zapisyvaya na nego), on ispol'zuet algoritmy raboty s bufernym keshem, i interfejs pri etom funkcioniruet vysheopisannym obrazom. 10.1.2.5 Ioctl Sistemnaya funkciya ioctl yavlyaetsya obobshcheniem specifichnyh dlya terminala funkcij stty (zadat' ustanovki terminala) i gtty (poluchit' ustanovki termi- nala), imevshihsya v rannih versiyah sistemy UNIX. Ona vystupaet v kachestve ob- shchej tochki vhoda dlya vseh svyazannyh s tipom ustrojstva komand i pozvolyaet processam zadavat' apparatnye parametry, associirovannye s ustrojstvom, i programmnye parametry, associirovannye s drajverom. Special'nye dejstviya, vypolnyaemye funkciej ioctl dlya raznyh ustrojstv razlichny i opredelyayutsya ti- pom drajvera. Programmy, ispol'zuyushchie vyzov ioctl, dolzhny dolzhny znat', s fajlom kakogo tipa oni rabotayut, tak kak oni yavlyayutsya apparatno-zavisimymi. Isklyuchenie iz obshchego pravila sdelano dlya sistemy, kotoraya ne vidit razlichij mezhdu fajlami raznyh tipov. Bolee podrobno ispol'zovanie funkcii ioctl dlya terminalov rassmotreno v razdele 10.3.3. Sintaksis komandnoj stroki, soderzhashchej vyzov sistemnoj funkcii: ioctl(fd,command,arg); gde fd - deskriptor fajla, vozvrashchaemyj predvaritel'no vyzvannoj funkciej open, command - dejstvie (komanda), kotoroe neobhodimo vypolnit' drajveru, arg - parametr komandy (mozhet byt' ukazatelem na strukturu). Komandy speci- fichny dlya razlichnyh drajverov; sledovatel'no, kazhdyj drajver interpretiruet komandy v sootvetstvii so svoimi vnutrennimi specifikaciyami, ot komandy, v svoyu ochered', zavisit format struktury dannyh, opisyvaemoj peredavaemym pa- rametrom. Drajvery mogut schityvat' strukturu dannyh arg iz prostranstva za- dachi v sootvetstvii s predopredelennym formatom ili zapisyvat' ustanovki us- trojstva v prostranstvo zadachi po adresu ukazannoj struktury. Naprimer, na- lichie interfejsa, predostavlyaemogo funkciej ioctl, daet vozmozhnost' pol'zo- vatelyam ustanavlivat' dlya terminala skorost' peredachi informacii v bodah, perematyvat' magnitnuyu lentu, i, nakonec, vypolnyat' setevye operacii, zada- vaya nomera virtual'nyh kanalov i setevye adresa. 10.1.2.6 Drugie funkcii, imeyushchie otnoshenie k fajlovoj sisteme Takie funkcii raboty s fajlovoj sistemoj, kak stat i chmod, vypolnyayutsya odinakovo, kak dlya obychnyh fajlov, tak i dlya ustrojstv; oni manipuliruyut s indeksom, ne obrashchayas' k drajveru. Dazhe sistemnaya funkciya lseek rabotaet dlya ustrojstv. Naprimer, esli process podvodit golovku na lentoprotyazhnom ustroj- stve k ukazannomu adresu smeshcheniya v bajtah s pomoshch'yu funkcii lseek, yadro korrektiruet smeshchenie v tablice fajlov no ne vypolnyaet nikakih dejstvij,