А.В. Столяров - Программирование на языке ассемблера NASM для ОС Unix (1110582), страница 31
Текст из файла (страница 31)
Ïûòàòüñÿ îïîâåñòèòü ïðîãðàììó î ïðîèñøåäøåì ïóòåì âûñòàâëåíèÿ êàêîãîíèáóäü ôëàãà, î÷åâèäíî, òàêæå áåññìûñëåííî. Åñëè ïðîãðàììèñò íå ïðîèçâåë ïåðåä âûïîëíåíèåì äåëåíèÿ ïðîâåðêó äåëèòåëÿ íà ðàâåíñòâî íóëþ, ïðåäñòàâëÿåòñÿ è âîâñå íè÷òîæíîé âåðîÿòíîñòü òîãî, ÷òî îí ñòàíåòïðîâåðÿòü ïîñëå äåëåíèÿ çíà÷åíèå êàêîãî-òî ôëàãà.Çàâåðøèòü òåêóùóþ çàäà÷ó ïðîöåññîð ñàìîñòîÿòåëüíî íå ìîæåò. Ýòîñëèøêîì ñëîæíîå äåéñòâèå, çàâèñÿùåå îò ðåàëèçàöèè îïåðàöèîííîé ñèñòåìû. Îñòàåòñÿ òîëüêî îäèí âàðèàíò: ïåðåäàòü óïðàâëåíèå îïåðàöèîííîé ñèñòåìå, èçâåñòèâ å¼ î ïðîèñøåäøåì. ×òî äåëàòü ñ àâàðèéíîé çàäà÷åé, îïåðàöèîííàÿ ñèñòåìà ðåøèò ñàìîñòîÿòåëüíî.
Äëÿ ýòîãî òðåáóåòñÿ,î÷åâèäíî, ïåðåêëþ÷èòüñÿ â ïðèâèëåãèðîâàííûé ðåæèì è ïåðåäàòü óïðàâëåíèå êîäó îïåðàöèîííîé ñèñòåìû; ïåðåä ýòèì æåëàòåëüíî ñîõðàíèòü ðåãèñòðû (õîòÿ áû ñ÷¼ò÷èê êîìàíä è ðåãèñòð ôëàãîâ); äàæå åñëè çàäà÷àíè ïðè êàêèõ óñëîâèÿõ íå áóäåò ïðîäîëæåíà ñ òîãî æå ìåñòà (à ïðåäïîëàãàòü ýòî ïðîöåññîð, âîîáùå ãîâîðÿ, íå âïðàâå), çíà÷åíèÿ ðåãèñòðîâ âëþáîì ñëó÷àå ìîãóò ïðèãîäèòüñÿ îïåðàöèîííîé ñèñòåìå äëÿ àíàëèçà ïðîèñøåñòâèÿ. Áîëåå òîãî, êàêèì-òî îáðàçîì ñëåäóåò ñîîáùèòü îïåðàöèîííîé ñèñòåìå î ïðè÷èíå òîãî, ÷òî óïðàâëåíèå ïåðåäàíî åé; êðîìå äåëåíèÿ133íà íîëü, òàêèìè ïðè÷èíàìè ìîãóò áûòü íàðóøåíèå çàùèòû ïàìÿòè, ïîïûòêà âûïîëíèòü çàïðåù¼ííóþ èëè íåñóùåñòâóþùóþ èíñòðóêöèþ è ò. ï.Ëåãêî çàìåòèòü, ÷òî äåéñòâèÿ, êîòîðûå äîëæåí âûïîëíèòü ïðîöåññîð, îêàçûâàþòñÿ î÷åíü ïîõîæè íà ðàññìîòðåííûé ðàíåå ñëó÷àé àïïàðàòíîãî ïðåðûâàíèÿ. Îñíîâíîå îòëè÷èå ñîñòîèò â îòñóòñòâèè îáìåíà ïîøèíå (çàïðîñà è ïîäòâåðæäåíèÿ ïðåðûâàíèÿ): äåéñòâèòåëüíî, èíôîðìàöèÿ î ïåðå÷èñëåííûõ ñîáûòèÿõ âîçíèêàåò âíóòðè ïðîöåññîðà, à íå âíååãî4 .
Îñòàëüíûå øàãè ïî îáðàáîòêå äåëåíèÿ íà íîëü è äðóãèõ ïîäîáíûõñèòóàöèé ïîâòîðÿþò øàãè ïî îáðaáîòêå àïïàðàòíîãî ïðåðûâàíèÿ ïðàêòè÷åñêè äîñëîâíî. Ïîýòîìó îáðàáîòêó ñèòóàöèé, â êîòîðûõ äàëüíåéøååâûïîëíåíèå àêòèâíîé çàäà÷è îêàçûâàåòñÿ íåâîçìîæíîé ïî ïðè÷èíå âûïîëíåííûõ åþ íåêîððåêòíûõ äåéñòâèé, íàçûâàþò òàê æå, êàê è äåéñòâèÿïî çàïðîñó âíåøíèõ óñòðîéñòâ ïðåðûâàíèÿìè. ×òîáû íå ïóòàòü ðàçíûå ïî ñâîåé ïðèðîäå ïðåðûâàíèÿ, èõ äåëÿò íà âíåøíèå (àïïàðàòíûå) èâíóòðåííèå; òàêàÿ òåðìèíîëîãèÿ îïðàâäàíà òåì, ÷òî ïðè÷èíà âíåøíåãîïðåðûâàíèÿ íàõîäèòñÿ âíå öåíòðàëüíîãî ïðîöåññîðà, òîãäà êàê ïðè÷èíà âíóòðåííåãî ó ÖÏ âíóòðè. Èíîãäà âíóòðåííèå ïðåðûâàíèÿ íàçûâàþò èíà÷å, íàïðèìåð ëîâóøêàìè (traps), èñêëþ÷åíèÿìè (exceptions)èëè êàê-òî åù¼. 4.2.3.
Ïðîãðàììíûå ïðåðûâàíèÿÊàê óæå ãîâîðèëîñü, ïîëüçîâàòåëüñêîé çàäà÷å íå ïîçâîëÿåòñÿ äåëàòüíè÷åãî, êðîìå ïðåîáðàçîâàíèÿ äàííûõ â îòâåä¼ííîé åé ïàìÿòè. Âñå äåéñòâèÿ, çàòðàãèâàþùèå âíåøíèé ïî îòíîøåíèþ ê çàäà÷å ìèð, âûïîëíÿþòñÿ ÷åðåç îïåðàöèîííóþ ñèñòåìó. Ñîîòâåòñòâåííî, íåîáõîäèì ìåõàíèçì,ïîçâîëÿþùèé ïîëüçîâàòåëüñêîé çàäà÷å îáðàòèòüñÿ ê ÿäðó îïåðàöèîííîéñèñòåìû çà òåìè èëè èíûìè óñëóãàìè.
Íàïîìíèì, ÷òî îáðàùåíèå ïîëü-çîâàòåëüñêîé çàäà÷è ê ÿäðó îïåðàöèîííîé ñèñòåìû çà óñëóãàìèíàçûâàåòñÿ ñèñòåìíûì âûçîâîì . ßñíî, ÷òî ïî ñâîåé ñóòè ñèñòåì-íûé âûçîâ ýòî ïåðåäà÷à óïðàâëåíèÿ îò ïîëüçîâàòåëüñêîé çàäà÷è ÿäðóîïåðàöèîííîé ñèñòåìû. Îäíàêî çäåñü åñòü äâå ïðîáëåìû. Âî-ïåðâûõ, ÿäðî ðàáîòàåò â ïðèâèëåãèðîâàííîì ðåæèìå, à ïîëüçîâàòåëüñêàÿ çàäà÷à â îãðàíè÷åííîì. Âî-âòîðûõ, ïðîñòðàíñòâî àäðåñîâ ÿäðà äëÿ ïîëüçîâàòåëüñêîé çàäà÷è îáû÷íî íåäîñòóïíî (áîëåå òîãî, â àäðåñíîì ïðîñòðàíñòâå çàäà÷è ýòèõ àäðåñîâ ìîæåò âîîáùå íå áûòü). Âïðî÷åì, äàæå åñëèáû îíî áûëî äîñòóïíî, ïîçâîëèòü ïîëüçîâàòåëüñêîé çàäà÷å ïåðåäàâàòüóïðàâëåíèå â ïðîèçâîëüíóþ òî÷êó ÿäðà áûëî áû íåñêîëüêî ñòðàííî.Èòàê, äëÿ îñóùåñòâëåíèÿ ñèñòåìíîãî âûçîâà íåîáõîäèìî ñìåíèòü ðåæèì âûïîëíåíèÿ ñ ïîëüçîâàòåëüñêîãî íà ïðèâèëåãèðîâàííûé è ïåðåäàòü4 Ñ òî÷êè çðåíèÿ ðåàëèçàöèè âíóòðåííèå ïðåðûâàíèÿ ìîãóò îêàçàòüñÿ ìíîãîêðàòíîïðîùå, ÷åì àïïàðàòíûå, çà ñ÷åò òîãî, ÷òî îíè âñåãäà ïðîèñõîäÿò íà îïðåäåëåííîé ôàçåâûïîëíåíèÿ èíñòðóêöèè; ïîäðîáíîñòè ÷èòàòåëü íàéäåò â êíèãå [1].134óïðàâëåíèå â íåêîòîðóþ òî÷êó âõîäà â îïåðàöèîííîé ñèñòåìå.
Íàì óæåèçâåñòíû äâà ñëó÷àÿ, â êîòîðûõ ïðîèñõîäèò ÷òî-òî ïîäîáíîå ýòî àïïàðàòíûå è âíóòðåííèå ïðåðûâàíèÿ. Èçîáðåòàòü äîïîëíèòåëüíûé ìåõàíèçì äëÿ ñèñòåìíîãî âûçîâà íå îáÿçàòåëüíî: äëÿ åãî ðåàëèçàöèè ìîæíîèñïîëüçîâàòü ÷àñòíûé ñëó÷àé âíóòðåííåãî ïðåðûâàíèÿ, èíèöèèðóåìûéñïåöèàëüíî ïðåäíàçíà÷åííîé äëÿ ýòîãî ìàøèííîé èíñòðóêöèåé. Íà ðàçíûõ àðõèòåêòóðàõ ñîîòâåòñòâóþùàÿ èíñòðóêöèÿ ìîæåò íàçûâàåòñÿ trap(ëîâóøêà), svc (supervisor call, òî åñòü ¾îáðàùåíèå ê ñóïåðâèçîðó¿) è ò. ä.Ðàññìàòðèâàåìûå íàìè ïðîöåññîðû ñåìåéñòâà i386 èñïîëüçóþò êîìàíäó int (îò ñëîâà interrupt ïðåðûâàíèå).
Òàêîå ïðåðûâàíèå íàçûâàåòñÿ ïðîãðàììíûì ïðåðûâàíèåì . Îòëè÷èå ýòîãî âèäà ïðåðûâàíèÿ îòîñòàëüíûõ ñîñòîèò â òîì, ÷òî îíî ïðîèñõîäèò ïî èíèöèàòèâå ïîëüçîâàòåëüñêîé çàäà÷è, òîãäà êàê äðóãèå ïðåðûâàíèÿ ñëó÷àþòñÿ áåç å¼ âåäîìà:âíåøíèå ïî òðåáîâàíèþ âíåøíèõ óñòðîéñòâ, âíóòðåííèå â ñëó÷àåíåïðåäâèäåííûõ îáñòîÿòåëüñòâ, êîòîðûå âðÿä ëè áûëè âûïîëíÿåìîé ïðîãðàììîé ïðåäóñìîòðåíû. Íåêîòîðûå àâòîðû íå äåëàþò ðàçëè÷èÿ ìåæäóòåðìèíàìè ¾ïðîãðàììíîå ïðåðûâàíèå¿ è ¾ñèñòåìíûé âûçîâ¿, íàçûâàÿñèñòåìíûì âûçîâîì êàê ñàìî îáðàùåíèå ê ÎÑ, òàê è ïðîãðàììíîå ïðåðûâàíèå, èñïîëüçóåìîå äëÿ åãî îñóùåñòâëåíèÿ.Íåêîòîðûå ïðîöåññîðû ìîãóò ïðåäóñìàòðèâàòü è èíûå ìåõàíèçìû ïåðåäà÷è óïðàâëåíèÿ îïåðàöèîííîé ñèñòåìå.
Òàê, ïðîöåññîðû ñåìåéñòâài386 ðåàëèçóþò òàê íàçûâàåìûå øëþçû (àíãë. gates) äëÿ ïåðåäà÷è óïðàâëåíèÿ ïðèâèëåãèðîâàííûì ïðîãðàììàì ñ îäíîâðåìåííûì ïîâûøåíèåìóðîâíÿ ïðèâèëåãèðîâàííîñòè ðåæèìà ðàáîòû ïðîöåññîðà, à ñàìèõ ýòèõóðîâíåé, íàçûâàåìûõ êîëüöàìè çàùèòû, ïðîöåññîðû ñåìåéñòâà i386 ïîääåðæèâàþò íå äâà, à ÷åòûðå; âïðî÷åì, îïåðàöèîííûå ñèñòåìû ýòèì îáû÷íî íå ïîëüçóþòñÿ.Òàê èëè èíà÷å, ïîâûøåíèå óðîâíÿ ïðèâèëåãèé (ïåðåõîä èç îãðàíè÷åííîãî ðåæèìà â ïðèâèëåãèðîâàííûé) âîçìîæíî òîëüêî ïðè óñëîâèè îäíîâðåìåííîé ïåðåäà÷è óïðàâëåíèÿ íà çàðàíåå çàäàííóþ òî÷êó âõîäà, ïðè÷åì àäðåñà âîçìîæíûõ òî÷åê âõîäà ìîãóò íàñòðàèâàòüñÿ òîëüêî â ïðèâèëåãèðîâàííîì ðåæèìå. Òàêèì îáðàçîì, îïåðàöèîííàÿ ñèñòåìà èìååòâîçìîæíîñòü ãàðàíòèðîâàòü, ÷òî ïðè ñìåíå ðåæèìà ðàáîòû íà ïðèâèëåãèðîâàííûé óïðàâëåíèå ïîëó÷èò òîëüêî êîä ñàìîé îïåðàöèîííîé ñèñòåìû, ïðè÷åì òîëüêî òàêîé å¼ êîä, êîòîðûé äëÿ ýòîãî ñïåöèàëüíî ïðåäíàçíà÷åí.
Èñïîëíåíèå â ïðèâèëåãèðîâàííîì ðåæèìå êàêîãî áû òî íè áûëîïîëüçîâàòåëüñêîãî êîäà ïîëíîñòüþ èñêëþ÷àåòñÿ. 4.3. Ñèñòåìíûå âûçîâû â ÎÑ UnixÏåðåéä¼ì òåïåðü ê îñâîåíèþ ñèñòåìíûõ âûçîâîâ íà ïðàêòèêå. Ñëåäóåò îòìåòèòü, ÷òî ñîãëàøåíèÿ î òîì, êàê êîíêðåòíî äîëæåí ïðîèñõî135äèòü ñèñòåìíûé âûçîâ, êàê ïåðåäàòü åìó íåîáõîäèìûå ïàðàìåòðû, êàêîåèñïîëüçîâàòü ïðåðûâàíèå, êàê ïîëó÷èòü ðåçóëüòàò âûïîëíåíèÿ è ò. ï.,âàðüèðóþòñÿ îò ñèñòåìû ê ñèñòåìå. Äàæå åñëè ðå÷ü èä¼ò î äâóõ ïðåäñòàâèòåëÿõ ñåìåéñòâà Unix (ÎÑ Linux è ÎÑ FreeBSD), ðàáîòàþùèõ íàîäíîé è òîé æå àïïàðàòíîé ïëàòôîðìå i386, íèçêîóðîâíåâàÿ ðåàëèçàöèÿñèñòåìíûõ âûçîâîâ îêàçûâàåòñÿ â íèõ ñîâåðøåííî ðàçëè÷íà. Ñëåäóþùèåäâà ïàðàãðàôà áóäóò ïîñâÿùåíû îïèñàíèþ ñîãëàøåíèé îá îðãàíèçàöèèñèñòåìíûõ âûçîâîâ ýòèõ äâóõ ñèñòåì5 ; ïðè æåëàíèè âû ìîæåòå ïðî÷èòàòü òîëüêî îäèí èç ýòèõ äâóõ ïàðàãðàôîâ, îòíîñÿùèéñÿ ê òîé ñèñòåìå,êîòîðóþ âû èñïîëüçóåòå.Ñëåäóåò èìåòü â âèäó, ÷òî ñèñòåìû ñåìåéñòâà Unix ðàñ÷èòàíû â îñíîâíîì íà ïðîãðàììèðîâàíèå íà ÿçûêå Ñè.
Åñòåñòâåííî, äëÿ ýòîãî ÿçûêà âìåñòå ñ ñèñòåìîé ïîñòàâëÿþòñÿ áèáëèîòåêè, îáëåã÷àþùèå ðàáîòóñ ñèñòåìíûìè âûçîâàìè â ÷àñòíîñòè, äëÿ êàæäîãî ñèñòåìíîãî âûçîâà ïðåäîñòàâëÿåòñÿ áèáëèîòå÷íàÿ ôóíêöèÿ, ïîçâîëÿþùàÿ îáðàòèòüñÿ ê óñëóãàì ÿäðà êàê ê îáû÷íîé ïîäïðîãðàììå. Ñèñòåìíûå âûçîâûâ ÎÑ Unix èìåþò íàçâàíèÿ, ñîâïàäàþùèå ñ èìåíàìè ñîîòâåòñòâóþùèõôóíêöèé-îá¼ðòîê èç áèáëèîòåêè ÿçûêà Ñè. Ê ñîæàëåíèþ, òàêàÿ îðèåíòèðîâàííîñòü íà Ñè ïðèâîäèò ê íåêîòîðûì íåóäîáñòâàì ïðè ðàáîòå íàóðîâíå ÿçûêà àññåìáëåðà. Òàê, ñèñòåìíûå âûçîâû ïðè ïåðåõîäå îò ñèñòåìû ê ñèñòåìå ìîãóò ìåíÿòü ñâîè íîìåðà (íàïðèìåð, getppid â ÎÑ Linuxèìååò íîìåð 64, à â ÎÑ FreeBSD íîìåð 39). Ïðîãðàììèñòû, ðàáîòàþùèå íà ÿçûêå Ñè, îá ýòîì ìîãóò íå çàäóìûâàòüñÿ, ïîñêîëüêó â ëþáîéñèñòåìå ñåìåéñòâà Unix èì äîñòàòî÷íî âûçâàòü îáû÷íóþ ôóíêöèþ ñ èìåíåì getppid, à êîíêðåòíîå èñïîëíåíèå ñèñòåìíîãî âûçîâà âîçëàãàåòñÿ íàáèáëèîòåêó, êîòîðàÿ ïðèëàãàåòñÿ ê ñèñòåìå, òàê ÷òî ïðîãðàììà, íàïèñàííàÿ ïðîãðàììèñòîì íà Ñè ñ èñïîëüçîâàíèåì getppid, áóäåò óñïåøíîêîìïèëèðîâàòüñÿ íà ëþáîé ñèñòåìå è ðàáîòàòü îäèíàêîâî.