З ащ и щ ен н ы й р еж и м п р о ц ессо р о в In tel 80286/80386/80486 © А л ексан д р Ф р ол ов, Гри гор и й Т ом 6, М .: Д и ал ог-М И Ф И , 1993, 234 стр .
Ф р ол ов
У чебн о -сп р авочн ое п особ и е. И м еет п р акти ческую н ап р авл ен н ость. В кн и ге оп и сан ы особен н ости защ и щ ен н ого р еж и м а р аб оты п р оц ессор а, п р оц ед ура п ер екл ю чен и я в защ и щ ен н ы й р еж и м и возврата в р еальн ы й р еж и м . П р и вед ены п р огр ам м ы , д ем он стри рую щ и е и сп ол ьзован и е защ и щ ен н ого р еж и м а и м ульти задачн ость. О п и сан а и ерар хи я ср ед ств д л я р аб оты в защ и щ ен н ом р еж и м е, в частн ости , и н тер ф ей сы п р еры ван и я BIOS INT 15h, VCPI, DPMI, DOS-экстен дер ы и ви ртуальн ая м аш и н а оп ер ац и он н ой си стем ы W in d ow s Д и скета с и сход н ы м и текстам и п р огр ам м (13 0 К б ай т)
О гл авл ен и е В в ед ен и е 1. О со б ен н о сти защ и щ ен н о го р еж и м а п р о ц ессо р а I8 0 2 8 6 1.1. А д р есац и я п ам яти 1.2. А д р есац и я п ам яти 1.3. Защ и та 1.4. В и ртуал ьн ая п ам ять в п роц ессор е i80286
в в
2. В х од и м в защ и щ ен н ы й р еж и м 2.1. 2.2. 2.3. 2.4.
П од готовка к п ер екл ю чен и ю в защ и щ ѐн н ы й реж и м П ер еклю чен и е в защ и щ ѐн н ы й реж и м В озврат в р еал ьн ы й р еж и м П р и м ер п р остой п р ограм м ы п ер екл ю чен и я р еж и м а
3. О б р аб о тка п р ер ы в ан и й в защ и щ ен н о м р еж и м е 3.1. П р ер ы ван и я в р еал ьн ом р еж и м е 3.2. П р ер ы ван и я защ и щ ѐн н ого р еж и м а 3.3. П р огр ам м а, котор ая р аб отает с п р еры ван и ям и 4. М ул ьти зад ач н о сть в п р о ц ессо р е I8 0 2 8 6 4.1. 4.2. 4.3. 4.4.
Зад ача и сегм ен т состоян и я зад ачи П ер еклю чен и е зад ач С и н хр он и зац и я зад ач и сем аф ор ы П р и м ер м ул ьти зад ачн ого м он и тор а
5. О со б ен н о сти п р о ц ессо р о в I8 0 3 8 6 и I8 0 4 8 6 5.1. 5.2. 5.3. 5.4. 5.5.
П р еобр азован и е адр есов О б р аб отка п р ер ы ван и й М ул ьти зад ачн ость Реж и м ви ртуал ьн ого п р оц ессор а i8086 В и ртуал ьн ы е м аш и н ы
в
р еал ьн ом защ и щ ѐн н ом п р оц ессор е
р еж и м е р еж и м е i80286
5.6. П ер еклю чен и е в защ и щ ѐн н ы й и р еал ьн ы й р еж и м ы 5.7. П р оц ессор i80486 5.8. 80286, 80386, 80486...Ч то д ал ьш е? 6. И ер ар х и я ср ед ств д л я р аб о ты в защ и щ ен н о м р еж и м е 6.1. 6.2. 6.3. 6.4. 6.5.
И н терф ей с B IO S И н терф ей с H IM E M .S Y S И н терф ей с E M S /V C P I И н терф ей с D P M I DOS-экстен д ер ы
7. О п ер ац и о н н ая си стем а M icro so ft W in d o w s 7.1. И сп ол ьзован и е ф ун кц и й D P M I 7.2. Д р ай вер ы , р ези д ен тн ы е п р огр ам м ы и W IN D O W S 7.3. С вязь с W IN D O W S C LIP B O A R D 8. О б зо р л и тер атур ы 9. П р и л о ж ен и е 9.1. 9.2. 9.3. 9.4. 9.5. 9.6. 9.7. 9.8. 9.9.
Реги стр E FLA G S У п равл яю щ и е р еги стр ы п р оц ессор а i8038 6 Ф орм ат р еги стра C R 0 п р оц ессор а i80386 Ф орм ат р еги стра C R 0 п р оц ессор а i80486 Ф орм ат р еги стра C R 3 п р оц ессор а i80486 С и стем н ы е ком ан д ы п р оц ессор ов i80286/i80 386/i80 486 Н ед окум ен ти р ован н ая ком ан д а LO A D A LL У ти л и та M E M O S C O P Защ и та п р огр ам м от отлад ки
1 . О С О Б Е Н Н О С Т И З А Щ И Щ Ё Н Н О ГО Р Е Ж И М А П Р О Ц Е С С О Р А I8 0 2 8 6 П од авл яю щ ее б ол ьш и н ство вл ад ел ьц ев п ер сон ал ьн ы х ком п ью тер ов, совм ести м ы х с IB M P C , и сп ол ьзую т оп ер ац и он н ую си стем у M icrosoft M S -D O S и л и ан ал оги чн ую (IB M P C D O S и л и D ig ital R esearch D R D O S ). В се эти оп ер ац и он н ы е си стем ы и зн ачал ьн о р азр абаты вал и сь д л я м и кр оп р оц ессор а ф и р м ы Intel i808 6 и л и его б олее д еш ѐвого ан ал ога i8088. И м ен н о таки е м и кр оп р оц ессор ы б ы л и устан овлен ы в п ервы х п ерсон ал ьн ы х ком п ью тер ах ф и р м ы IB M - IBM P C и IB M XT. П р оц ессор ы i8086 и i8088 отн осятся к 16 -р азр ядн ы м п р оц ессор ам . М акси м ал ьн ы й об ъ ѐм ад р есуем ой и м и оп ер ати вн ой п ам яти составл яет 1 м егаб ай т, что оп р ед ел яется и сп ол ьзован и ем 20 -р азр ядн ой ад р есац и и п ам яти . В ы зн аете, что р азр аб отчи ки ф и р м ы IB M и з всего м егаб ай тн ого ад р есн ого п р остран ства отвел и д л я оп ер ати вн ой п ам яти 640 ки л обай т, зар езерви р овав остал ьн ое д л я B IO S и ап п аратуры . И м ен н о н а такую кон ф и гурац и ю ад р есн ого п р остр ан ства и р ассчи тан а оп ер ац и он н ая си стем а M S -D O S (и еѐ ан ал оги ). П оэтом у м акси м ал ьн ы й разм ер оп ер ати вн ой п ам яти , д оступ н ой п р огр ам м ам , р аб отаю щ и м п од уп р авл ен и ем M S -D O S , обы чн о составл яет 500 -620 ки л об ай т, в зави си м ости от вер си и оп ер ац и он н ой си стем ы и еѐ н астр ой ки , от ти п а ком п ью тера, от кон ф и гур ац и и д р ай вер ов и р ези д ен тн ы х п р огр ам м . П о м ер е вн едр ен и я п ер сон альн ы х ком п ью тер ов в р азли чн ы е сф ер ы д еятел ьн ости чел овека б ы стр о возр астал а сл ож н ость п р огр ам м н ого об есп ечен и я и тр еб ован и я к ап п ар атуре п ер сон ал ьн ого ком п ью тер а. С кор о стал о ясн о, что д л я усп еш н ого реш ен и я м н оги х задач объ ѐ м а п ам яти в 640 ки л об ай т явн о н ед остаточн о. С л ед ую щ ая уд ачн ая м од ел ь п р оц ессор а ф и р м ы In tel - 16-р азр яд н ы й п р оц ессор i80286 - п р и н ц и п и ал ьн о отл и чается от i8086. Э тот п р оц ессор м ож ет раб отать в д вух р еж и м ах - р еал ьн ом и защ и щ ѐн н ом .
В р еал ьн ом р еж и м е п р оц е ссор i8028 6 явл яется п р акти чески п олн ы м ан ал огом i8086, н о и м еет б ол ьш ее б ы стр од ей стви е. В р еал ьн ы й р еж и м п р оц ессор п ер екл ю чается п осл е ап п ар атн ого сбр оса и л и п осл е вкл ю чен и я п и тан и я ком п ью тер а. Р еал ьн ы й р еж и м об есп ечи вает п олн ую совм ести м ость п р оц ессор а i80286 с п р огр ам м н ы м об есп ечен и ем , п од готовл ен н ы м д л я i8086. П оэтом у ком п ью тер IB M A T (и его ан ал оги ), в котор ом устан овл ен п р оц ессор i80286, сп особ ен б ез труд а р аб отать с оп ер ац и он н ой си стем ой M S -D O S и п р огр ам м ам и , р азр аб отан н ы м р ан ее д л я п р оц ессор а i8086 . О д н ако п олн остью возм ож н ости i80286 р еал и зую тся в так н азы ваем ом защ и щ ѐн н ом р еж и м е, в которы й п р оц ессор м ож ет п ер екл ю чи ться сп ец и ал ьн ой ком ан д ой и з р еал ьн ого р еж и м а. В защ и щ ѐн н ом р еж и м е п р оц ессор i8028 6 п ол н остью п р еоб р аж ается. И сп ол ьзуя совер ш ен н о и н о й м етод ад р есац и и п ам яти , п р оц ессор i80286 р асш и р яет адр есн ое п р остран ство д о 16 м егабай т. П р оц ессор i80286 в защ и щ ѐн н ом р еж и м е и м еет встр оен н ую п од д ер ж ку м ул ьти зад ачн ы х оп ерац и он н ы х си стем , зн ачи тел ьн о ускор яю щ ую и уп р ощ аю щ ую п р оц есс п ер екл ю чен и я зад ач. Э та п од д ерж ка акти вн о и сп ол ьзуется всем и м ул ьти зад ачн ы м и оп ерац и он н ы м и си стем ам и и об ол очкам и , р азраб отан н ы м и д л я ком п ью тер а IB M PC/AT. К р ом е р асш и р ен и я ад ресн ого п р остр ан ства, н овы й м етод ад р есац и и п ам яти п озвол яет и зол и р овать ад ресн ы е п р остр ан ства отд ел ьн ы х зад ач д р уг от д р уга. П р и этом п р и кл ад н ая п р огр ам м а, р аб отаю щ ая в ср ед е оп ер ац и он н ой си стем ы , и сп ол ьзую щ ей защ и щ ѐн н ы й р еж и м , н е м ож ет сл учай н о и л и н ам ер ен н о р азруш и ть ц ел остн ость сам ой оп ер ац и он н ой си стем ы . В сп ом н и те, скол ько раз вам п р и ход и л ось п ер еза гр уж ать оп ер ац и он н ую си стем у M S -D O S в п р оц ессе отл ад ки р ези д ен тн ы х (д а и н е тол ько р ези д ен тн ы х!) п р огр ам м . Т ак как в р еал ьн ом р еж и м е ваш а п р ограм м а м ож ет вы п олн ять зап и сь д ан н ы х п о л ю б ы м ад р есам в п р ед ел ах п ер вого м егаб ай та, ей н и чего н е стои т зап и сать что н и буд ь в об л асть п ам яти , п ри н ад л еж ащ ей оп ер ац и он н ой си стем е M S -D O S и ли и сп орти ть векторн ую таб л и ц у п р ер ы ван и й . В защ и щ ѐн н ом р еж и м е п р ограм м а м ож ет зап и сы вать д ан н ы е тол ько в те об л асти п ам яти , которы е вы д ел ен ы ей оп ер ац и он н ой си стем ой . Э то си л ьн о п овы ш ае т н ад ѐж н ость раб оты м ул ьти зад ачн ы х и , в частн ости , м ул ьти п ол ьзовател ьски х оп ерац и он н ы х си стем . В п осл ед н ем сл учае и зол и р ован и е ад р есн ы х п р остр ан ств зад ач, п р и н ад л еж ащ и х отд ел ьн ы м п ол ьзовател ям , в хор ош о сп р оекти р ован н ой м ул ьти п ол ьзовател ьской оп ер ац и он н ой си стем е п ол н остью и скл ю чает такую си туац и ю , когд а п осл е зап уска од н и м п ол ьзовател ем н ед остаточн о отл аж ен н ой п р огр ам м ы п ри ход и тся п ер езап ускать всю си стем у. В ооб щ е говор я, п о свои м возм ож н остям п р оц ессор i80286 в защ и щ ѐн н ом р еж и м е б ол ьш е п охож н а ц ен тр ал ьн ы е п р оц ессор ы б ол ьш и х и м и н и -Э В М , чем н а м и кр оп р оц ессоры , и сп ол ьзовавш и еся в п ер вы х м од ел ях п ер сон ал ьн ы х ком п ью тер ов. П оэтом у i80286 (а такж е сл ед ую щ и е м од ел и - i8038 6 и i80 486) об ы чн о н азы ваю т н е м и кр оп р оц ессор ам и , а п р оц ессор ам и . В сл ед ую щ и х м од ел ях п р о ц ессор ов ф и рм ы In tel - i80386 и i8048 6 - п ом и м о р асш и рен и я ад р есн ого п р остр ан ства д о ум оп ом р ачи тел ьн ой вел и чи н ы в 4 ги габ ай та р еали зован а кон ц еп ц и я стр ан и чн ой ви р туал ьн ой п ам яти . В сѐ это возм ож н о тол ько в защ и щ ѐн н ом р еж и м е. Н е вд аваясь в д етали (и х м ы р ассм отр и м п озж е) м ож н о сказать, что м ехан и зм стр ан и чн ой ви ртуал ьн ой п ам яти п озвол яет р азм ести ть часть оп ер ати вн ой п ам яти н а д и ске. В н астоящ ее вр ем я стои м ость оп ерати вн ой п ам яти такова, что р ед ко м ож н о встр ети ть п ер сон ал ьн ы е ком п ью тер ы , осн ащ ѐн н ы е б ол ее чем 16 м егабай там и оп ер ати вн ой п ам яти . О б ы чн о ж е в н али чи и еѐ и м еется всего 3 -4 м егаб ай та. Н о есл и ваш ком п ью тер и м еет д и ск б ол ьш ого р азм ер а, вы м ож ете зад ей ствовать часть д и ска д л я созд ан и я ви р туал ьн ой оп ер ати вн ой п ам яти . П ри этом р азм ер оп ер ати вн ой п ам яти (в и р туал ьн ой ), п р ед оставл яем ы й п р огр ам м ам , огр ан и чен р азве что ли ш ь р азм ер ом своб одн ого п р остран ства н а ди ске. Н ап ри м ер, п ри р аб оте в ср ед е оп ер ац и он н ой си стем ы W IN D O W S вер си й 3.0 и 3.1 н а ком п ью тер ах, осн ащ ѐн н ы х п р оц ессор ам и i80386 и л и i80 486 в так н азы вае м ом р асш и р ен н ом р еж и м е (386 E n h an ced M od e) ваш а п р огр ам м а м ож ет р асп ор яж аться н ескол ьки м и д есяткам и м егаб ай т ви ртуал ьн ой оп ер ати вн ой п ам яти , д аж е если в ком п ью тер е устан овл ен о тол ько 3 -4 м егаб ай та ф и зи ческой оп ер ати вн ой п ам яти . К он ечн о, ви р туал ьн ая п ам ять р аб отает м ед л ен н ее, чем ф и зи ческая, н о, во -п ер вы х, 100 м егаб ай т ви р туал ьн ой п ам яти об ой д утся вам н еи зм ер и м о д еш евле, чем 100 м егаб ай т ф и зи ческой п ам яти , а во -втор ы х, п р оц ессор ы i8038 6 и i80486 и сп ол ьзую т сп ец и ал ьн ы е ап п ар атн ы е ср ед ства, ускор яю щ и е р аб оту п од си стем ы ви ртуал ьн ой п ам яти .
К р ом е того, р еал ьн о тол ько м ехан и зм стр ан и чн ой ви р туал ьн ой п ам яти м ож ет об есп ечи ть п ри кл адн ы е п р огр ам м ы отн оси тел ьн о б ы стр ой оп ер ати вн ой п ам ятью , р азм ер котор ой б ол ьш е разм ер а ф и зи ческой п ам яти , устан овл ен н ой в ком п ью тере. П ом и м о стр ан и чн ой ви р туальн ой п ам яти в п р оц ессор ах i8038 6 и i80486 р еал и зован так н азы ваем ы й р еж и м ви р туал ьн ого п р оц ессора i8086 и л и п р осто ви ртуал ьн ы й р еж и м . Э тот р еж и м р еал и зуется в р ам ках защ и щ ѐн н ого р еж и м а (п р оц ессор м ож ет п ер екл ю чи ться в ви р туал ьн ы й р еж и м тол ько и з защ и щ ѐн н ого р еж и м а). В ви р туал ьн ом р еж и м е п р оц ессор сп особ ен вы п ол н ять п р ограм м ы , составлен н ы е д л я п р оц ессор а i8086, н аход ясь в защ и щ ѐн н ом р еж и м е и и сп ол ьзуя ап п ар атн ы е ср ед ства защ и щ ѐн н ого р еж и м а: м ул ьти зад ачн ость, и золи р ован и е ад ресн ы х п р остр ан ств отдел ьн ы х зад ач д р уг от д р уга, стр ан и чн ая ви ртуал ьн ая п ам ять. Н ал и чи е ви р туал ьн ого р еж и м а зн ачи тел ьн о об л егчает п р оекти р ован и е оп ер ац и он н ы х си стем , сп особ н ы х вы п олн ять од н овр ем ен н о в м ул ьти зад ачн ом р еж и м е н ескол ько п р ограм м , ори ен ти р ован н ы х н а оп ер ац и он н ую си стем у M S -D O S . В озм ож н ость од н овр ем ен н ой раб оты н ескол ьки х п р ограм м , п р ед н азн ачен н ы х д л я M S -DOS, р еал и зован а, н ап р и м ер , в оп ер ац и он н ы х си стем ах W IN D O W S вер си й 3.0 и 3.1 (в р асш и р ен н ом реж и м е и тол ько п р и н ал и чи и п р оц ессор ов i80386, i80486), O S /2 вер си и 2.0, D esk V iew 386. П ер ечи сли м кр атко осн овн ы е п р еи м ущ ества, котор ы е п олучает п р огр ам м а, раб отаю щ ая в защ и щ ѐн н ом р еж и м е п р оц ессор а:
возм ож н ость н еп осред ствен н ой ад ресац и и п ам яти за п р ед елам и п ервого м егабай та; д л я п р оц есор ов i80386 и i80486 р еа ли зован м ехан и зм стран и чн ой ви р туал ьн ой п ам яти , п озвол яю щ и й
п р огр ам м ам р аб отать с п ам ятью , разм ер котор ой м ож ет б ы ть м н ого б ол ьш е ф и зи ческой оп ер ати вн ой п ам яти , устан овл ен н ой в ком п ью тер е; ап п ар атн ая п од д ерж ка м ул ьти зад ачн ости п озвол яет созд авать н а осн ов е п р оц ессор ов, р аб отаю щ и х в защ и щ ѐн н ом р еж и м е вы сокоп р ои звод и тел ьн ы е м ул ьти зад ачн ы е и м ул ьти п ол ьзовател ьски е си стем ы ; эф ф екти вн ая р аб ота н ескол ьки х п р огр ам м , составлен н ы х д ля M S -D O S , осн ован н ая н а и сп ол ьзован и и ви р туал ьн ого реж и м а р аб оты п р оц ессор а. И зуч ен и е защ и щ ѐн н ого р еж и м а м ы н ачн ѐм с оп и сан и я м етод а ад р есац и и п ам яти , кор ен н ы м об р азом отл и чаю щ егося от п ри вы чн ого д л я вас м етод а < сегм ен т:см ещ ен и е> р еал ьн ого р еж и м а. О д н ако вн ачал е н ап ом н и м , как ад р есуется п ам ять в р еал ьн ом р еж и м е.
1 .1 . А д р есац и я п ам я ти в р еал ьн о м р еж и м е В ы н аверн ое зн аете, что д ля р аб оты с п ам ятью и сп ол ьзую тся д ве ш и н ы - ш и н а ад р еса и ш и н а д ан н ы х. Ф и зи чески п ам ять устр оен а таки м об р азом , что возм ож н а ад р есац и я как 16 -б и товы х сл ов, так и отд ел ьн ы х б ай тов п ам яти . К р ом е того, п р оц ессор ы i80 386 и i80486 м огут адр есовать 32 -б и товы е сл ова п ам яти . В л ю б ом сл учае так н азы ваем ы й ф и зи чески й ад р ес п еред аѐтся и з п р оц ессор а в п ам ять п о ш и н е ад р еса. Ш и р и н а ш и н ы ад р еса оп р ед ел яет м акси м ал ьн ы й об ъ ѐм ф и зи ческой п ам яти , н еп оср ед ствен н о ад р есуем ой п р оц ессо р ом . Н а ри с. 1 п оказан а схем а взаи м од ей стви я п р оц ессор а и п ам яти чер ез ш и н ы ад р еса и д ан н ы х.
Р и с. 1. Ш и н а ад р еса и ш и н а дан н ы х Н ап ри м ер, ком п ью тер IB M X T осн ащ ѐн 20 -р азр яд н ой ш и н ой ад р еса и 16 -р азр яд н ой ш и н ой д ан н ы х. Э то озн ачает, что и м еется возм ож н ость адр есоваться к 216 б ай там п ам яти , т.е. к 1 м егабай ту п ам яти . П р и чѐм возм ож н о ад р есоваться к б ай там и сл овам р азм ер ом в 16 б и т. Т ак как ад р еса п ри н ято зап и сы вать в ш естн ад ц атер и чн ой ф ор м е, то м ы м ож ем зап и сать д и ап азон ф и зи чески х ад р есов д л я 20 -р азр яд н ой ш и н ы адр еса сл едую щ и м обр азом :
00000h <= [физический адрес] <= FFFFFh Т аки м об р азом , д л я п р ед ставл ен и я ф и зи ческого ад р еса в ком п ью тер ах IB M P C и IB M X T и сп ол ьзуется двад ц ать д вои чн ы х и л и п ять ш естн ад ц атер и чн ы х р азр яд ов. О д н ако все р еги стр ы п р оц ессор а i8086 явл яю тся 16 -р азр яд н ы м и . В озн и кает п р об лем а п ред ставл ен и я 20 р азр яд н ого ф и зи ческого ад реса п ам яти п р и п ом ощ и сод ерж и м ого 16 -р азр ядн ы х р еги стр ов. Д л я р азреш ен и я этой п р об л ем ы и сп ол ьзуется д вухком п он ен тн ы й л оги чески й ад рес. Л оги чески й ад р ес состои т и з 16-р азр яд н ы х ком п он ен т: ком п он ен ты сегм ен та п ам яти и ком п он ен ты см ещ ен и я вн утр и сегм ен та. Д л я п ол учен и я 20 -р азр яд н ого ф и зи ческого ад р еса к сегм ен тн ой ком п он ен те п ри п и сы вается сп р ава четы р е н ул евы х б и та (д л я р асш и р ен и я д о 2 0 р азр яд ов), затем п ол учен н ое чи сл о скл ад ы вается с ком п он ен той см ещ ен и я. П ер ед сл ож ен и ем к ком п он ен те см ещ ен и я сл ева д оп и сы вается четы р е н ул евы х б и та (такж е д л я р асш и р ен и я д о 20 р азр яд ов). Э ту п р оц ед уру и л л ю стри р ует р и с. 2.
Р и с. 2. А д р есац и я п ам яти в р еал ьн ом р еж и м е. Л оги чески й ад р ес п ри н ято зап и сы вать в ф ор м е < сегм ен т:см ещ ен и е> . Н ап ри м ер, п усть у н ас есть л оги чески й ад р ес 1234h :012 3 h . С егм ен тн ая ком п он ен та р авн а 1234h , ком п он ен та см ещ ен и я - 0123h . В ы чи сли м ф и зи чески й ад рес, соответствую щ и й н аш ем у л оги ческом у ад р есу:
р асш и р яем д о 20 б и т сегм ен тн ую ком п он ен ту, д оп и сы вая сп р ава 4 н ул евы х би та, п ол учаем чи сл о 12340h;
р асш и р яем д о 20 б и т ком п он ен ту см ещ ен и я, д оп и сы вая сл ева 4 н ул евы х би та, п ол учаем чи сл о 00123h ; д л я п ол учен и я ф и зи ческого ад р еса скл ад ы ваем п ол учен н ы е чи сл а: 12340h + 0012 3h = 12453h.
О чеви д н о, что од н ом у ф и зи ческом у ад р есу м ож ет соответствовать ф и зи ческом у ад р есу 12453h соответствует л оги чески й ад р ес 1245h :0 003h .
н ескол ько
л оги чески х. Н ап р и м ер ,
Ф акти чески в схем е ад р есац и и п ам яти р еал ьн ого р еж и м а вся п ам ять как б ы р азб и в ается н а сегм ен ты . Ф и зи чески й ад р ес н ачал а сегм ен та (б азовы й ад р ес сегм ен та) р авен р асш и рен н ой д о 20 б и т сегм ен тн ой ком п он ен те ад реса (р асш и р ен и е вы п олн яется д оп и сы ван и ем сп р ава 4 н ул евы х б и т). С егм ен ты м огут н ачи н аться н е с лю б ого ф и зи ческого адр еса, а тол ько с такого, котор ы й кр атен 16 б ай там . П оэтом у сегм ен т м ож ет н ачи н аться тол ько с гр ан и ц ы п ар агр аф а. К ом п он ен та см ещ ен и я п ри такой схем е ад р есац и и явл яется см ещ ен и ем вн утр и сегм ен та п ам яти . А сам сегм ен т п ам яти зад аѐтся сегм ен тн ой ком п он ен той . Р и с.3 и л л ю стр и р ует сказан н ое вы ш е. Н а этом ри сун ке п оказан о соответстви е л оги ческого ад р еса 0002h :0 028h ф и зи ческом у ад р есу 00048h .
Р и с. 3. С оответстви е л оги ческого и ф и зи ческого ад р есов. Л оги чески й ад р ес д олж ен н аход и ться в сл ед ую щ и х п р ед ел ах:
0000h:0000h <= [логический адрес] <= FFFFh:000Fh Зд есь есть од н а тон кость. Л оги чески й адр ес FFFFh :000Fh соответствует м акси м ал ьн о возм ож н ом у ф и зи ческом у ад р есу FFFFFh. Н о и сп ол ьзуя 16 -р азр яд н ы е р еги стр ы п р оц ессор а вы м ож ете зад ать и б ол ьш ее зн ачен и е д л я л оги ческого ад р еса, н ап ри м ер, FFFFh :0010h . Ч то п р ои зой д ѐт в этом сл учае? Е сл и в ком п ью тер е устан овл ен ы п р оц ессор ы i8086 и л и i8088, п р ои зой д ѐт п ереп олн ен и е ад р еса, котор ое б уд ет п р ои гн ори р ован о п р оц ессор ом . В р езул ьтате л оги ческом у ад р есу FFFFh :0010h б уд ет соответствовать ф и зи чески й ад р ес 00000h . Е сл и ж е и сп ол ьзую тся п р оц ессор ы i8028 6, i8 0386 и л и i80486, ф и зи ческая ш и н а адр еса ш и р е 20 б и т. Д л я п р оц ессор а i80286 ш и н а ад р еса и м еет ш и ри н у 24 би та, а дл я п р оц ессор ов i80386 и i8048 6 - 32 б и та. П р и р аб оте в р еал ьн ом реж и м е и сп ол ьзую тся м л ад ш и е 20 ад р есн ы х ли н и й - от A 0 д о A 19, остал ьн ы е ад р есн ы е ли н и и ап п ар атур а ком п ью тера б л оки р ует. О д н ако есть возм ож н ость сн ять б л оки р овку с ад р есн ой ли н и и A 20. П ри этом в реал ьн ом р еж и м е п оявл яется ещ ѐ од и н "л ьготн ы й " сегм ен т п ам яти , л еж ащ и й вы ш е гран и ц ы п ер вого м егаб ай та. Э тот сегм ен т н азы вается об ластью
стар ш ей п ам яти (H ig h M em ory A rea). Е м у соответствует д и ап азон л оги чески х адр есов от FFFFh :0010h д о FFFFh :FFFFh . Р азм ер об ласти стар ш ей п ам яти составл яет 64 ки л обай та б ез 16 б ай т. О п ер ац и он н ая си стем а M S -D O S ум еет и сп ол ьзовать старш ую об л асть п ам яти , р асп олагая там своѐ яд р о. Д л я этого н еобход и м о п од кл ю чи ть д р ай вер H IM E M .S Y S и п ом ести ть в ф ай л C O N FIG .S Y S стр оку:
DOS=HIGH Архитектура процессоров серии i80XXX, работающих в реальном режиме, предполагает хранение сегментной компоненты адреса в специальных сегментных регистрах: CS - сегмент кода; DS - сегмент данных; ES - дополнительный сегмент данных; SS - сегмент стека. Компонента смещения может находиться в регистрах BX, BP, SI, DI, IP. Зад авая п р ои звол ьн ы е зн ачен и я сегм ен тн ой ком п он ен ты и ком п он ен ты см ещ ен и я лю б ая п р огр ам м а м ож ет ад р есоваться к лю б ом у участку п ам яти ком п ью тер а. В частн ости , л ю б ая п р огр ам м а м ож ет п р ед н ам ер ен н о и л и и з-за ош и бки р азруш и ть об л асти д ан н ы х, п р и н ад л еж ащ и е оп ер ац и о н н ой си стем е. В ы д ел и м д ва осн овн ы х н ед остатка схем ы ад р есац и и п ам яти р еал ьн ого р еж и м а:
огр ан и чен н ое ад р есн ое п р остр ан ство (д о 1 м егабай та п л ю с п ри м ерн о 64 ки л обай та старш ей об л асти п ам яти д л я п р оц ессор ов i80286, i80386 и i80486);
своб од н ы й д оступ д л я л ю б ы х п р огр ам м к л ю б ы м об л астям дан н ы х, что п р ед ставл яет п отен ц и ал ьн ую оп асн ость д л я ц ел остн ости оп ер ац и он н ой си стем ы .
Э ти х н ед остатков п ол н остью л и ш ен а схем а ад р есац и и п ам яти , которая и сп ол ьзуется в защ и щ ѐн н ом р еж и м е.
1 .2 . А д р есац и я п ам я ти в защ и щ ѐн н о м р е ж и м е О сн овн ая тр удн ость, с котор ой стал ки вается п р огр ам м и ст, и зучаю щ и й защ и щ ѐн н ы й р еж и м - это сл ож н ая схем а п р еобр азован и я ад р есов. П оэтом у м ы уд ел и м м н ого вн и м ан и я том у, как в этом р еж и м е п р ои сход и т ад р есац и я п ам яти . Д л я об л егчен и я восп р и яти я м ы вн ачал е о п усти м н екотор ы е д етал и , отл ож и в н а вр ем я и х п олн ое оп и сан и е.
П р ео б р азо в ан и е ад р есо в в защ и щ ѐн н о м р еж и м е В защ и щ ѐн н ом р еж и м е, такж е как и в р еал ьн ом , сущ ествую т п он яти я л оги ческого и ф и зи ческого ад реса. Л оги чески й ад рес в защ и щ ѐн н ом р еж и м е (и н огд а и сп ол ьзуется тер м и н "ви р туал ьн ы й адр ес") состои т и з д вух 16 р азр яд н ы х ком п он ен т - сел ектор а и см ещ ен и я. С ел ектор зап и сы вается в те ж е сегм ен тн ы е р еги стр ы , что и сегм ен тн ы й ад р ес в р еал ьн ом р еж и м е. О дн ако п р еобр азован и е л оги ческого адр еса в ф и зи чески й вы п ол н яется н е п р осты м сл ож ен и ем со сд ви гом , а п ри п ом ощ и сп ец и ал ьн ы х таб л и ц п реоб разован и я ад р есов. В п ер вом п р и б ли ж ен и и м ож н о счи тать, что д л я п р оц ессор а i80286 сел ектор явл яется и н д ексом в таб л и ц е, сод ер ж ащ ей базовы е 24 -р азр яд н ы е ф и зи чески е ад р еса сегм ен тов. В п р о ц ессе п р еоб р азован и я л оги ческого ад р еса в ф и зи чески й п р оц ессор п ри б авл яет к б азовом у 24 -р азр яд н ом у адр есу 16 -р азр яд н ое см ещ ен и е, т.е. втор ую ком п он ен ту л оги ческого ад р еса. Н а ри с.4 п оказан а си л ьн о уп рощ ѐн н ая схем а п р еоб р азован и я л оги ческого ад р еса в ф и зи ч ески й .
Р и с. 4. У п р ощ ѐн н ая схем а п р еоб р азован и я л оги ческого ад реса в ф и зи чески й в защ и щ ѐн н ом р еж и м е. Т акая схем а ф ор м и р ован и я ф и зи ческого ад реса п озвол яет н еп оср ед ствен н о ад ресовать 16 м егабай т п ам яти с п ом ощ ью 16 -р азр яд н ы х ком п он ен т л оги ческого ад р еса. Зам етьте, что сел ектор - это н е сегм ен тн ы й ад р ес. Э то и н д екс, с п ом ощ ью котор ого п р оц ессор и звл екает и з сп ец и ал ьн ой таб ли ц ы 24 -р азряд н ы й базовы й ад р ес сегм ен та. В р еал ьн ом реж и м е м ы и м еем д ел о с сегм ен тн ы м ад р есом и см ещ ен и ем , а в защ и щ ѐн н ом - с селектор ом и см ещ ен и ем . Н а сам ом д ел е н е все 16 б и т сел ектор а и сп ол ьзую тся д л я и н д ексац и и п о таб ли ц е б азовы х ад р есов. В качестве и н д екса вы ступ аю т стар ш и е 13 б и т. Д ва м лад ш и х б и та (би т 0 и би т 1) и сп ол ьзую тся си стем ой защ и ты п ам яти , о чѐм м ы п од р обн о п оговор и м в сл ед ую щ ем р азд еле. Б и т 2 п озвол яет вы б и рать д л я п р еоб р азован и я ад р еса од и н и з д вух ти п ов таб л и ц п реоб разован и я адр есов. П олн ы й ф ор м ат сел ектор а п оказан н а р и с. 5.
Р и с. 5. Ф ор м ат сел ектор а ад реса. Н а этом ри сун ке д ва м л адш и х б и та об озн ачен ы как R P L (R eq u ested P rivileg e Level). Э то п ол е явл яется зап р ош ен н ы м п р огр ам м ой уровн ем п ри ви леги й и его м ы б уд ем об суж дать п озж е. П ол е T I (T ab le Ind icator) состои т и з од н ого б и та. Е сл и этот б и т р авен н ул ю , д л я п р еоб р азован и я адр еса и сп ользуется так н азы ваем ая гл об ал ьн ая таб ли ц а д ескри п тор ов G D T (G lob al D escrip tor T ab le), в п р оти вн ом сл учае - л окал ьн ая таб л и ц а д ескр и п тор ов LD T (Local D escrip tor T ab le). Т аб л и ц а д ескр и п тор ов - это п р осто табл и ц а п р еоб р азован и я ад р есов, сод ер ж ащ ая б азовы е 24 -р азр ядн ы е ф и зи чески е ад р еса сегм ен тов и н екотор ую д р угую и н ф ор м ац и ю . Т о есть каж д ы й эл ем ен т таб ли ц ы д ескри п тор ов (д ескр и п тор) сод ерж и т 24 -р азр яд н ы й базовы й адр ес сегм ен та и д ругую и н ф ор м ац и ю , оп и сы ваю щ ую сегм ен т. Т аб л и ц а G D T - ед и н ствен н ая в си стем е. О б ы чн о в н ей н аход ятся оп и са н и я сегм ен тов оп ер ац и он н ой си стем ы . Т аб л и ц LD T м ож ет б ы ть м н ого. Э ти таб ли ц ы сод ер ж ат оп и сан и я сегм ен тов п р огр ам м , р аб отаю щ и х п од уп р авл ен и ем оп ер ац и он н ой си стем ы , т.е. отд ел ьн ы х зад ач. В каж д ы й д ан н ы й м ом ен т врем ен и п р оц ессор м ож ет и сп ол ьзовать тол ько од н у табл и ц у LD T .
П р оц ессор и м еет д ва реги стра, п р едн азн ачен н ы х д л я ад р есац и и и сп ол ьзуем ы х в н астоящ и й м ом ен т табл и ц G D T и LD T . Р еги стр G T D R оп и сы вает расп ол ож ен и е и разм ер таб ли ц ы G D T , а р еги стр LD T R сод ер ж и т ссы л ку н а и сп ол ьзую щ ую ся в н астоящ ее вр ем я таб ли ц у LD T . Н а р и с. 6 п оказан а уточн ѐн н ая схем а п р еоб разован и я адр есов в защ и щ ѐн н ом р еж и м е. И з р и сун ка ви дн о, что р еги стр ы п р оц ессор а G D T R и LD T R оп р ед ел яю т р асп ол ож ен и е в п ам яти табл и ц G D T и LD T соответствен н о. Т аб л и ц ы G D T и LD T сод ер ж ат д ескр и п тор ы , оп и сы ва ю щ и е сегм ен ты п ам яти . В эти х д ескри п тор ах, п ом и м о д р угой и н ф ор м ац и и (заш тр и хован н ая об л асть) сод ер ж и тся 24 -р азряд н ы й б азовы й ад р ес сегм ен та. С тар ш и е 13 б и тов сел ектор а (и н декс) вы би р аю т эл ем ен т и з таб л и ц ы G D T и ли LD T в зави си м ости от состоян и я б и та T I сел ектор а. И звл ечѐн н ы й и з табл и ц ы д ескр и п тор ов б азовы й ад р ес сегм ен та скл ад ы вается п р оц ессор ом д л я п ол учен и я 24 р азр яд н ого ф и зи ческого ад реса.
Р и с. 6. У точн ѐн н ая схем а п реоб р азован и я адр есов. С ел ектор 0000h ад р есует сам ы й п ер вы й д ескри п тор в гл обал ьн ой таб л и ц е д ескр и п тор ов G D T . П ол е R P L д л я этого д ескр и п тор а р авн о 0, п ол е T I такж е р авн о 0. С ел ектор 0008h указы вает н а втор ой эл ем ен т таб ли ц ы G D T , а сел ектор 0014h указы вает н а тр ети й д ескр и п тор в л окал ьн ой таб ли ц е д ескри п тор ов LD T , т.к. п ол е T I в н ѐм р авн о 1.
Д етал ьн о е о п и сан и е схем ы п р ео б р азо ван и я ад р есо в Т еп ер ь п ер ей д ѐм к б ол ее стр огом у оп и сан и ю схем ы п р еоб разован и я адр есов в защ и щ ѐн н ом р еж и м е. Р еги стр G D T R , указы ваю щ и й р асп ол ож ен и е в ф и зи ческой п ам яти и р азм ер гл об ал ьн ой таб ли ц ы д ескр и п тор ов G D T явл яется кл ю чевы м в схем е ад р есац и и защ и щ ѐн н ого реж и м а. Ф ор м ат р еги стра G D T R п р оц ессор а i80286 п р и вед ѐн н а р и с.7.
Р и с. 7. Ф ор м ат р еги стр а G D T R п р оц ессор а i80286. И з р и сун ка ви дн о, что р еги стр G D T R и м еет д ли н у 5 б ай т. С тар ш и е 3 бай та сод ерж ат 24 -р азр яд н ы й ф и зи чески й ад р ес таб ли ц ы G D T , м лад ш и е д ва бай та - д л и н у таб л и ц ы G D T , ум ен ьш ен н ую н а 1.
Д л и н а G D T , ум ен ьш ен н ая н а ед и н и ц у, н азы вается п р ед ел ом таб л и ц ы G D T (G D T lim it). О н а и сп ол ьзуется д л я п р оверки п р ави л ьн ости зад аваем ы х п р огр ам м ой сел ектор ов. П ол е и н д екса се л ектор а д ол ж н о сод ер ж ать ссы л ки тол ько н а сущ ествую щ и е эл ем ен ты таб ли ц ы G D T , в п р оти вн ом сл учае п р ои зой д ет п р еры ван и е. Зн ая р азм ер G D T , п р оц ессор б л оки р ует и сп ол ьзован и е сел ектор ов со зн ачен и ям и п ол я и н д екса, вы ход ящ ее за р ам ки разр еш ѐн н ы х д л я таб л и ц ы G D T . А н ал оги чн ы й м ехан и зм и сп ол ьзуется и дл я п р овер ки сел ектор ов, ссы лаю щ и хся н а LD T . П ер ед п ер еход ом в защ и щ ѐн н ы й р еж и м п р огр ам м а д ол ж н а созд ать в оп ерати вн ой п ам яти таб ли ц у G D T и загр узи ть р еги стр G D T R п р и п ом ощ и сп ец и ал ьн ой ком ан д ы LG D T (си н такси с тран сл ят ор а T u rb o A ssem b ler, р еж и м IDEAL):
lgdt
[QWORD gdt_ptr]
П ер ед вы д ачей ком ан д ы LG D T g d t_p tr н еоб ходи м о п од готови ть об ласть п ам яти с ад р есом g d t_p tr, зап и сав в н еѐ ф и зи чески й ад рес таб ли ц ы G D T и еѐ р азм ер , ум ен ьш ен н ы й н а 1 (п р едел ):
gdt_ptr dw base_lo dw base_hi dw
GDT_LIMIT ? ?
; предел таблицы GDT ; младшее слово базового адреса GDT ; старшее слово базового адреса GDT
Зам етьте, что н есм отр я н а то что р азм ер р еги стр а G D T R составл яет 5 б ай т, в качестве оп е р ан д а д л я ком ан д ы LG D T и сп ол ьзуется ад р ес обл асти п ам яти р азм ер ом 6 бай т. Зд есь н ет н и какой ош и б ки , п р оц ессор i80286 и сп ол ьзует тол ько 5 б ай т и з этой об л асти , так как ф и зи чески й ад р ес сод ерж и т 24 р азр яд а. П р оц ессор ы i80386 и i8048 6 в 3 2 -р азр яд н ом р еж и м е и сп ол ьзую т все 6 б ай тов, загр уж ая в 6 -б ай тн ы й р еги стр G D T R 32 -б и товы й ф и зи чески й ад рес таб ли ц ы G D T и еѐ 16 -б и товы й п р ед ел . О д н ако м ы ещ ѐ н е зн аем точн ую стр уктуру таб л и ц ы G D T . С н ачал а м ы п озн аком и м вас со стр уктур ой табл и ц ы G D T (и соответствен н о, с и д ен ти чн ой ей стр уктур ой таб ли ц ы LD T ), а затем н а п ри м ере ф р агм ен та п р огр ам м ы п окаж ем , как созд ать таб л и ц у G D T и загр узи ть р еги стр G D T R . К ак м ы уж е говор и ли , таб л и ц ы G D T и LD T п р ед ставл яю т соб ой м асси вы д ескри п тор ов - оп и сател ей сегм ен тов. К р ом е д ескр и п тор ов, оп и сы ваю щ и х сегм ен ты п ам яти , таб ли ц а G D T м ож ет сод ер ж ать сп ец и ал ьн ы е ти п ы д ескр и п тор ов - вен ти ли вы зова (call gate), зад ач (task gate) и л овуш ек (trap gate). В ен ти ли оп р ед ел яю т точки вход а в соответствую щ и е п р оц ед ур ы . Н ап ри м ер, вен ти л ь вы зова оп и сы вает ад р ес п од п р ограм м ы , вы зы ваем ой , н ап р и м ер, п о ком ан д е C A LL. П р и вы зове п одп р огр ам м ы чер ез вен ти л ь в качестве оп ер ан д а д л я ком ан д ы C A LL и сп ол ьзуется сел ектор , ад р есую щ и й соответствую щ и й д ескр и п тор в таб ли ц е G D T (и ли в таб ли ц е LD T ). Н а ри с. 8 п р и вед ѐн ф ор м ат дескр и п тор а сегм ен та д л я п р оц ессор а i80286:
Р и с. 8. Д ескри п тор сегм ен та дл я п р оц ессора i80286. Д л и н а д ескри п тор а составл яет 8 б ай т. О н состои т и з сл едую щ и х п олей :
п ол е б азового ад р еса д л и н ой 24 б и та сод ерж и т ф и зи чески й ад р ес сегм ен та, оп и сы ваем ого д ан н ы м д ескр и п тор ом ;
п ол е п р ед ел а сод ерж и т разм ер сегм ен та в б ай тах, ум ен ьш ен н ы й н а ед и н и ц у; п ол е д оступ а оп и сы вает ти п сегм ен та (сегм ен т код а, сегм ен т д ан н ы х и д р.); зар езерви р ован н ое п ол е д л и н ой 16 би т д л я п р оц ессор а i80286 д ол ж н о сод ерж ать н ул и , это п ол е
и сп ол ьзуется п р оц ессор ам и i80386 и i80486 (там , в частн ости , хр ан и тся стар ш и й б ай т 32 -р азр яд н ого б азового ад р еса сегм ен та).
В р еал ьн ом реж и м е н ачал о сегм ен та в п ам яти оп р ед ел яется сегм ен тн ы м ад р есом , д ли н а сегм ен та составл яет 64 ки л об ай та. В защ и щ ѐн н ом реж и м е м ож н о задавать сегм ен ты м ен ьш его разм ер а (п р оц ессор ы i8038 6 и i80 486 д оп ускаю т такж е сущ ествован и е сегм ен тов с р азм ер ом , зн ачи тел ьн о п р евы ш аю щ и м 64 ки л об ай та). П ри этом п р оц ессор автом ати чески отсл еж и вает п оп ы тки п р огр ам м ы об р ати ться за п р ед ел ы сегм ен та , зад ан н ы е в д ескр и п тор е. П р и обн ар уж ен и и такой п оп ы тки вы п ол н ен и е п р огр ам м ы п р еры вается.
О гр ан и чен и е р азм ер а сегм ен тов и кон тр ол ь за п оп ы ткам и ад р есац и и п ам яти вн е п р ед ел ов сегм ен тов си л ьн о п овы ш ает н ад ѐж н ость си стем ы . П р огр ам м а н е м ож ет разр уш и ть чуж и е сегм ен ты , в частн ости , сегм ен ты оп ер ац и он н ой си стем ы . П од р об н ее о защ и те м ы р асскаж ем в сл ед ую щ ем разд ел е. П ол е д оступ а, зан и м аю щ ее в д ескр и п тор е од и н б ай т (бай т д оступ а) сл уж и т д л я кл асси ф и кац и и д ескр и п тор ов. Н а р и с. 9 п ри вед ен ы ф ор м аты п ол я д оступ а д л я тр ѐх ти п ов д ескр и п тор ов - д ескр и п тор ов сегм ен тов код а, сегм ен тов д ан н ы х и си стем н ы х.
Р и с. 9. Ф ор м аты п ол я д оступ а д ескр и п тора. П ол е д оступ а д ескри п тор а сегм ен тов код а сод ер ж и т б и товое п ол е R , н азы ваем ое б и том р азр еш ен и я чтен и я сегм ен та. Е сл и этот б и т устан овл ен в 1, п р огр ам м а м ож ет счи ты вать сод ер ж и м ое сегм ен та код а. В п р оти вн ом сл учае п р оц ессор м ож ет тол ько вы п ол н ять этот код . П р огр ам м а не м ож ет м од и ф и ц и р овать сегм ен т код а. Э то озн ачает н евозм ож н ость созд ан и я сам ом од и ф и ц и р ую щ и хся п р огр ам м д л я защ и щ ѐн н ого р еж и м а (р асп р остр ан ѐн н ая, н о п ор очн ая п ракти ка ср еди п р огр ам м и стов, созд аю щ и х п р огр ам м ы д л я M S -D O S ). В п рочем , есть об ход н ой п уть. Д л я сегм ен та код а м ож н о созд ать ещ ѐ од и н , али асн ы й д ескр и п тор , в котор ом этот сегм ен т отм ечен как сегм ен т д ан н ы х. Е сл и д л я этого сегм ен та буд ет р азр еш ен а зап и сь, н и что, кр ом е зд р авого см ы сл а, н е п ом еш ает вам м од и ф и ц и р овать код п р огр ам м ы во вр ем я еѐ вы п олн ен и я. Б и т C н азы вается б и том п од чи н ен и я, он буд ет р ассм отр ен в сл ед ую щ ем разд ел е. Б и ты P и A п р едн азн ачен ы д л я ор ган и зац и и ви ртуал ьн ой п ам яти . И х н азн ачен и е б уд ет оп и сан о в р азд ел е, п освящ ѐн н ом ви р туал ьн ой п ам яти . С ей час отм ети м , что би т P н азы вается би том п р и сутстви я сегм ен та в п ам яти . Д л я тех сегм ен тов, котор ы е н аход ятся в ф и зи ческой п ам яти (м ы б уд ем и м еть д ело в осн овн ом с таки м и сегм ен там и ) этот би т д ол ж ен б ы ть устан овл ен в 1. Л ю б ая п оп ы тка п р огр ам м ы об р ати ться к сегм ен ту п ам яти , в д ескр и п тор е котор ого б и т P устан овл ен в 0, п р и вед ѐт к п р ер ы ван и ю . Б и т A н азы вается б и том обр ащ ен и я к сегм ен ту и д л я всех н аш и х п р огр ам м д ол ж ен б ы ть устан овлен в 0. П ол е д оступ а д ескр и п тор а сегм ен та д ан н ы х и м еет б и товы е п ол я W и D . П оле W н азы вается б и том р азр еш ен и я зап и си в сегм ен т. Е сл и этот б и т устан овл ен в 1, н ар яд у с чтен и ем возм ож н а и зап и сь в д ан н ы й сегм ен т. В п р оти вн ом сл учае п р и п оп ы тке чтен и я вы п ол н ен и е п р ограм м ы б уд ет п р ер ван о. П ол е D зад аѐт н ап р авл ен и е р асш и р ен и я сегм ен та. О б ы чн ы й сегм ен т д ан н ы х р асш и р яется в об л асть стар ш и х ад р есов (расш и р ен и е ввер х). Е сл и ж е в сегм ен те р асп ол ож ен стек, расш и р ен и е п р ои сход и т в обр атн ом н ап р авл ен и и - в об л асть м л ад ш и х ад р есов (р асш и р ен и е вн и з). Д л я сегм ен тов, в которы х ор ган и зую тся стеки , н еобход и м о устан авли вать п ол е D р авн ы м 1. Д ескр и п тор ы си стем н ы х сегм ен тов сод ерж ат п ол е T Y P E , оп р ед ел яю щ ее ти п си стем н ого сегм ен та. В таб л и ц е 1 п р и вед ен ы возм ож н ы е д л я этого п ол я зн ачен и я. Т аб л и ц а 1. Т и п ы си стем н ы х сегм ен тов. П ол е T Y P E
Т и п сегм ен та
0
Зап р ещ ѐн н ое зн ачен и е
1
Д оступ н ы й T S S д л я п р оц ессора i80286
2
С егм ен т LD T
3
Зан яты й T S S д л я п р оц ессор а i80286
4
В ен ти л ь вы зова д л я п р оц ессор а i80286
5
В ен ти л ь зад ачи д л я п р оц ессор ов i80286 и i80386
6
В ен ти л ь п р ер ы ван и я д л я п р оц ессор а i80286
7
В ен ти л ь и склю чен и я д л я п р оц ессор а i80286
8
Зап р ещ ѐн н ое зн ачен и е
9
Д оступ н ы й T S S д л я п р оц ессора i80386
A
Зар езер ви р ован о
B
Зан яты й T S S д л я п р оц ессор а i80386
C
В ен ти л ь вы зова д л я п р оц ессор а i80386
D
Зар езер ви р ован о
E
В ен ти л ь п р ер ы ван и я д л я п р оц ессор а i80386
F
В ен ти л ь л овуш ки д л я п р оц ессор а i80386
М ы н а вр ем я отл ож и м д етал ьн ое оп и сан и е всех ти п ов си стем н ы х д ескри п тор ов, так ж е как и п ол я D P L, и сп о л ьзую щ ееся д л я ор ган и зац и и защ и ты сегм ен тов, д л я того чтоб ы скон ц ен три р овать своѐ вн и м ан и е н а схем е п р еобр азован и я ад ресов в п роц ессор е i80286. И так, п ер ед п еревод ом п р оц ессор а в защ и щ ѐн н ы й р еж и м н ам н еоб ход и м о сф ор м и р овать в п ам яти таб ли ц у G D T и загр узи ть в р еги стр G T D R еѐ ад р ес и п ред ел п р и п ом ощ и ком ан д ы LG D T . В тер м и н ах язы ка ассем б л ер а стр уктур а д ескр и п тора м ож ет б ы ть оп и сан а сл ед ую щ и м об разом :
STRUC desc_struc limit dw base_lo dw base_hi db access db reserved ENDS
0 ; предел сегмента 0 ; младшее слово 24-битового ; физического адреса сегмента 0 ; старший байт 24-битового ; физического адреса сегмента 0 ; поле доступа dw 0 ; зарезервировано, для сегментов ; процессора i80286 должно быть ; равно нулю
desc_struc
Т огд а м ы м ож ем оп р ед ел и ть таб л и ц у G D T как н аб ор д ескри п тор ов со стр уктур ой d esc_stru c:
GDT_BEG LABEL
= $ ; отмечаем начало GDT gdtadr
WORD
gdt_0 desc_struc <0,0,0,0,0> ;первый элемент не используется gdt_gdt desc_struc
gdt_ds desc_struc gdt_cs desc_struc gdt_ss desc_struc <STACK_SIZE-1,,,DATA_ACC,0> GDT_SIZE
= ($ - GDT_BEG) ; вычисляем размер GDT
В этом п р и м ер е сам ы й п ер вы й д ескри п тор и н и ц и али зи руется н ул ям и . Т ак д ел ается всегд а. С ам ы й п ервы й д ескр и п тор в таб ли ц ах G D T и LD T н и когд а н е и сп ол ьзуется. П р ограм м а м ож ет загр узи ть в сегм ен тн ы й реги стр сел ектор , соответствую щ и й п ер вом у д ескри п тор у (п ол е и н д екса в таком сел ектор е р авн о н ул ю ), од н ако п ри п оп ы тке и сп ол ьзовать такой сел ектор п р ои зо й д ѐт п р ер ы ван и е р аб оты п р ограм м ы . С електор с н ул евы м п ол ем и н д екса (п устой сел ектор) загр уж ается оп ер ац и он н ой си стем ой в н еи н и ц и ал и зи р ован н ы е сегм ен тн ы е р еги стр ы п ер ед п еред ачей уп р авл ен и я зап ущ ен н ой п р огр ам м е.
В тор ой д ескри п тор оп и сы вает сам у таб ли ц у G D T , в п оле п р ед ел а стои т зн ачен и е G D T _S IZ E -1. Э то п р ед ел таб ли ц ы G D T . В п ол е д оступ а стои т зн ачен и е, соответствую щ ее сегм ен ту д ан н ы х. С л ед ую щ и е три д ескри п тор а оп и сы ваю т сегм ен ты , ад р есуем ы е р еги страм и d s, cs и ss соответствен н о (сегм ен ты д ан н ы х, код а и стека). В н и х зап олн ен ы п ол я п р ед ел а и д оступ а. Э ти п ол я м огут б ы ть оп р ед ел ен ы , н ап ри м ер , сл ед ую щ и м об разом :
CODE_ACC DATA_ACC
equ equ
10011000b 10010000b
В н аш ем п р и м ер е м ы зап олн и ли н е все п ол я д ескр и п тор ов в таб ли ц е G D T . О стали сь н езап олн ен н ы м и п ол я b ase_lo и b ase_h i, т.е. ф и зи чески й ад р ес сегм ен та д ан н ы х. Ф и зи чески й ад рес сегм ен та д ан н ы х д ол ж ен б ы ть вы чи сл ен в р еал ьн ом р еж и м е н а осн ован и и зн ачен и й сегм ен тн ого адр еса и см ещ ен и я, т.е. н а осн ован и и д вух ком п он ен т л оги ческого ад р еса реа л ьн ого р еж и м а. М ож н о п р ед л ож и ть след ую щ ую п р оц ед ур у д л я вы чи сл ен и я ф и зи ческого ад р еса (н а п р и м ер е вы чи сл ен и я ф и зи ческого ад р еса таб ли ц ы G D T ) и зап и си вы чи сл ен н ого ад р еса в д ескр и п тор :
; Загружаем в ax адрес сегмента данных DGROUP mov
ax,DGROUP
; Формируем в dl:ax физический адрес, соответствующий ; сегментному адресу DGROUP mov shr shl
dl,ah dl,4 ax,4
; Складываем со смещением add adc
ax,OFFSET gdtadr dl,0
; Записываем физический адрес GDT в элемент GDT, ; описывающий саму GDT mov mov mov
bx,OFFSET gdt_gdt [(desc_struc bx).base_l],ax [(desc_struc bx).base_h],dl
А н ал оги чн о зап олн яю тся и д руги е эл ем ен ты таб ли ц ы G D T . Т ак как д ескр и п тор с ад р е сом g d t_g d t оп и сы вает сам у табл и ц у G D T (и ф ор м ат этого д ескр и п тор а п од ход и т д л я ком ан д ы LG D T ), его м ож н о и сп ол ьзовать д л я загрузки р еги стр а G D T R :
lgdt
[QWORD gdt_gdt]
Е сл и вы созд аѐте п р огр ам м у н а язы ке С и , гл об ал ьн ая таб л и ц а д ескри п тор ов G D T м ож ет б ы т ь оп ред ел ен а с п ом ощ ью ти п а d escrip tor сл едую щ и м об разом :
descriptor gdt[5]; В этом п ри м ер е созд аѐтся табл и ц а G D T , сод ерж ащ ая п ять д ескр и п тор ов. Т и п descriptor оп р ед ел яется так:
typedef struct descriptor { word limit; word base_lo; unsigned char base_hi; unsigned char access; unsigned reserved;
} descriptor; И н и ц и ал и зац и ю д ескр и п тор ов в таб л и ц е G D T м ож н о вы п олн и ть, н ап р и м ер , с п ом ощ ью сл ед ую щ ей ф ун кц и и :
void init_gdt_descriptor(descriptor *descr, // указатель // на инициализируемый // дескриптор unsigned long base, // базовый адрес сегмента word limit, // предел сегмента unsigned char acc_byte) // поле доступа { descr->base_lo descr->base_hi descr->access descr->limit descr->reserved
= = = = =
(word)base; (unsigned char)(base >> 16); acc_byte; limit; 0;
} П р и вед ѐм п р и м ер и сп ол ьзован и я этой ф ун кц и и д л я зап и си в тр ети й п о счѐту эл ем ен т G D T и н ф ор м ац и и о сегм ен те д ан н ы х с сегм ен тн ы м ад р есом _D S и п р ед ел ом 0xffff:
init_gdt_descriptor(&gdt[2], MK_LIN_ADDR(_DS, 0), 0xffffL, TYPE_DATA_DESCR | SEG_PRESENT_BIT | SEG_WRITABLE); П р еобр азовать л оги чески й адр ес р еал ьн ого р еж и м а (сегм ен т:см ещ ен и е) в ф и зи чески й ад р ес м ож н о с п ом ощ ью сл ед ую щ ей м акр оком ан ды :
#define MK_LIN_ADDR(seg,off) (((unsigned long)(seg))<<4)+(word)(off) Д л я ф ор м и р ован и я п ол я д оступ а в н аш ем п р и м ер е и сп ол ьзую тся таки е оп р ед ел ен и я:
#define #define #define #define #define
TYPE_CODE_DESCR TYPE_DATA_DESCR SEG_WRITABLE SEG_READABLE SEG_PRESENT_BIT
0x18 0x10 0x02 0x02 0x80
К сож ал ен и ю , встр оен н ы й в B orlan d C 3.0 Inline-ассем б л ер н е п озвол яет и сп ол ьзовать ком ан д у LG D T в п р огр ам м е, составл ен н ой н а язы ке С и . А н ал оги чн ое огран и чен и е и м еется и в M icrosoft Q u ick C . П оэтом у д л я загр узки этого и н екотор ы х д р уги х р еги стр ов п р и ход и тся и сп ол ьзовать отд ел ьн ы е м од ул и , составл ен н ы е п ол н остью н а язы ке ассем б л ер а. В отл и чи е от реги стр а G D T R , р еги стр LD T R и м еет тол ько 16 р азр яд ов. О н сод ерж и т н е ад р ес и разм ер таб л и ц ы LD T , а сел ектор д ескри п тор а, оп и сы ваю щ его таб л и ц у LD T . Э то си стем н ы й д ескр и п тор , котор ы й д олж ен н аход и ться в таб ли ц е G D T и и м еть в п ол е T Y P E зн ачен и е 2. Д ескр и п тор сегм ен та LD T сод ер ж и т б азовы й ад р ес и п р ед ел таб л и ц ы LD T . М ы уж е говори л и , что п р остей ш и е си стем ы защ и щ ѐн н ого реж и м а м огут н е и сп ол ьзовать таб ли ц у LD T вовсе. В се п р и вед ѐн н ы е в этой кн и ге п р и м ер ы п р огр ам м п ол ьзую тся тол ько G D T . П р акти ческая п ол ьза от п ри м ен ен и я таб ли ц LD T п оявл яется только в м ул ьти зад ачн ы х си стем ах. В этом сл учае н азн ачен и е каж д ой зад аче соб ствен н ой LD T п озвол яет п ол н остью и золи р овать ад р есн ы е п р остр ан ства отд ел ьн ы х зад ач. Н о об этом м ы б уд ем говор и ть в разд ел е кн и ги , п освящ ѐн н ом м ул ьти зад ачн ости . П од вед ѐм и тоги .
В ы узн али , что в защ и щ ѐн н ом р еж и м е п ри м ен ен а н овая схем а п р еоб разован и я л оги ческого ад р еса в
ф и зи чески й , си л ьн о отли чаю щ аяся от и сп ол ьзуем ой в р еальн ом реж и м е. Э та схем а д аѐт, в ча стн ости , возм ож н ость адр есовать н еп оср ед ствен н о д о 16 м егаб ай т ф и зи ческой п ам яти .
Д л я п р еоб р азован и я ад р еса п р оц ессор i80286 и сп ол ьзует таб л и ц ы д ескри п тор ов, в которы х хр ан ятся б азовы е ад р еса сегм ен тов, р азм ер ы сегм ен тов и др угая и н ф ор м ац и я.
О д н овр ем ен н о п р оц ессор м ож ет и сп ол ьзовать д ве таб л и ц ы д ескр и п тор ов - л окал ьн ую (LD T ) и гл об ал ьн ую (G D T ). И сп ол ьзуем ая таб ли ц а оп р ед ел яется п ол ем T I сел ектор а.
Р асп ол ож ен и е и р азм ер таб ли ц ы G D T д олж н ы бы ть загруж ен ы в сп ец и ал ьн ы й р еги стр п роц ессор а G D T R . Э то м ож н о сд ел ать ком ан д ой LG D T .
В таб ли ц е G D T м огут н аход и ться д ескр и п торы сегм ен тов код а, д ан н ы х и си стем н ы е д ескри п тор ы . В
частн ости , там м ож ет н аход и ться д ескр и п тор, оп и сы ваю щ и й таб ли ц у л окал ьн ы х д ескр и п тор ов LD T (есл и эта таб ли ц а и сп ол ьзуется). П ер ед п ер екл ю чен и ем в защ и щ ѐн н ы й р еж и м п р огр ам м а д ол ж н а п од готови ть таб л и ц у G D T и загрузи ть еѐ ад р ес в р еги стр G D T R .
1 .3 . З ащ и та в п р о ц ессо р е i8 0 2 8 6 М ы уж е говори л и вам , что оп ер ац и он н ая си стем а M S -D O S , и сп ол ьзую щ ая р еал ьн ы й р еж и м р аб оты п р оц ессор а, н е защ и щ ен а от п р и кл ад н ы х п р огр ам м . П од си стем а уп р авл ен и я п ам ятью M S -D O S осн ован а н а разби ен и и всей п ам яти н а участки , в н ачал е котор ы х п ом ещ аю тся б л оки уп р авлен и я п ам ятью M C B (M em ory C on trol B lock). П р и зап уске п р ограм м ы M S -D O S вы д ел яет ей н еоб ход и м ое кол и чество б л оков и загр уж ает соответствую щ и м обр азом сегм ен тн ы е р еги стр ы . Е сл и п р ограм м а н е и зм ен яет сод ер ж и м ое сегм ен тн ы х реги стр ов, он а б уд ет р аб отать тол ько с тем и сегм ен там и п ам яти , котор ы е вы д елен ы ей оп ер ац и он н ой си стем ой . О д н ако н и что н е м ож ет п ом еш ать л ю б ой п р огр ам м е загр узи ть в сегм ен тн ы е р еги стр ы лю б ое зн ачен и е, в том чи сл е ад р еса сегм ен тов сам ой оп ер ац и он н ой си стем ы . П оэтом у, стр ого говор я, M S -D O S н е и м еет скол ько -н и буд ь н ад ѐж н ого м ехан и зм а уп равл ен и я п ам ятью - всѐ осн ован о н а вы п олн ен и и п р огр ам м ам и "дж ен тл ьм ен ского согл аш ен и я" о н ер азруш ен и и оп ер ац и он н ой си стем ы . Д л я п овы ш ен и я н ад ѐж н ости р аб оты всей си стем ы в ц ел ом н еоб ход и м о зап р ети ть об ы чн ы м п ол ьзовател ьски м п р огр ам м ам м оди ф и ц и р овать об л асти п ам яти , п ри н ад леж ащ и е оп ер ац и он н ой си стем е. Е сл и си стем а р аб отает од н овр ем ен н о с н ескол ьки м и п ол ьзователям и (м ул ьти п ол ьзовател ьская оп ер ац и он н ая си стем а), н еобход и м о такж е закр ы ть п р огр ам м ам п ол ьзовател я д оступ к п ам яти , расп р ед ел ѐн н ой д руги м п ол ьзовател ям . И н аче говор я, н еобход и м о р азд ел и ть ад р есн ы е п р остр ан ства оп ер ац и он н ой си стем ы от п ол ьзовательски х п р огр ам м с одн ой стор он ы , и ад р есн ы е п р остр ан ства отд ел ьн ы х п ол ьзователей д р уг от д р уга с д р угой сторон ы . Т аки е оп ер ац и он н ы е си стем ы , как W IN D O W S и O S /2, явл яю тся од н оп ол ьзовател ьски м и , н о м н огозадачн ы м и си стем ам и . П ол ьзовател ь м ож ет зап усти ть од н овр ем ен н о н ескол ько п р огр ам м . В этом сл учае б ы л о б ы ж ел ател ьн о р азд ели ть ад р есн ы е п р остр ан ства эти х п р огр ам м с ц ел ью и скл ю чен и я и х вл и ян и я д р уг н а д р уга (и , р азум еется, н а оп ер ац и он н ую си стем у). А вар и й н ое завер ш ен и е од н ой зап ущ ен н ой зад ачи н е д ол ж н о вы зы вать авари й н ого завер ш ен и я остальн ы х зад ач и ли , тем б ол ее, всей оп ер ац и он н ой си стем ы . К р ом е того, н еобход и м о р азреш и ть м од ул ям оп ерац и он н ой си стем ы д оступ к п ам яти всех зап ущ ен н ы х п р огр ам м д л я вы п ол н ен и я эф ф екти вн ого уп равл ен и я р аб отой в сей си стем ы . О тсю д а с од н ой стор он ы , вы текает и д ея н ад ел ен и я п р ограм м оп ерац и он н ой си стем ы н екотор ы м и п р и ви л еги ям и п о ср авн ен и ю с п ол ьзовател ьски м и п р огр ам м ам и , с д р угой стор он ы - и д ея н ад ел ен и я отдел ьн ы х участков п ам яти ср ед ствам и защ и ты от д оступ а к н и м со стор он ы н еп р и ви л еги р ован н ы х п р огр ам м . М н оги е м и н и -Э В М и б ол ьш и е Э В М р еал и зую т схем у "суп ер ви зор -п ол ьзовател ь". О п ер ац и он н ая си стем а р аб отает в р еж и м е "суп ерви зор " и ей д оступ н ы все р есур сы ком п ью тер а - вся п ам ять, л ю б ы е ком ан д ы п р оц ессор а и т.д . Зап ущ ен н ы е п р огр ам м ы р аб отаю т в р еж и м е "п ол ьзователь" и и м ею т д оступ тол ько к тем участкам п ам яти , котор ы е вы д елен ы и м оп ерац и он н ой си стем ой . К р ом е того, эти п р огр ам м ы огр ан и чен ы в и сп ол ьзован и и н екоторы х ком ан д п р оц ессор а (н ап р и м ер , ком ан д ввод а/вы вод а). Д л я п р ед отвр ащ ен и я д оступ а п р ограм м ам , р аб отаю щ и м в р еж и м е "п ол ьзовател ь" к чуж и м б л окам п ам яти и сп ол ьзую тся так н азы ваем ы е "кл ю чи " (это п р осто ц ел ы е чи сл а). О тд ел ьн ы м б л окам п ам яти оп ер ац и он н ая си стем а н азн ачает свои "кл ю чи ". К р ом е того, зап ущ ен н ы е п р огр ам м ы такж е сн аб ж аю тся "кл ю чам и ". П р огр ам м а м ож ет и м еть д оступ тол ько к таки м б л окам п ам яти , к котор ы м п од ход и т "кл ю ч", и м ею щ и й ся в р асп ор яж ен и и п р огр ам м ы . Т акая схем а н е об есп ечи вает п ол н ого и зол и р ован и я ад р есн ы х п р остр ан ств отд ельн ы х зад ач. А д р есн ое п р остр ан ство зд есь од н о, н о д л я об ы чн ы х п р огр ам м разр еш ѐн д оступ тол ько к своем у участку п ам яти в соответстви и с и м ею щ и м ся клю чом . О д н ако в си стем е м ож ет р аб отать н ескол ько п р ограм м с од и н аковы м кл ю чом п ам яти !
К о л ьц а защ и ты П р оц ессор i80286 и сп ол ьзует б ол ее ги б кую и н ад ѐж н ую схем у защ и ты оп ер ац и он н ой си стем ы и п р ограм м д р уг от д р уга. В этой схем е и сп ол ьзую тся п р и ви л еги и четы р ѐх ур овн ей - от 0 д о 3. С ам ы е б ол ьш и е п р и ви л еги и соответствую т ур овн ю 0. О б ы чн о таки м и п р и ви л еги ям и об лад ает яд р о оп ер ац и он н ой си стем ы . М и н и м ал ьн ы е п ри ви л еги и у п ол ьзовател ьски х п р ограм м - ур овен ь 3. У р овн и п ри ви л еги й часто н азы ваю т кол ьц ам и защ и ты (см . р и с. 10).
Р и с. 10. К ол ьц а защ и ты . К ак р асп р ед ел и ть п ри ви л еги и п р огр ам м в оп ер ац и он н ой си стем е? М ож н о и сп ол ьзовать, н ап ри м ер , такое р асп р ед ел ен и е:
К ол ьц о 0 - яд р о оп ерац и он н ой си стем ы , си стем н ы е д р ай вер ы . К ол ьц о 1 - п р огр ам м ы об служ и ван и я ап п аратур ы , др ай вер ы , п р огр ам м ы , р аб отаю щ и е с п ор там и ввод а/вы вод а ком п ью тера. К ол ьц о 2 - си стем ы уп равл ен и я б азам и д ан н ы х, р асш и рен и я оп ерац и он н ой си сте м ы . К ол ьц о 3 - п р и клад н ы е п р огр ам м ы , зап ускаем ы е п ол ьзовател ем .
Н есл ож н ы е си стем ы м огут и сп ол ьзовать н е все кол ьц а, а тол ько н екотор ы е и ли д аж е од н о. Н ап р и м ер , м ож н о р асп ол ож и ть все п р огр ам м ы оп ер ац и он н ой си стем ы в кол ьц е 0, а п ол ьзовател ьски е п р ограм м ы - в кол ьц е 3. Э то вар и ан т оп и сан н ой вы ш е схем ы "суп ер ви зор -п ол ьзовател ь". П р остей ш и е си стем ы м ож н о п ол н остью р еал и зовать в н ул евом кол ьц е. И м ен н о так м ы и сд елал и в п ри м ер ах п р огр ам м , п ри вед ѐн н ы х в этой кн и ге. К ак п ракти чески и сп ол ьзую тся кол ьц а защ и ты ? В сп ом н и м , что л ю б ой сел ектор и м еет п оле R P L (би ты 0 и 1). В реги стр е C S хран и тся сел ектор текущ его вы п олн яем ого сегм ен та код а. Э том у сел ектору соответствует д ескр и п тор в таб ли ц е G D T и л и LD T . В д ескр и п тор е, в бай те д оступ а р асп ол агается п ол е D PL (би ты 5 и 6). У казан н ы е п ол я участвую т в м ехан и зм е защ и ты п ам яти . К огд а оп ер ац и он н ая си стем а п од готавл и вает п р огр ам м у д ля зап уска, он а ф ор м и р ует в G D T и л и LD T д ескр и п тор, оп и сы ваю щ и й сегм ен т код а п р огр ам м ы . В этом д ескр и п тор е в п ол е D P L бай та д оступ а п р оставл яется н ом ер кол ьц а, в котор ом б удет р аб отать д ан н ая п р огр ам м а - текущ и й ур овен ь п ри ви л еги й C P L (C u rren t P rivileg e Level). Т о есть возм ож н ости п р огр ам м ы оп ред ел яю тся сод ер ж и м ы м п ол я D PL в бай те д оступ а. Т екущ и й ур овен ь п р и ви л еги й коп и р уется в п оле R P L селектор а сегм ен та код а, загр уж ен н ого в р еги стре C S . П р огр ам м а всегд а м ож ет п р оан али зи р овать свой текущ и й ур овен ь п ри ви л еги й и сход я и з зн ачен и я п ол е R P L в р еги стр е C S . О дн ако он а н е м ож ет и зм ен и ть свой ур овен ь п р и ви л еги й п р остой зам ен ой сод ер ж и м ого п ол я R P L в сегм ен те C S . И так, п р огр ам м а п ол учает от оп ер ац и он н ой си стем ы текущ и й ур овен ь п ри ви л еги й C P L, котор ы й он а м ож ет п р оан ал и зи р овать н а осн ован и и сод ер ж и м ого реги стр а C S .
Д ескр и п тор ы , оп и сы ваю щ и е сегм ен ты д ан н ы х, сод ерж ат п ол е ур овн я п ри ви л еги й д ескр и п тор а D P L (D e scriptor P rivileg e Level). П оле D P L сод ер ж и т м и н и м ал ьн ы е п ри ви л еги и , котор ы е н уж н ы д л я д оступ а к сегм ен ту д ан н ы х. П ер ед тем , как об р ати ться к сегм ен ту д ан н ы х, п р ограм м а д ол ж н а загр узи ть в оди н и з сегм ен тн ы х р еги стр ов сел ектор , соответствую щ и й н уж н ом у сегм ен ту д ан н ы х. В сел ектор е н еоб ходи м о указать п ол е ур овн я зап р аш и ваем ы х п р и ви л еги й R P L (R eq u ested P rivileg e Level). П р огр ам м е б уд ет п р ед оставлен д оступ к сегм ен ту тол ько в том сл учае, когд а ур овен ь п р и ви л еги й д ескри п тор а зап р аш и ваем ого сегм ен та D P L б ол ьш е и ли р авен зн ачен и ю m ax(C PL,R P L), т.е. н аи б ол ьш ем у и з зн ачен и й текущ его ур овн я п р и ви л еги й C P L и ур овн я зап р аш и ваем ы х п р и ви л еги й R P L:
DPL >= max(CPL,RPL) Е сл и п р ограм м а п оп ы тается п ол учи ть д оступ к б ол ее п ри ви л еги р ован н ом у, чем он а сам а сегм ен ту п ам яти , еѐ вы п олн ен и е б уд ет п р ер ван о. В н аш и х п р и м ер ах, р еали зован н ы х д л я п р остоты DPL=CPL=RPL=0.
в кол ьц е 0, все ур овн и п р и ви л еги й равн ы
0, т.е.
Т и п сегм ен то в П ол е T Y P E д ескр и п тора оп р ед ел яет сп особ , котор ы м м ож н о и сп ол ьзовать тот и л и и н ой сегм ен т. Р азд ел ен и е сегм ен тов н а ти п ы п озвол яет защ и ти ться от сл учай н ого и л и п ред н ам ер ен н ого и сп ол ьзован и я сегм ен тов н е п о н азн ачен и ю . С егм ен т код а м ож ет б ы ть закр ы т д л я чтен и я устан овкой би та R в б ай те д оступ а. Т аки е сегм ен ты м ож н о только вы п олн ять, н о н ел ьзя чи тать. В сегм ен т код а н ел ьзя зап и сы вать каки е -ли б о д ан н ы е. В р еги стр C S м ож н о загр уж ать тол ько таки е сел ектор ы , которы е отн осятся к сегм ен там код а. С егм ен ты дан н ы х м огут б ы ть закр ы ты д л я зап и си устан овкой б и та W в б ай те д оступ а. С егм ен ту д ан н ы х н ел ьзя п ер ед ать уп р авл ен и е, загр узи в его сел ектор в р еги стр C S . Д ескр и п тор ы н екотор ы х ти п ов, н ап р и м ер , оп и сы ваю щ и х р асп ол ож ен и е таб ли ц ы LD T и л и сегм ен та состоян и я зад ачи , о котор ом м ы буд ем говор и ть п озж е, н ел ьзя и сп ользовать д л я чтен и я и л и зап и си , д аж е есл и п р ограм м а вы п олн яется в н ул евом п р и ор и тетн ом кол ьц е. В сл учае такой н еобход и м ости сл ед ует созд ать д оп олн и тел ьн ы е (ал и асн ы е) д ескр и п тор ы , в котор ы х эти ж е сегм ен ты оп и сан ы как сегм ен ты дан н ы х.
Гр ан и ц ы сегм ен то в П р огр ам м ы реал ьн ого р еж и м а р аб отаю т всегд а с сегм ен там и р азм ер ом 64 к и л об ай та. Е сл и п р огр ам м а состои т и з н ескол ьки х сегм ен тов, то н екотор ы е сегм ен ты м огут п ер екр ы ваться. С ущ ествует п отен ц и ал ьн ая оп асн ость, что в р езул ьтате п р огр ам м н ой ош и б ки (н ап ри м ер , вы ход а и н д екса м асси ва за д оп усти м ы е п р ед ел ы ) п р ои зой д ѐт зап и сь в д р угой сегм ен т. П р оц ессор i80286 п озвол яет созд авать сегм ен ты л ю б ого р азм ер а в п р ед ел ах 64 ки л об ай т (п р оц ессор ы i80386 и i8048 6 м огут р аб отать с сегм ен там и р азм ер ом 4 ги габ ай та). К р ом е того, он сл ед и т за тем , чтоб ы п ри ад р есац и и п ам яти н е п р ои сход и л вы ход за гр ан и ц ы сегм ен та. Гр ан и ц ы сегм ен та зад аю тся п ол ем п р ед ел а в д ескр и п тор е сегм ен та. М ы уж е говор и ли , что зн ачен и е этого п ол я д ол ж н о б ы ть равн о р азм ер у сегм ен та в б ай тах м и н ус ед и н и ц а. И н терп р етац и я п ол я п р ед ел а зави си т от состоян и я б и та D п ол я д оступ а. Д л я сегм ен тов стеков н еоб ходи м о устан авл и вать п ол е D р авн ы м 1. В этом сл учае п оп ы тка зап и си в п ер еп ол н ен н ы й стек вы зовет п р ер ы ван и е п р огр ам м ы . В ответ н а это п р ер ы ван и е оп ер ац и он н ая си стем а м ож ет, н ап р и м ер , вы д ел и ть д оп олн и тел ьн ую п ам ять д л я стека. В р еал ьн ом р еж и м е п ер еп олн ен и е стека н и как н е кон трол и р уется и м ож ет п р и вести к р азр уш ен и ю сам ой п р огр ам м ы и л и оп ер ац и он н ой си стем ы .
П р и ви л еги р о ван н ы е и ч ув ств и тел ьн ы е ко м ан д ы
Д л я об есп ечен и я н ад ѐж н ости р аб оты оп ерац и он н ой си стем ы н еобход и м о огран и чи ть и сп ол ьзован и е об ы чн ы м и п р огр ам м ам и н екоторы х ком ан д п р оц ессор а. Н ап ри м ер , об ы чн ы е п р огр ам м ы н е д ол ж н ы и м еть д оступ а к ком ан д ам загр узки си стем н ы х р еги стр ов G D T R и LD T R . В таб л и ц е 2 п ри вед ѐн сп и сок п р и вел и гер ован н ы х ком ан д , которы е м огут вы п ол н яться тол ько в н ул евом п р и ори тетн ом кол ьц е, т.е. только тем и п р ограм м ам и , которы е и м ею т н аи б ол ьш и е п р и ви леги и (C PL= 0). Т аб л и ц а 2. П ри ви л еги р ован н ы е ком ан д ы п р оц ессор а i8028 6. К ом ан д а
В ы п ол н яем ы е ф ун кц и и
LGDT
Загр узка р еги стр а гл об ал ьн ой таб л и ц ы д ескри п тор ов G D T R
LLDT
Загр узка р еги стр а л окал ьн ой таб ли ц ы д ескр и п тор ов LD T R
LIDT
Загр узка р еги стр а таб ли ц ы д ескр и п тор ов п рер ы ван и й ID T R
LTR
Загр узка р еги стр а зад ачи T R
LMSW
Загр узка сл ова состоян и я м аш и н ы M S W
CLTS
С б р ос ф лага п ерекл ю чен и я зад ачи
HLT
О стан ов п р оц ессор а
В это й таб л и ц е вам зн аком ы тол ько ком ан д ы LG D T и LLD T , остал ьн ы е ком ан д ы м ы р азб ер ѐм п озж е, п о м ер е и зучен и я р азл и чн ы х возм ож н остей п р оц ессор а i80286, таки х как обр аб отка п р ер ы ван и й в защ и щ ѐн н ом р еж и м е и м ул ьти зад ачн ость. С ущ ествую т ком ан д ы , которы е д ол ж н ы вы п олн яться н е тол ько в н улевом кол ьц е, н о и сп ол ьзован и е котор ы х д ол ж н о б ы ть зап р ещ ен о д л я п р огр ам м , и м ею щ и х ур овен ь п р и ви л еги й н и ж е н екотор ого, зад ан н ого д л я всей си стем ы в ц ел ом . К р ом е того, ф ун кц и и н екотор ы х ком ан д бы л о б ы ж елател ьн о м од и ф и ц и р овать в соотв етстви и с п р и ви л еги ям и вы п олн яю щ ей и х п р огр ам м ы . Т аки е ком ан д ы н азы ваю тся чувстви тел ьн ы м и . К р ом е п р и ви л еги р ован н ы х ком ан д , н еоб ход и м о огр ан и чи ть об ы чн ы е п р огр ам м ы в и сп ол ьзован и и ком ан д ввод а/вы вод а: IN , O U T , IN S , O U T S . С п ом ощ ью эти х ком ан д п р огр ам м а м ож ет, н ап ри м ер , п ер еп р огр ам м и р овать кон тр ол лер ы п рер ы ван и й и п р ям ого д оступ а к п ам яти , что в свою очер ед ь откр оет п уть к н еп оср ед ствен н ой м од и ф и кац и и п ам яти п о ф и зи чески м адр есам . Т акж е н е сл ед ует р азр еш ать об ы чн ы м п р огр ам м ам и сп ол ьзовать ком ан д ы , котор ы е м огут заб л оки р овать п р ер ы ван и я: C LI, S T I, LO C K . В м ул ьти зад ачн ой сред е об ы чн ы е п р огр ам м ы н е д ол ж н ы и м еть возм ож н ость откл ю чать м ехан и зм р азд елен и я вр ем ен и м еж д у зад ачам и . Р еги стр FLA G S ф л агов п р оц ессор а i80286 в р азр яд ах 12 -13 сод ер ж и т двухб и товое п ол е IO P L (Input/Output P rivileg e Level). Э то п ол е оп ред ел яет н аи м ен ее п р и ви л еги р ован н ое кол ьц о, в котор ом р азр еш ен о и сп ол ьзовать ком ан д ы ввод а/вы вод а. П р огр ам м ы , р аб отаю щ и е н е в н ул евом кол ьц е, н е м огут сам и м од и ф и ц и р овать п ол е IO P L р еги стр а FLA G S . П р и вы п олн ен и и ком ан д , загр уж аю щ и х р еги стр ф л аж ков (IR E T и P O PF) н е в н ул евом кол ьц е, п ол е IO P L н е м од и ф и ц и р уется. А н ал оги чн о, б ез и зм ен ен и я остаѐтся ф л аг р азреш ен и я п р еры ван и й IF.
М еж сегм ен тн ая п ер ед ач а уп р авл ен и я В р еал ьн ом р еж и м е п ер ед ача уп р авл ен и я вы п ол н яется с п ом ощ ью ком ан д JM P , C A LL, IN T , R E T , IR E T , а такж е п р и возн и кн овен и и п р еры ван и й . В н утри сегм ен тн ая п ер ед ача уп р авлен и я вы п ол н яется ком ан д ам и JM P , C A LL, R E T , а м еж сегм ен тн ая п еред ача уп р авл ен и я - ком ан д ам и JM P , C A LL, IN T , R E T , IR E T и в сл учае возн и кн овен и я п р ер ы ван и й . В защ и щ ѐн н ом р еж и м е всѐ п р ои сход и т ан ал оги чн о. П ри вн утри сегм ен тн ой п ер ед аче уп р авлен и я в р еги стр IP зан оси тся н овое зн ачен и е, а р еги стр C S н е м оди ф и ц и р уется. М еж сегм ен тн ая п ер ед ача п од р азум евает
од н овр ем ен н ое и зм ен ен и е реги стр ов C S и IP, а такж е в н екотор ы х случаях и реги стра ф лагов FLA G S (п р ер ы ван и я и ком ан д ы R E T , IR E T ). О п ер ац и он н ая си стем а M S -D O S , р аб отаю щ ая в р еал ьн ом р еж и м е, п озвол яет л ю б ой п рогр ам м е вы зы вать л ю б ы е п од п р ограм м ы . Е д и н ствен н ое усл ови е д л я усп еш н ого вы зова п одп р огр ам м ы - зн ан и е ад р еса п одп р ограм м ы (сегм ен та и см ещ ен и я) и ф орм ата п еред аваем ы х р еги стр ов. П р и п р оекти р ован и и защ и щ ѐн н ы х си стем н еобход и м о п ред отвр ати ть возм ож н ость н еп оср ед ствен н ого вы зова п р ои звол ьн ы х п р и ви л еги р ован н ы х п одп р ограм м м ен ее п ри ви леги р ован н ы м и . С д ругой стор он ы , н еоб ходи м о об есп ечи ть сущ ествован и е м ехан и зм а вы зова н еп ри ви л еги рован н ой п р огр ам м ой м од ул ей оп ер ац и он н ой си стем ы (п ри ви л еги р ован н ы х) д л я п ол учен и я об сл уж и ван и я. Н ап р и м ер , д л я того чтоб ы узн ать текущ ее вр ем я и л и вы п олн и ть об р ащ ен и е к м агн и тн ом у д и ску н еп ри ви л еги р ован н ая п р огр ам м а д ол ж н а вы звать соответствую щ и е м од ул и оп ер ац и он н ой си стем ы . П р оц ессор i80286 сод ер ж и т все ср ед ства, н еоб ходи м ы е д л я ор ган и зац и и с одн ой стор он ы , защ и ты м од улей оп ер ац и он н ой си стем ы от н есан кц и он и р ован н ого вы зова п р и кл ад н ы м и п р ограм м ам и и , с д р угой стор он ы , д л я об сл уж и ван и я м од ул ям и оп ерац и он н ой си стем ы вы зовов п ри кл ад н ы х п р огр ам м .
К о м ан д ы C A LL и JM P П р и и сп ол ьзован и и ком ан д C A LL и л и JM P д л я вн утри сегм ен тн ой п ер ед ачи уп р авл ен и я в качестве оп ер ан д а д л я ком ан д н еобход и м о указы вать см ещ ен и е м од ул я в текущ ем сегм ен те, котор ом у б удет п ер ед ан о уп равл ен и е. П р и п ер ед аче уп равл ен и я п р оц ессор п р овер яет см ещ ен и е н а п ред м ет вы ход а за п р ед ел ы текущ его сегм ен та код а. В сл учае и сп ол ьзован и я эти х ком ан д д л я м еж сегм ен тн ой п ер ед ачи уп р авл ен и я сущ ествую т д ве возм ож н ости . В о-п ер вы х, п р огр ам м и ст м ож ет указать в качестве оп еран д а сел ектор д ескри п тор а вы зы ваем ого сегм ен та код а. В о-втор ы х, п р огр ам м и ст м ож ет указать в качестве оп еран д а сел ектор , котор ом у соответствует д ескр и п тор сп ец и ал ьн ого ти п а - вен ти л ь вы зова. В ен ти л ь вы зова сод ер ж и т л оги чески й (а н е ф и зи чески й , как д ескри п тор сегм ен та) ад р ес вы зы ваем ого м од ул я. П ер вы й сп особ н азы вается п рям ы м вы зовом , втор ой - вы зовом чер ез вен ти л ь вы зова. Р ассм отр и м сн ачал а п р ям ой вы зов сегм ен та. В этом сл учае оп ер ан д ком ан д ы вы зова - сел ектор д ескри п тор а вы зы ваем ого и ли , д руги м и сл овам и , ц ел евого сегм ен та. Н а вы п олн ен и е п р ям ого вы зова ц ел евого сегм ен та и л и п р ям ого п ер еход а к ц ел евом у сегм ен ту вли яет би т п од чи н ен и я C , которы й р асп ол агается в би те 2 бай та д о ступ а д ескр и п тор а ц ел евого сегм ен та. Е сл и б и т C устан овл ен в 0, ц ел евой сегм ен т н азы вается н есогл асован н ы м . Н есогл асован н ы й сегм ен т м ож ет б ы ть вы зван тол ько такой п р ограм м ой , котор ая и м еет б ол ьш и е и л и таки е ж е п ри ви л еги и , что и ц ел евой сегм ен т. Т .е. д ол ж н о вы п олн яться усл ови е C P L <= DPL. О б ы чн ая п р огр ам м а, вы п олн яю щ аяся в кол ьц е 3, н е м ож ет вы зы вать н есогл асован н ы й сегм ен т (и ли п ер ед авать уп р авл ен и е н есогласован н ом у сегм ен ту), н аход ящ ем уся в кол ьц ах 0, 1 и л и 2. Э тот м ехан и зм б л оки р ует н есан кц и он и р ован н ы й вы зов м од ул ей оп ер ац и он н ой си стем ы п р огр ам м ам и п ол ьзователя. О д н ако д ол ж ен сущ ествовать сп особ б езоп асн ого вы зова м од ул ей оп ер ац и он н ой си стем ы в заран ее оговор ѐн н ы х точках д л я того, чтоб ы п рогр ам м ы м огл и п ол учать об сл уж и ван и е от п р и ви л еги рован н ы х м од ул ей яд р а оп ер ац и он н ой си стем ы . П р ям ой вы зов н есогласован н ого сегм ен та зд есь н е п одход и т, так как яд р о р асп олагается в н ул евом кол ьц е. Е сл и п р огр ам м н ы й сегм ен т, р асп ол агаю щ и й ся в яд р е оп ер ац и он н ой си стем ы , д олж ен вы зы ваться как сам ой оп ер ац и он н ой си стем ой в н улевом кол ьц е так и п р ограм м ам и п ол ьзовател я в м ен ее п р и ви л еги р ован н ы х кол ьц ах, м ож н о п ри м ен и ть согл асован н ы й сегм ен т. В согл асован н ом сегм ен те код а б и т п од чи н ен и я C б ай та доступ а устан овл ен в 1. С огл асован н ы й сегм ен т м ож н о вы зы вать и з п р огр ам м , н аход ящ и хся в л ю б ом кол ьц е. Н о в л ю б ом сл учае п р и вы зове этот сегм ен т б уд ет вы п олн яться с п ри ви л еги ям и вы зы ваю щ ей п р ограм м ы . Е сли согл асован н ы й сегм ен т вы зы вается и з кол ьц а 0, он б уд ет вы п ол н яться с ур овн ем п р и ви л еги й 0, есл и и з кол ьц а 3 - с ур овн ем п р и ви л еги й 3.
Д р угой сп особ вы п олн и ть м еж сегм ен тн ую п ер ед ачу уп равл ен и я - и сп ол ьзовать п еред ачу уп р авл ен и я чер ез вен ти л ь вы зова. В этом сл учае ком ан д ы C A LL и л и JM P ад р есую тся к д ескр и п тор у с ти п ом вен ти л я вы зова. Ф ор м ат этого д ескр и п тор а п оказан н а р и с. 11.
Р и с. 11. Д ескр и п тор вен ти л я вы зова. С ел ектор и см ещ ен и е п р ед ставл яю т соб ой адр ес вы зова и л и п ер ед ачи уп р авлен и я в ц ел евом сегм ен те. П ол е счѐтчи ка сл ов и сп ол ьзуется п р и п ер ед аче п ар ам етр ов вы зы ваем ом у м од ул ю . П ол е D PL вен ти л я вы зова указы вает м и н и м ал ьн ы й ур овен ь п ри ви л еги й , н еоб ход и м ы й д л я п ол учен и я д оступ а чер ез д ан н ы й вен ти л ь. О п ер ац и он н ая си стем а м ож ет п од готови т д л я п р огр ам м п ол ьзовател я вен ти л и , д оступ н ы е и з кол ьц а 3 и об есп ечи ваю щ и е вы зов п р оц ед ур об сл уж и ван и я, р асп ол агаю щ и хся в яд р е оп ер ац и он н ой си стем ы в кол ьц е 0. О д н ако п р огр ам м ы 3 кол ьц а см огут об р ащ аться тол ько к таки м вен ти лям вы зова, которы е сод ер ж ат в п ол е D P L зн ачен и е 3. П р и этом уп р авл ен и е чер ез вен ти л ь вы зова п ер ед аѐтся тол ько в ту точку, котор ая оп и сан а в д ан н ом вен ти л е и явл яется б езоп асн ой с точки зр ен и я оп ер ац и он н ой си стем ы . П р огр ам м а п ол ьзовател я н е см ож ет п еред ать уп р авл ен и е в сер еди н у м од ул я и ли в сер ед и н у м аш и н н ой ком ан ды . Н о есть ещ ѐ п р об л ем а с п еред ачей п ар ам етр ов. О б ы чн о п ер ед ача п ар ам етр ов вы п ол н яется чер ез стек. Н о д л я об есп ечен и я защ и ты п р ограм м ы н ул евого кол ьц а и сп ользую т отд ел ьн ы й стек (вообщ е говор я, д л я каж д ого кол ьц а и сп ол ьзуется отд ельн ы й стек, м ехан и зм п ер екл ю чен и я стеков м ы р ассм отр и м п р и оп и сан и и м ул ьти зад ачн ости ). П р и вы зове сегм ен та чер ез вен ти л ь вы зова п р оц ессор коп и р ует и з стека вы зы ваю щ ей п р ограм м ы в стек ц ел евого сегм ен та такое кол и чество 16 -б и товы х сл ов, котор ое указан о в п ол е 5 -р азр яд н ого счѐтчи ка сл ов вен ти л я вы зова. Т аки м сп особом вы зы ваем ом у м од ул ю м ож н о п ер ед ать д о 31 п ар ам етр а. В ен ти л ь вы зова - и д еал ьн ое ср ед ство д л я п р ед оставл ен и я об ы чн ы м п р ограм м ам сер ви са со стор он ы оп ер ац и он н ой си стем ы . С одн ой стор он ы вен ти л ь вы зова, ф ор м и р уем ы й оп ерац и он н ой си стем ой , п озвол яет н еп ри ви л еги р ован н ы м п р ограм м ам п ер едавать уп р авл ен и е п р и ви л еги р ован н ы м код овы м сегм ен там д л я п ол учен и я н еоб ходи м ого об сл уж и ван и я. С д р угой стор он ы , оп ер ац и он н ая си стем а и м еет возм ож н ость д ерж ать п од свои м кон тр ол ем и сп ользован и е вен ти л ей вы зова, зад авая в п ол е D P L вен ти ля м и н и м ал ьн ы й ур овен ь п р и ви л еги й , котор ы м и д ол ж н а об л ад ать п р огр ам м а, п еред аю щ ая уп ра вл ен и е чер ез этот вен ти л ь, а такж е б езоп асн ы й ад рес вход а в ц елевом сегм ен те.
К о м ан д ы R E T и IR E T К ом ан д ы R E T и IR E T п р ед н азн ачен ы д л я возврата и з п од п р огр ам м и п р оц ед ур об р аб отки п р ер ы ван и й , соответствен н о. К ом ан д а R E T м ож ет возвр ащ ать уп р авл ен и е в п р ед е л ах од н ого сегм ен та (вн утри сегм ен тн ая ф ор м а) и л и в д р угой сегм ен т (м еж сегм ен тн ая ф ор м а). П р и вы п ол н ен и и вн утр и сегм ен тн ой ф ор м ы ком ан д ы R E T п р оц ессор вы п ол н яет п р овер ку п ревы ш ен и я гр ан и ц ы текущ его сегм ен та, н е п озволяя п ер ед авать уп равл ен и е за его п р ед ел ы .
К огд а вы п ол н яется м еж сегм ен тн ая ком ан д а R E T и л и ком ан д а IR E T , п р оц ессор п р овер яет п ри ви леги и сел ектор а сегм ен та п р огр ам м ы , вы би р аем ого и з стека (то есть сел ектор а сегм ен та, котор ом у буд ет п еред ан о уп р авл ен и е п р и вы п олн ен и и ком ан д R E T и л и IR E T ). П р оц ессор м ож ет вы п ол н и ть возврат тол ько в м ен ее п р и ви л еги р ован н ы й сегм ен т и ли в сегм ен т, об л ад аю щ и й таки м и ж е п ри ви л еги ям и , что и тот, и з котор ого вы п ол н яется возвр ат.
1 .4 . В и р туал ьн ая п ам я ть в п р о ц ессо р е i8 0 2 8 6 П р оц ессор i80286 м ож ет н еп оср ед ствен н о ад р есовать д о 16 м егаб ай т ф и зи ческой п ам яти , од н ако р еал ьн о ком п ью тер ы р ед ко и м ею т оп ер ати вн ую п ам ять такого р азм ер а. О б ы чн ы й р азм ер оп ер ати вн ой п ам яти д л я IB M AT составл яет 2 -4 м егаб ай та (зд есь и м еется в ви д у р асш и рен н ая п ам ять - Extended Memory). М ехан и зм ви р туал ьн ой п ам яти , р еали зован н ы й в п р оц ессор е i80286, п озвол яет ор ган и зовать п ам ять б ол ьш ого р азм ер а (н ап р и м ер , 16 м егабай т) с и сп ол ьзован и ем отн оси тел ьн о н еб ол ьш ой ф и зи ческой оп ер ати вн ой п ам яти и д и сковой п ам яти . О сн овн ая и д ея ви ртуал ьн ой п ам яти закл ю чается в то м , чтоб ы хран и ть (и об н овл ять) сод ер ж и м ое б ольш ой ви р туал ьн ой п ам яти н а ди ске, п од качи вая отд ел ьн ы е участки ви ртуал ьн ой п ам яти в р еал ьн ую оп ерати вн ую п ам ять п о н еоб ходи м ости . М ож н о, н ап р и м ер , хран и ть все и сп ол ьзуем ы е п р огр ам м ой сегм ен ты н а д и ске, а в ф и зи ческую п ам ять зап и сы вать тол ько те сегм ен ты , которы е н еобход и м ы д л я вы п ол н ен и я п р огр ам м ы в н астоящ и й м ом ен т. П р оц есс "п од качки " сегм ен тов с ди ска в п ам ять и и х вы гр узки п осл е и зм ен ен и я н а ди ск н азы вается своп и н гом . О п ер ац и он н ая си стем а д олж н а вести учѐт сегм ен тов и зн ать, каки е сегм ен ты н аход ятся в п ам яти , а каки е - н а д и ске. П р оц ессор i80286 м ож ет оказать ей в этом сущ ествен н ую п ом ощ ь. П осл ед н и е д ва п ол я д ескри п тор а, котор ы е м ы ещ ѐ н е р ассм атр и вал и - б и т п ри сутстви я сегм ен та в п ам яти P и б и т об р ащ ен и я к сегм ен ту п ам яти A п р ед н азн ачен ы д л я ап п ар атн ой р еал и зац и и учѐта сегм ен тов. Б и т P д олж ен б ы ть устан овлен в 1 д л я тех сегм ен тов, котор ы е н аход ятся в ф и зи ческой п ам яти . С егм ен ты , вр ем ен н о отсутствую щ и е в п ам яти и н аход ящ и еся н а ди ске, п ом ечаю тся в д ескр и п то р е би том P , сб р ош ен н ы м в 0. У стан овкой и сб р осом би та P зан и м ается оп ер ац и он н ая си стем а. А вот п р оверка этого б и та - р аб ота д л я п р оц ессор а. К огд а п р ограм м а об р ащ ается к отсутствую щ ем у в ф и зи ческой п ам яти сегм ен ту (загрузкой сел ектор а в сегм ен тн ы й реги стр ), вы п ол н ен и е п р огр ам м ы п р ер ы вается и уп р авл ен и е п ер ед аѐтся оп ер ац и он н ой си стем е. Т а, в свою очеред ь, п одкачи вает н уж н ы й сегм ен т в оп ерати вн ую п ам ять и устан авли вает д л я н его би т P в 1, п осл е чего р аб ота п р огр ам м ы возоб н овл яется. В р ем я от вр ем ен и оп ер ац и он н ая си стем а д ол ж н а н аход и ть сегм ен ты , к которы м б ы л о об р ащ ен и е, и в сл учае и х и зм ен ен и я сб р асы вать н а д и ск. К р ом е того, есл и д ля закачки н ового сегм ен та в ф и зи ческой п ам яти н ед остаточн о своб од н ого м еста, м ож н о вы гр узи ть сам ы е стар ы е сегм ен ты и з ф и зи ческой п ам яти н а д и ск и н а и х м есто загр узи ть н овы й сегм ен т. П р оц ессор м ож ет оказать п ом ощ ь оп ер ац и он н ой си стем е в оп р ед ел ен и и тех сегм ен тов, к котор ы м б ы л о об р ащ ен и е. Д л я эти х сегм ен тов б и т об р ащ ен и я A устан авл и вается п р оц ессор ом в 1. С б р оси ть б и т об ращ ен и я м ож н о тол ько и з п р огр ам м ы , п оэтом у такая р аб ота возл агается н а сам у оп ер ац и он н ую си стем у. Р еал ьн о оп и сан н ая вы ш е схем а реал и зац и и ви р туал ьн ой п ам яти со своп и н гом сегм ен тов и сп ол ьзуется в оп ер ац и он н ой си стем е O S/2 вер си й от 1.0 д о 1.3 вкл ю чи тельн о. О д н ако у этой схем ы есть од и н сер ьѐзн ы й н ед остаток. Т ак как все сегм ен ты и м ею т р азн ы е р азм ер ы , и все он и п од качи ваю тся п о очер ед и (и п о н ескол ько ш тук) в одн у об л асть ф и зи ческой п ам яти , возм ож н о возн и кн овен и е ф р агм ен тац и и ф и зи ческой п ам яти . Н ап ри м ер , б ы л удал ѐн сегм ен т разм ер ом в 10 ки л об ай т, и об р азовал ся своб од н ы й участок ф и зи ческой п ам яти такого ж е р азм ер а. Н овы й сегм ен т, котор ы й тр ебуется закачать в п ам ять, и м еет р азм ер 15 ки л об ай т, и он н е п ом ести тся н а м есто стар ого. О п ер ац и он н ая си стем а м ож ет вы п олн и ть п ер ем ещ ен и е сегм ен тов в ф и зи ческой п ам яти , и зм ен и в соответствую щ и м обр азом 24 -б и товы е б азовы е ад р еса сегм ен тов в таб ли ц ах д ескр и п тор ов. П осл е п ер ем ещ ен и я сегм ен тов м ож н о об ъ ед и н и ть все своб од н ы е участки п ам яти в од и н и и сп ол ьзовать этот участок д л я загр узки н ового сегм ен та. Т ак как п р огр ам м ы защ и щ ѐн н ого р еж и м а н е зн аю т ф и зи чески х ад р есов п ам яти (он и раб отаю т тол ько с сел ектор ам и ), п ер ем ещ ен и е сегм ен тов н и как н е отр ази тся н а и х р аб оте.
Н о н а п ерем ещ ен и е сегм ен тов тр еб уется вр ем я, и кр ом е того, часто н уж ен н е весь сегм ен т, а тол ько его н еб ол ьш ой участок. П р оц ессор i8028 6 н е п р ед л агает н и какого р еш ен и я п р об л ем ы ф рагм ен тац и и ф и зи ческой п ам яти п ри своп и н ге сегм ен тов, и н е п озвол яет загр уж ать сегм ен т п о частям . В се эти возм ож н ости и м ею тся тол ько в п р оц ессор ах i80386 и i80486. Т ол ько эти п р оц ессор ы п озвол яю т эф ф екти вн о р еали зовать м ехан и зм ви р туал ьн ой п ам яти .
2.В Х О Д И М В ЗА Щ И Щ ЁН Н Ы Й Р ЕЖ И М Зад ача втор ой гл авы - п оказать н а п р остом п ри м ер е, как состави ть п р огр ам м у д л я M S -D O S , п ер екл ю чаю щ ую п р оц ессор и з реал ьн ого р еж и м а в защ и щ ѐн н ы й и возвр ащ аю щ ую его об р атн о в р еал ьн ы й реж и м . С ам п р оц есс оп и сан во м н оги х кн и гах, п освящ ѐн н ы х i80286, од н ако п р и этом об ы чн о оп ускаю тся м н оги е техн и чески е д етал и , связан н ы е с ап п ар атн ы м об есп ечен и ем ком п ью тер а. Зн ан и е эти х д етал ей соверш ен н о н ео б ход и м о д л я усп еш н ого и сп ол ьзован и я защ и щ ен н ого р еж и м а н а р еал ьн ы х ком п ью тер ах. С ей час м ы н е б удем рассм атр и вать п р оц есс об р аб отки п р ер ы ван и й в защ и щ ѐн н ом р еж и м е - это м атер и ал сл ед ую щ ей главы . Т ам ж е б уд ет п р и вед ѐн и соответствую щ и й п ри м ер п р ограм м ы . В п р огр ам м е, котор ую п р ед стави м в этой гл аве, м ы зап р ети ли п р ер ы ван и я н а всѐ то вр ем я, п ока п р оц ессор н аход и тся в защ и щ ѐн н ом р еж и м е.
2 .1 . П о д го то вка к п ер екл ю ч ен и ю в защ и щ ѐн н ы й р еж и м П ер ед тем , как п ер екл ю чи ть п р оц ессор в защ и щ ѐн н ы й реж и м , н ад о вы п олн и ть н ек отор ы е п од готови тел ьн ы е д ей стви я, а и м ен н о:
П од готови ть в оп ер ати вн ой п ам яти гл об ал ьн ую табл и ц у д ескр и п тор ов G D T . В этой таб л и ц е д ол ж н ы
б ы ть созд ан ы д ескри п тор ы д л я всех сегм ен тов, котор ы е б удут н уж н ы п р огр ам м е ср азу п осл е того, как он а п ер екл ю чи тся в защ и щ ѐн н ы й р еж и м . В п осл ед стви и , н аход ясь в защ и щ ѐн н ом р еж и м е, п р огр ам м а м ож ет м од и ф и ц и р овать G D T (есл и , р азум еется, он а р аб отает в н ул евом кол ьц е защ и ты ). П р огр ам м а м ож ет м од и ф и ц и р овать и м ею щ и еся д ескр и п тор ы и ли д об ави ть н овы е, загр узи в зан ово р еги стр G D T R . Д л я об есп ечен и я возм ож н ости возвр ата и з защ и щ ѐн н ого реж и м а в р еал ьн ы й н еобход и м о зап и сать ад р ес возвр ата в реал ьн ы й р еж и м в об л асть д ан н ы х B IO S п о ад р есу 0040h :00 67h , а такж е зап и сать в CMOS-п ам ять в ячей ку 0Fh код 5. Э тот код об есп ечи т п осл е вы п ол н ен и я сб р оса п р оц ессор а п ер ед ачу уп р авл ен и я п о ад р есу, п од готовл ен н ом у н ам и в об ласти д ан н ы х B IO S п о ад р есу 0040h :00 67h . Зап р ети ть все м аски р уем ы е и н ем аски р уем ы е п р ер ы ван и я. О ткр ы ть адр есн ую ли н и ю A 20. Зап ом н и ть в оп ер ати вн ой п ам яти сод ер ж и м ое сегм ен тн ы х реги стр ов, котор ы е н еобход и м о сохр ан и ть д л я возврата в р еал ьн ы й реж и м , в частн ости , указател ь стека р еал ьн ого р еж и м а. Загр узи ть реги стр G D T R .
П ер вы й ш аг, связан н ы й с п од готовкой G D T , м ы уж е оп и сал и , когд а р ассказы вали о п реоб р азован и и ад р есов в защ и щ ѐн н ом р еж и м е. Ч то ж е касается возврата и з защ и щ ѐн н ого р еж и м а в р еал ьн ы й , то он вы п олн яется сб р осом п р оц ессор а, и н и ц и и р ован н ого вы вод ом оп р ед ел ѐн н ого бай та в п р оц ессор кл ави атур ы 8042. Э то связан о с тем , что р азр аб отчи ки п р оц ессор а i80286 н е п р ед усм отр ели н и какой к ом ан д ы д л я п ер еклю чен и я п р оц ессор а и з защ и щ ѐн н ого р еж и м а в реал ьн ы й . Е сть ещ ѐ од и н сп особ возвр ата в р еал ьн ы й р еж и м , осн ован н ы й н а п ер евод е п р оц ессор а в состоян и е откл ю чен и я, он б уд ет оп и сан в гл аве, п освящ ѐн н ой обр аб отке п р ер ы ван и й в защ и щ ѐн н ом р еж и м е. П осл е вы п олн ен и я сбр оса (и л и п осл е откл ю чен и я) п р оц ессор п ер еходи т в реал ьн ы й р еж и м и уп р авл ен и е п ер ед аѐтся в B IO S . B IO S ан ал и зи р ует сод ерж и м ое ячей ки C M O S -п ам яти с ад р есом 0Fh - б ай та состоян и я откл ю чен и я. Д ал ьн ей ш и е д ей стви я оп р ед ел яю тся сод ер ж и м ы м этой я чей ки . Б ай т состоян и я отклю чен и я 0Fh и сп ол ьзуется B IO S д л я оп ред ел ен и я сп особа возвр ата и з защ и щ ѐн н ого р еж и м а в р еал ьн ы й п осл е ап п аратн ого сб р оса. В таб л и ц е 3 п ер ечи сл ен ы возм ож н ы е зн ачен и я д л я б ай та состоян и я откл ю чен и я. Т аб л и ц а 3. Зн ачен и я б ай та состоян и я откл ю чен и я.
Зн ачен и е
П р и чи н а откл ю чен и я
0
П р огр ам м н ы й сб р ос п р и н аж ати и ком б и н ац и и кл ави ш C T R L -ALT-D E L и ли н еож и д ан н ы й сб р ос. В ы п олн яется обы чн ы й п ер езап уск си стем ы , н о п р оц ед ур ы тести р ован и я п ри вкл ю чен и и п и тан и я н е вы п олн яю тся. 1
С бр ос п о сл е оп р ед ел ен и я об ъ ѐм а п ам яти .
2
С бр ос п осл е тести р ован и я п ам яти .
3
С бр ос п осл е обн аруж ен и я ош и б ки в п ам яти (кон тр ол ь чѐтн ости ).
4
С бр ос с зап р осом п ер езагрузки .
5
П осл е сбр оса п ер езап ускается кон тр ол л ер п р еры ван и й , зате м уп равл ен и е п ер ед аѐтся п о адр есу, котор ы й н аходи тся в об л асти д ан н ы х B IO S 0040h :006 7h .
6,7,8
С б р ос п осл е вы п ол н ен и я теста р аб оты п р оц ессор а в защ и щ ѐн н ом р еж и м е.
9
С б р ос п осл е вы п ол н ен и я п ер есы л ки б л ока п ам яти и з осн овн ой п ам яти в расш и р ен н ую .
0Ah
П осл е сбр оса уп р авл ен и е н ем ед л ен н о п ер ед аѐтся п о ад р есу, взятом у и з об л асти д ан н ы х BIOS 0040h:0067h.
Д л я об есп ечен и я возвр ата в р еал ьн ы й р еж и м п осл е сброса п о ад р есу, зап и сан н ом у в об л асти д ан н ы х B IO S 0040h :006 7h м ож н о и сп ол ьзовать б ай ты 5 и 0A h . И з за особ ен н остей обр аб отки п рер ы ван и й в защ и щ ѐн н ом р еж и м е, котор ы е м ы р ассм отр и м в тр етьей гл аве, п ер ед п ер екл ю чен и ем в защ и щ ѐн н ы й р еж и м н еоб ходи м о п ер еп р огр ам м и р овать кон тр ол л ер п р ер ы ван и й . В осстан ови ть состоян и е кон тр ол л ер а п осл е возвр ата в р еал ьн ы й р еж и м м ож н о автом ати чески , если и сп ол ьзовать зн ачен и е 5 д л я б ай та состоян и я откл ю чен и я. Е сл и ж е вы н е и сп ол ьзуете п р ер ы ван и я и , соответствен н о, н е п ер еп р ограм м и руете кон тр ол л ер п р ер ы ван и й , м ож н о и сп ол ьзовать зн ачен и е 0A h , п р и этом п осл е сб р оса уп р авлен и е б уд ет ср азу п ер ед ан о п о ад р есу, взятом у и з об ласти д ан н ы х B IO S 0040h :00 67h . В этом сл учае затр ачен н ое н а возвр ат в р еал ьн ы й р еж и м вр ем я б уд ет м ен ьш е. В сл ед ую щ ем ф р агм ен те п р огр ам м ы м ы зап и сы ваем в ячей ку C M O S -п ам яти с ад р есом 0Fh зн ачен и е 5. Н ап ом н и м , что д л я зап и си чи сл а в ячей ку C M O S -п ам яти н еобход и м о вн ачал е в п ор т с ад р есом 70h зап и сать н ом ер н уж н ой ячей ки , а затем в п ор т 71h - зап и сы ваем ы е дан н ы е. Н е уд и вл яй тесь, что в этом ф р агм ен те п р ограм м ы вм есто ячей ки 0Fh указан о зн ачен и е 8Fh - это н е ош и б ка. Н ап ом н и м , что ед и н ствен н ы й сп особ зам аски р овать н ем аски р уем ы е п р еры ван и я в ком п ью тер е IB M AT - это зап и сать в п ор т 70h б ай т, в котор ом стар ш и й б и т устан овлен в 1. П оэтом у н аш ф рагм ен т п р огр ам м ы н е тол ько зап и сы вает б ай т состоян и я откл ю чен и я, н о и м аски рует н ем аски р уем ы е п рер ы ван и я (!). Н ам н еобход и м о такж е зам аски р овать обы чн ы е п р еры ван и я, п оэтом у м ы вы д аѐм ком ан д у C LI.
cli mov out jmp
al,8f CMOS_PORT,al next1
mov out
al,5 CMOS_PORT+1,al
; небольшая задержка
next1:
С л ед ую щ и й ш аг - откры ти е ад р есн ой ли н и и A 20 - н еоб ход и м в том сл учае, есл и ваш а п р огр ам м а б уд ет об р ащ аться к оп ер ати вн ой п ам яти , л еж ащ ей за п р ед ел ам и п ер вого м егаб ай та. П р и вед ѐм п р оц ед уру, котор ую м ож н о и сп ол ьзовать д л я этой ц е л и :
; -----------------------------------------------------------; Процедура открывает адресную линию A20 ; -----------------------------------------------------------PROC
enable_a20 NEAR mov al,A20_PORT out STATUS_PORT,al
ENDP
mov al,A20_ON out KBD_PORT_A,al ret enable_a20
Э та м аги ческая п осл ед овательн ость ком ан д вы д аѐт ком ан ду A 20_O N кл ави атур н ом у п р оц ессор у 8042, к котор ом у п од кл ю чен ы схем ы уп р авлен и я ад р есн ой ли н и ей A 20. П осл е н ача л ьн ого сб р оса л и н и я A 20 закр ы та, и р асш и р ен н ая п ам ять за гран и ц ам и п ер вого м егаб ай та н ед оступ н а. С л ед ую щ и й этап - зап ом и н ан и е сод ер ж и м ого сегм ен тн ы х р еги стр ов, котор ы е б уд ут н уж н ы п р и возврате в р еал ьн ы й р еж и м . Э то сегм ен тн ы е р еги стр ы S S и E S :
mov mov
[real_ss],ss [real_es],es
; запоминаем указатель стека ; для реального режима
Н а п осл ед н ем п ер ед п ер екл ю чен и ем в защ и щ ѐн н ы й реж и м этап е м ы загр уж аем р еги стр G D T R ад ресом п од готовл ен н ой зар ан ее G D T :
lgdt [QWORD gdt_gdt] В сѐ! М ож н о п ер екл ю чаться в защ и щ ѐн н ы й р еж и м !
2 .2 . П ер екл ю ч ен и е в защ и щ ѐн н ы й р еж и м Э то сам ы й п р остой этап . Д л я п ер евод а п р оц ессор а i80286 и з р еал ьн ого р еж и м а в защ и щ ѐн н ы й м ож н о и сп ол ьзовать сп ец и ал ьн ую ком ан д у LM S W , загруж аю щ ую реги стр состоян и я п р оц ессор а (M ash in e Status Word). М л ад ш и й би т этого р еги стр а указы вает р еж и м раб оты п р оц ессор а. Зн ачен и е, равн ое 0, соответствует реал ьн ом у р еж и м у раб оты , а зн ачен и е 1 - защ и щ ѐн н ом у. Е сл и устан ови ть м л ад ш и й би т р еги стр а состоян и я п р оц ессор а в 1, п р оц ессор п ер екл ю чи тся в за щ и щ ѐн н ы й р еж и м :
mov lmsw
ax, 1 ax
К сож ал ен и ю , с п ом ощ ью ком ан д ы LM S W н евозм ож н о п ерекл ю чи ть п р оц ессор об р атн о в р еал ьн ы й р еж и м . Д л я этого н еобход и м о и сп ол ьзовать д р угой сп особ .
2 .3 . В о звр ат в р еал ьн ы й р еж и м Д л я того, чтоб ы верн уть п р оц ессор 8028 6 и з защ и щ ѐн н ого р еж и м а в р еальн ы й , н еоб ход и м о вы п ол н и ть ап п ар атн ы й сбр ос (откл ю чен и е) п р оц ессор а. Э то м ож н о сд ел ать сл ед ую щ и м обр азом :
mov out
ax, 0FEh 64h, ax
; команда отключения
П ер ед вы д ачей ком ан д ы откл ю чен и я н еобход и м о зап ом н и ть сод ер ж и м ое р еги стра S P , так как п осл е п ер ед ачи уп р авл ен и я п о ад р есу, зап и сан н ом у в об ласти д ан н ы х B IO S 0040h :006 7h , р еги стры S S :S P б уд ет указы вать н а стек BIOS. П осл е вы д ачи ком ан д ы отклю чен и я н ад о п од ож д ать, когд а п р ои зой д ѐт сб р ос п р оц ессор а. Э то м ож н о сд ел ать, вы д авая в ц и кл е ком ан д у H LT . В от ф р агм ен т п р ограм м ы , возвр ащ аю щ и й п р оц ессор в реальн ы й р еж и м :
; Запоминаем содержимое указателя стека, так как после ; сброса процессора оно будет потеряно mov
[real_sp],sp
; Выполняем сброс процессора mov out
al,SHUT_DOWN STATUS_PORT,al
; Ожидаем сброса процессора wait_reset: hlt jmp
wait_reset
Д ал ее н еоб ходи м о восстан ови ть сод ерж и м ое сегм ен тн ы х реги стр ов, зап и сан н ое в оп ер ати вн ую п ам ять н а эта п е п од готовки к п ер еклю чен и ю в защ и щ ѐн н ы й реж и м , закр ы ть ад р есн ую ли н и ю A 20 и р азм аски р овать п р еры ван и я. Д л я закры ти я ли н и и A 20 м ож н о восп ол ьзоваться сл ед ую щ ей п р оц ед ур ой :
; -----------------------------------------------------------; Процедура закрывает адресную линию A20 ; -----------------------------------------------------------PROC
ENDP
disable_a20 NEAR mov al,A20_PORT out STATUS_PORT,al mov al,A20_OFF out KBD_PORT_A,al ret disable_a20
С л ед ую щ ая п осл ед овател ьн ость ком ан д р азм аски р ует все п р ер ы ван и я:
mov out
ax,000dh CMOS_PORT,al
; разрешаем немаскируемые прерывания
in and out sti
al,INT_MASK_PORT ; разрешаем маскируемые прерывания al,0 INT_MASK_PORT,al
Т еп ер ь, когд а м ы зн аем всѐ, что н уж н о д л я п ер екл ю чен и я п р оц ессор а в защ и щ ѐн н ы й р еж и м и возвр ата в р еал ьн ы й р еж и м , м ож н о п р и ступ и ть к п р акти ческой р аб оте в защ и щ ѐн н ом р еж и м е.
2 .3 . В о звр ат в р еал ьн ы й р еж и м Д л я того, чтоб ы верн уть п р оц ессор 8028 6 и з защ и щ ѐн н ого р еж и м а в р еальн ы й , н еоб ход и м о вы п ол н и ть ап п ар атн ы й сбр ос (откл ю чен и е) п р оц ессор а. Э то м ож н о сд ел ать сл ед ую щ и м обр азом :
mov out
ax, 0FEh 64h, ax
; команда отключения
П ер ед вы д ачей ком ан д ы откл ю чен и я н еобход и м о зап ом н и ть сод ер ж и м ое р еги стра S P , так как п осл е п ер ед ачи уп р авл ен и я п о ад р есу, зап и сан н ом у в об ласти д ан н ы х B IO S 0040h :006 7h , р еги стры S S :S P б уд ет указы вать н а стек BIOS. П осл е вы д ачи ком ан д ы отклю чен и я н ад о п од ож д ать, когд а п р ои зой д ѐт сб р ос п р оц ессор а. Э то м ож н о сд ел ать, вы д авая в ц и кл е ком ан д у H LT . В от ф р агм ен т п р ограм м ы , возвр ащ аю щ и й п р оц ессор в реальн ы й р еж и м :
; Запоминаем содержимое указателя стека, так как после
; сброса процессора оно будет потеряно mov
[real_sp],sp
; Выполняем сброс процессора mov out
al,SHUT_DOWN STATUS_PORT,al
; Ожидаем сброса процессора wait_reset: hlt jmp
wait_reset
Д ал ее н еоб ходи м о восстан ови ть сод ерж и м ое сегм ен тн ы х реги стр ов, зап и сан н ое в оп е р ати вн ую п ам ять н а этап е п од готовки к п ер еклю чен и ю в защ и щ ѐн н ы й реж и м , закр ы ть ад р есн ую ли н и ю A 20 и р азм аски р овать п р еры ван и я. Д л я закры ти я ли н и и A 20 м ож н о восп ол ьзоваться сл ед ую щ ей п р оц ед ур ой :
; -----------------------------------------------------------; Процедура закрывает адресную линию A20 ; -----------------------------------------------------------PROC
ENDP
disable_a20 NEAR mov al,A20_PORT out STATUS_PORT,al mov al,A20_OFF out KBD_PORT_A,al ret disable_a20
С л ед ую щ ая п осл ед овател ьн ость ком ан д р азм аски р ует все п р ер ы ван и я:
mov out
ax,000dh CMOS_PORT,al
; разрешаем немаскируемые прерывания
in and out sti
al,INT_MASK_PORT ; разрешаем маскируемые прерывания al,0 INT_MASK_PORT,al
Т еп ер ь, когд а м ы зн аем всѐ, что н уж н о д л я п ер екл ю чен и я п р оц ессор а в защ и щ ѐн н ы й р еж и м и возвр ата в р еал ьн ы й р еж и м , м ож н о п р и ступ и ть к п р акти ческой р аб оте в защ и щ ѐн н ом р еж и м е.
2 .4 . П р и м ер п р о сто й п р о гр ам м ы п ер екл ю ч ен и я р еж и м а Д ан н ая п р огр ам м а зап ускается в р еал ьн ом р еж и м е в ср ед е M S -D O S , п ер екл ю чает п р оц ессор в защ и щ ѐн н ы й р еж и м , вы д аѐт сооб щ ен и е и чер ез н екотор ое вр ем я возвращ ает п р оц ессор в р еал ьн ы й р еж и м , сти р ает экр ан и завер ш ает своѐ вы п олн ен и е. П р огр ам м а п од готовл ен а с п ом ощ ью тр ан сл ятор а B orlan d T u rb o A ssem b ler и и сп ол ьзует р еж и м ID E A L. Д л я еѐ тр ан сл яц и и б ы л и сп ол ьзован сл ед ую щ и й ком ан д н ы й ф ай л :
tasm %1.asm /l /zi tlink %1.obj /v
В ы м ож ете зап ускать эту п р огр ам м у н а л ю б ой м аш и н е, совм ести м ой с IB M A T и об ор уд ован н ой п р оц ессор ам и i8028 6, i80 386, i8 0486. Н о вы н е д ол ж н ы зап ускать эту п рогр ам м у, если у вас ком п ью тер н а б азе п р оц ессор ов i8038 6 и л и i804 86 и акти вн ы д р ай веры Q E M M , E M M 38 6 - откл ю чи те эти д р ай вер ы . К ром е того, эту п р огр ам м у н ел ьзя зап ускать н а ви р туал ьн ой м аш и н е в ср ед е M icrosoft W IN D O W S в реж и м е E n ch an ced M od e и л и н а ви р туал ьн ой м аш и н е в сред е O S /2 вер си и 2.0. Э то связан о с тем , что в п ер ечи сл ен н ы х вы ш е сл учаях п р оц ессор р аб отает н е в р еал ьн ом р еж и м е, а в так н азы ваем ом р еж и м е ви р туальн ого п р оц ессор а 8086. Э тот р еж и м возм ож ен тол ько д л я п р оц ессор ов i80386 и л и i80486. К р ом е того, н е сл ед ует зап ускать эту п р огр ам м у н а ком п ью тер ах сер и и P S/2, так как в н и х и сп ол ьзуется д р угой сп особ уп р авл ен и я ли н и ей A 20 и д ругой сп особ сб р о са п р оц ессор а д л я возвр ата в р еал ьн ы й р еж и м . В ы м ож ете и сп ол ьзовать эту п р огр ам м у д л я п ер вы х эксп ер и м ен тов с защ и щ ѐн н ы м р еж и м ом . О б р ати м ваш е вн и м ан и е н а н екотор ы е огр ан и чен и я защ и щ ѐн н ого реж и м а. Э ти огр ан и чен и я связан ы в осн овн ом с и сп ол ьзован и ем п р ер ы в ан и й и сегм ен тн ы х р еги стр ов.
В аш ей п р огр ам м е, р аб отаю щ ей в защ и щ ѐн н ом р еж и м е, н едоступ н ы н и п рер ы ван и я B IO S , н и
п р ер ы ван и я D O S . Л ю б ой об м ен д ан н ы м и с п ер и ф ери й н ы м и устр ой ствам и (д и сп л еем , кл ави атур ой , д и ском и л и п ри н тер ом ) д олж ен вы п олн яться н а ур овн е ком ан д ввод а/вы вод а. Т .е. п р ограм м а д ол ж н а р аб отать н еп оср ед ствен н о с п ор там и ап п ар атур ы ком п ью тер а.
Э то огр ан и чен и е связан о с тем , что об р аб отчи ки п р ер ы ван и й B IO S и D O S р ассчи тан ы н а р аб оту в р еал ьн ом р еж и м е п р оц ессор а. П оп ы тка вы зова эти х обр аб отчи ков в за щ и щ ен н ом реж и м е н еи зб еж н о п ри вед ѐт к авари й н ом у завер ш ен и ю п р огр ам м ы . П оэтом у в п р и вед ѐн н ой н и ж е п р ограм м е вы вод текстовы х стр ок н а экр ан п р ои звод и тся п ри п ом ощ и н еп оср ед ствен н ой зап и си в п ам ять ви д еокон тр ол л ер а. Ч то ж е касается ввод а д ан н ы х с кл ави атуры , то зд есь н е об ой ти сь б ез об раб отки п р ер ы ван и я от кл ави атур ы . В сл ед ую щ ей главе м ы п ри ведѐм п р и м ер п р ограм м ы , котор ая н е тол ько вы води т д ан н ы е н а экр ан д и сп л ея (такж е чер ез зап и сь в ви д еоп ам ять), н о и ум еет раб отать с кл ави атур ой и тай м ер ом . Е сл и ваш а п р огр ам м а составлен а н а язы ках вы сокого ур овн я (С и и л и П аскал ь), ей н ед оступ н а п р акти чески вся б и бл и отека стан д ар тн ы х ф ун кц и й . О соб ен н о это касается ф ун кц и й ввод а/вы вод а и уп р авл ен и я п ам ятью . П р и чи н а очеви д н а - б ол ьш и н ство ф ун кц и й стан дар тн ы х би б ли отек тр ан сл ятор ов вы зы вает те и л и и н ы е п р ер ы ван и я B IO S и ли D O S .
П р огр ам м ы н е д олж н ы загр уж ать в сегм ен тн ы е р еги стры зн ачен и я, котор ы е н е являю тся п р ави л ьн ы м и
сел ектор ам и , оп и сан н ы м и в соответствую щ и х д ескри п тор н ы х таб ли ц ах. Н есм отр я н а то, что сам а п о себ е загр узка п р ои звол ьн ого зн ачен и я в сегм ен тн ы й р еги стр н е оп асн а, п оп ы тка и сп ол ьзован и я н еп рави л ьн о загруж ен н ого сегм ен тн ого р еги стр а вы зовет авар и й н ое завер ш ен и е р аб оты п р огр ам м ы .
Э то огр ан и чен и е связан о с м ехан и зм ом п р еоб р азован и я л оги ческого адр еса в ф и зи чески й . И так, н аш а п ер вая п р огр ам м а д л я защ и щ ѐн н ого реж и м а п роц ессор а 80286: Л и сти н г 1. Д ем он стр ац и я и возвр ата об р атн о в р еал ьн ы й р еж и м
п ереклю чен и я
в
защ и щ ѐн н ы й
----------------------------------------------------------IDEAL RADIX P286
16
; Используем модель памяти LARGE, при этом мы организуем ; несколько отдельных сегментов и для каждого сегмента ; создадим дескриптор в таблице GDT. MODEL
LARGE
р еж и м
; -----------------------------------------------------------; Определения структур данных и констант ; -----------------------------------------------------------STRUC
ENDS
desc_struc limit dw base_l dw base_h db access db rsrv dw desc_struc
0 0 0 0 0
; ; ; ; ; ;
структура дескриптора предел мл. слово физического адреса ст. байт физического адреса байт доступа зарезервировано
; Биты байта доступа ACC_PRESENT ACC_CSEG ACC_DSEG ACC_EXPDOWN ACC_CONFORM ACC_DATAWR
EQU EQU EQU EQU EQU EQU
10000000b 00011000b 00010000b 00000100b 00000100b 00000010b
; ; ; ; ; ;
сегмент есть в памяти сегмент кода сегмент данных сегмент расширяется вниз согласованный сегмент разрешена запись
; Типы сегментов ; сегмент данных DATA_ACC = ACC_PRESENT OR ACC_DSEG OR ACC_DATAWR ; сегмент кода CODE_ACC = ACC_PRESENT OR ACC_CSEG OR ACC_CONFORM ; сегмент стека STACK_ACC = ACC_PRESENT OR ACC_DSEG OR ACC_DATAWR OR ACC_EXPDOWN ; Константы STACK_SIZE B_DATA_SIZE B_DATA_ADDR MONO_SEG
EQU EQU EQU EQU
0400 0300 0400 0b000
COLOR_SEG
EQU
0b800
CRT_SIZE
EQU
4000
MONO_SIZE
EQU
1000
CRT_LOW
EQU
8000
MONO_LOW
EQU
0000
CRT_SEG
EQU
0Bh
; ; ; ; ; ; ; ; ; ; ;
размер стека размер области данных BIOS адрес области данных BIOS сегмент видеопамяти монохромного видеоадаптера сегмент видеопамяти цветного видеоадаптера размер сегмента видеопамяти цветного видеоадаптера размер сегмента видеопамяти монохромного видеоадаптера
; мл. байт физического адреса ; сегмента видеопамяти ; цветного видеоадаптера ; мл. байт физического адреса ; сегмента видеопамяти ; монохромного видеоадаптера ; ст. байт физического адреса ; сегмента видеопамяти
; Селекторы, определѐнные в таблице GDT DS_DESCR CS_DESCR SS_DESCR BIOS_DESCR
= = = =
(gdt_ds - gdt_0) (gdt_cs - gdt_0) (gdt_ss - gdt_0) (gdt_bio - gdt_0)
CRT_DESCR MDA_DESCR
= =
(gdt_crt - gdt_0) (gdt_mda - gdt_0)
CMOS_PORT PORT_6845
EQU EQU
70h 0063h
COLOR_PORT MONO_PORT STATUS_PORT SHUT_DOWN VIRTUAL_MODE A20_PORT A20_ON A20_OFF KBD_PORT_A KBD_PORT_B INT_MASK_PORT
EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU
03d4h 03b4h 64h 0feh 0001h 0d1h 0dfh 0ddh 60h 61h 21h
STACK
STACK_SIZE
DATASEG
порт для доступа к CMOS-памяти адрес области данных BIOS, где записано значение адреса порта контроллера 6845 порт цветного видеоконтроллера порт монохромного видеоконтроллера порт состояния клавиатуры команда сброса процессора бит перехода в защищѐнный режим команда управления линией A20 открыть A20 закрыть A20 адреса клавиатурных портов порт для маскирования прерываний
; сегмент стека ; начало сегмента данных
DSEG_BEG ; ; ; ;
; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
=
THIS WORD
Память для хранения регистров SS, SP, ES. Содержимое этих регистров будет записано здесь перед входом в защищѐнный режим и восстановлено отсюда после возврата из защищѐнного режима в реальный. real_ss dw real_sp dw real_es dw
? ? ?
; Глобальная таблица дескрипторов GDT, ; содержит следующие дескрипторы: ; ; gdt_0 - дескриптор для пустого селектора ; gdt_gdt - дескриптор для GDT ; gdt_ds - дескриптор для сегмента, адресуемого DS ; gdt_cs - дескриптор для сегмента кода ; gdt_ss - дескриптор для сегмента стека ; gdt_bio - дескриптор для области данных BIOS ; gdt_crt - дескриптор для видеопамяти цветного дисплея ; gdt_mda - дескриптор для видеопамяти монохромного дисплея GDT_BEG LABEL gdtr
= $ WORD
gdt_0 desc_struc <0,0,0,0,0> gdt_gdt desc_struc gdt_ds desc_struc gdt_cs desc_struc gdt_ss desc_struc <STACK_SIZE-1,,,DATA_ACC,0> gdt_bio desc_struc gdt_crt desc_struc gdt_mda desc_struc <MONO_SIZE1,MONO_LOW,CRT_SEG,DATA_ACC,0> GDT_SIZE
= ($ - GDT_BEG) ; размер таблицы дескрипторов
CODESEG PROC
; сегмент кода start
; Инициализируем регистр сегмента данных ; для реального режима mov mov
ax,DGROUP ds,ax
; Определяем базовый адрес видеопамяти call
set_crt_base
; Стираем экран дисплея (устанавливаем серый фон) mov call
bh, 77h clrscr
; Выполняем все подготовительные действия для перехода ; в защищѐнный режим и обеспечения возможности возврата ; в реальный режим call
init_protected_mode
; Переключаемся в защищѐнный режим call
set_protected_mode
; --------- * Программа работает в защищѐнном режиме! * --------call call
write_hello_msg ; выводим сообщение на экран pause ; ждѐм некоторое время
; Возвращаемся в реальный режим call
set_real_mode
; --------- * Программа работает в реальном режиме! * --------; Стираем экран mov call mov int ENDP ; ; ; ;
и возвращаемся в DOS bh, 07h clrscr ah,4Ch 21h
start
-----------------------------------------------------------Макрокоманда для записи в дескриптор 24-битового базового адреса сегмента ------------------------------------------------------------
MACRO setgdtentry mov [(desc_struc bx).base_l],ax mov [(desc_struc bx).base_h],dl ENDM ; ; ; ;
-----------------------------------------------------------Процедура подготовки процессора к переходу в защищѐнный режим с последующим возвратом в реальный режим ------------------------------------------------------------
PROC
init_protected_mode
NEAR
; Заполняем глобальную таблицу дескрипторов GDT ; Вычисляем 24-битовый базовый адрес сегмента данных mov mov shr shl
ax,DGROUP dl,ah dl,4 ax,4
; Регистры dl:ax содержат базовый адрес, сохраняем его в di:si mov mov
si,ax di,dx
; Подготавливаем дескриптор для GDT add ax,OFFSET gdtr adc dl,0 mov bx,OFFSET gdt_gdt setgdtentry ; Подготавливаем дескриптор для сегмента ds mov bx,OFFSET gdt_ds mov ax,si mov dx,di setgdtentry ; Подготавливаем дескриптор для сегмента cs mov bx,OFFSET gdt_cs mov ax,cs mov dl,ah shr dl,4 shl ax,4 setgdtentry ; Подготавливаем дескриптор для сегмента стека mov bx,OFFSET gdt_ss mov ax,ss mov dl,ah shr dl,4 shl ax,4 setgdtentry ; Записываем адрес возврата в реальный режим в область ; данных BIOS по адресу 0040h:0067h push mov mov mov mov pop ; ; ; ;
ds ax,40 ds,ax [WORD 67],OFFSET shutdown_return [WORD 69],cs ds
Маскируем все прерывания, в том числе немаскируемые. Записываем в CMOS-память в ячейку 0Fh код 5, этот код обеспечит после выполнения сброса процессора передачу управления по адресу, подготовленному нами
; в области данных BIOS по адресу 0040h:0067h. ; Для того, чтобы немаскируемые прерывания были запрещены, ; устанавливаем в 1 старший бит при определении ячейки CMOS. cli mov out jmp
al,8f CMOS_PORT,al next1
; небольшая задержка
mov out
al,5 CMOS_PORT+1,al
; код возврата
next1:
ret ENDP
init_protected_mode
; -----------------------------------------------------------; Процедура переключает процессор в защищѐнный режим ; -----------------------------------------------------------PROC
set_protected_mode
NEAR
mov mov
ax,[rl_crt] es,ax
; записываем в es сегментный ; адрес видеопамяти
call
enable_a20
; открываем адресную линию A20
mov mov
[real_ss],ss [real_es],es
; запоминаем указатель стека ; для реального режима
; Загружаем регистр GDTR lgdt
[QWORD gdt_gdt]
; Устанавливаем защищѐнный режим работы процессора mov lmsw
ax,VIRTUAL_MODE ax
; Мы находимся в защищѐнном режиме ; ; ; ;
Очищаем внутреннюю очередь команд процессора Выполняем команду межсегментного прерхода, в качестве селектора указываем селектор текущего сегмента кода, в качестве смещения - метку flush
;
jmp db dw dw
far flush 0ea OFFSET flush CS_DESCR
LABEL
flush
FAR
; Загружаем сегментные регистры SS и DS селекторами mov mov mov mov ret ENDP
ax,SS_DESCR ss,ax ax,DS_DESCR ds,ax
set_protected_mode
; -----------------------------------------------------------; Процедура возвращает процессор в реальный режим ; -----------------------------------------------------------PROC
set_real_mode
NEAR
; Запоминаем содержимое указателя стека, так как после ; сброса процессора оно будет потеряно mov
[real_sp],sp
; Выполняем сброс процессора mov out
al,SHUT_DOWN STATUS_PORT,al
; Ожидаем сброса процессора wait_reset: hlt jmp
wait_reset
; ------->> В это место мы попадѐм после сброса процессора, ; теперь мы снова в реальном режиме LABEL
shutdown_return FAR
; Инициализируем ds адресом сегмента данных mov mov assume
ax,DGROUP ds,ax ds:DGROUP
; Восстанавливаем указатель стека mov mov
ss,[real_ss] sp,[real_sp]
; Восстанавливаем содержимое регистра es mov
es,[real_es]
; Закрываем адресную линию A20 call
disable_a20
; Разрешаем все прерывания
ENDP
mov out
ax,000dh CMOS_PORT,al
; разрешаем немаскируемые прерывания
in and out sti
al,INT_MASK_PORT ; разрешаем маскируемые прерывания al,0 INT_MASK_PORT,al
ret set_real_mode
; -----------------------------------------------------------; Процедура открывает адресную линию A20 ; ------------------------------------------------------------
PROC
ENDP
enable_a20 NEAR mov al,A20_PORT out STATUS_PORT,al mov al,A20_ON out KBD_PORT_A,al ret enable_a20
; -----------------------------------------------------------; Процедура закрывает адресную линию A20 ; -----------------------------------------------------------PROC
ENDP
disable_a20 NEAR mov al,A20_PORT out STATUS_PORT,al mov al,A20_OFF out KBD_PORT_A,al ret disable_a20
; -----------------------------------------------------------; Процедура выполняет небольшую временную задержку ; -----------------------------------------------------------PROC
pause push mov
cx cx,50
NEAR
push xor
cx cx,cx
loop pop loop
ploop1 cx ploop0
pop ret pause
cx
ploop0: ploop1:
ENDP
; -----------------------------------------------------------; Сегмент данных для процедур обслуживания видеоадаптера ; -----------------------------------------------------------DATASEG columns db rows db
80d 25d
; количество столбцов на экране ; количество строк на экране
rl_crt dw vir_crt dw
COLOR_SEG CRT_DESCR
; сегментный адрес видеобуфера ; селектор видеобуфера
curr_line
dw
; номер текущей строки
0d
CODESEG ; -----------------------------------------------------------; Определение базового адреса видеобуфера ; -----------------------------------------------------------PROC
set_crt_base
NEAR
; Определяем количество столбцов на экране и записываем ; в переменную columns
mov mov mov mov
ax,40 es,ax bx,[WORD es:4a] [columns],bl
; То же для количества строк, записываем в переменную rows mov inc mov
bl,[BYTE es:84] bl [rows],bl
; Для того чтобы определить тип видеоконтроллера (цветной ; или монохромный), считываем адрес микросхемы 6845 mov cmp je
bx,[WORD es:PORT_6845] bx,COLOR_PORT set_crt_exit
; Если видеоконтроллер монохромный, изменяем адрес сегмента ; и селектор, заданные по умолчанию mov mov
[rl_crt],MONO_SEG [vir_crt],MDA_DESCR
set_crt_exit: ret ENDP set_crt_base ; ; ; ; ; ; ; ; ;
-----------------------------------------------------------Вывод строки на экран Параметры: (ax, bx) - координаты (x, y) выводимой строки ds:si - адрес выводимой строки cx - длина выводимой строки dh - атрибут выводимой строки es - сегмент или селектор видеопамяти ------------------------------------------------------------
PROC
writexy push si push di
NEAR
; Вычисляем смещение в видеобуфере для записи строки, ; используем формулу ((y * columns) + x) * 2 mov mul add shl mov mov
dl,[columns] dl ax,bx ax,1 di,ax ah,dh ; записываем в ah байт атрибута
; Выполняем запись в видеобуфер wxy_write: lodsb stosw loop pop pop ret
; очередной символ в al ; записываем его в видеопамять wxy_write ; цикл до конца строки di si
ENDP
writexy
; -----------------------------------------------------------; Процедура стирания экрана ; Параметр: bh - атрибут для заполнения экрана ; -----------------------------------------------------------PROC
ENDP
clrscr xor mov mov mov int ret clrscr
NEAR cx,cx dl,[columns] dh,[rows] ax,0600h 10h
DATASEG hello_msg db " Protected mode monitor *TINY/OS*, v.1.0 for CPU 80286 ¦ © Frolov A.V., 1992 " CODESEG ; -----------------------------------------------------------; Процедура выводит сообщение в защищѐнном режиме ; -----------------------------------------------------------PROC
write_hello_msg NEAR mov mov
ax,[vir_crt] es,ax
; загружаем селектор видеопамяти ; в регистр es
; Выводим сообщение в верхний левый угол экрана (x=y=0) mov mov inc
bx,0 ax,[curr_line] [curr_line]
;(X,Y) = (AX,BX) ; увеличиваем номер текущей строки
; Загружаем адрес выводимой строки и еѐ длину
ENDP
mov mov
si,OFFSET hello_msg cx,SIZE hello_msg
mov
dh,30h
call
writexy ; выводим строку
; аттрибут - черный текст на голубом фоне
ret write_hello_msg
CSEG_SIZE
= ($ - start) ; размер сегмента кода
DATASEG DSEG_SIZE END
= ($ - DSEG_BEG) ; размер сегмента данных start
3.О Б Р А Б О ТК А П Р ЕР Ы В А Н И Й В ЗА Щ И Щ ЁН Н О М Р ЕЖ И М Е М ехан и зм обр аб отки п рер ы ван и й в защ и щ ѐн н ом реж и м е си л ьн о отли чается от м ехан и зм а р еал ьн ого р еж и м а. Д о си х п ор м ы н и чего н е говори л и о п р ер ы ван и ях, в п р и ведѐн н ом вы ш е п ри м ере п р огр ам м ы п ер ед п ер еход ом в защ и щ ѐн н ы й р еж и м м ы п р осто зам аски р овал и все п р еры ван и я. О д н ако такой сп особ "р еш ен и я" п р об л ем ы п р ер ы ван и й п одход и т н е всегд а. В этой гл аве м ы р асскаж ем вам о том , как н ад о р аб отать с п р ер ы ван и ям и в защ и щ ѐн н ом р еж и м е и п ри вед ѐм соответствую щ и й п ри м ер п р огр ам м ы . В ы н аучи тесь об р аб аты вать в защ и щ ѐн н ом р еж и м е н е тол ько п р огр ам м н ы е п р ер ы ван и я, н о и ап п аратн ы е, что н еоб ход и м о, в частн ости , д л я созд ан и я д р ай вер ов.
3.1. П р ер ы ван и я в р еал ьн о м р еж и м е В гл аве 4 п ер вой кн и ги п ер вого том а сери и "Б и б л и отека си стем н ого п р ограм м и ста", котор ы й н азы вается "О п ер ац и он н ая си стем а M S -D O S ", м ы п од р обн о рассказали об особ ен н остях об р аб отки п р ер ы ван и й в р еал ьн ом р еж и м е. Н ап ом н и м тол ько осн овн ы е м ом ен ты . В р еал ьн ом р еж и м е и м ею тся п р огр ам м н ы е и ап п ар атн ы е п р ер ы ван и я. П р огр ам м н ы е п р ер ы ван и я и н и ц и и р ую тся ком ан д ой IN T , ап п аратн ы е - вн еш н и м и соб ы ти ям и , аси н хр он н ы м и п о отн ош ен и ю к вы п ол н яем ой п р огр ам м е. О б ы чн о ап п ар атн ы е п р ер ы ван и я и н и ц и и р ую тся ап п аратур ой ввод а/вы вод а п осле завер ш ен и я вы п олн ен и я текущ ей оп ер ац и и . К р ом е того, н екотор ы е п р еры ван и я зар езер ви р ован ы д л я и сп ол ьзован и я сам и м п р оц ессор ом - п р ер ы ван и я п о ош и б ке д ел ен и я, п р ер ы ван и я д л я п ош аговой р аб оты , н ем аски р уем ое п р ер ы ван и е и т.д . Д л я об р аб отки п р ер ы ван и й в р еал ьн ом р еж и м е п р оц ессор и сп ол ьзует таб л и ц у вектор ов п р еры ван и й . Э та таб ли ц а р асп олагается в сам ом н ачал е оп ер ати вн ой п ам яти , т.е. еѐ ф и зи чески й ад р ес - 00000. Т аб л и ц а вектор ов п р ер ы ван и й р еал ьн ого р еж и м а состои т и з 256 эл ем е н тов п о 4 б ай та, таки м об р азом еѐ разм ер составл яет 1 ки л об ай т. Э л ем ен ты таб ли ц ы - д ал ьн и е указател и н а п р оц ед ур ы об р аб отки п р ер ы ван и й . У казател и состоят и з 16 -б и тового сегм ен тн ого ад р еса п р оц ед ур ы об раб отки п рер ы ван и я и 16 -б и тового см ещ ен и я. П р и чѐм см ещ ен и е хр ан и тся п о м л ад ш ем у ад р есу, а сегм ен тн ы й ад рес - п о стар ш ем у. К огд а п р ои сходи т п р огр ам м н ое и л и ап п ар атн ое п р ер ы ван и е, текущ ее сод ер ж и м ое р еги стр ов C S , IP а такж е р еги стр а ф л агов FLA G S зап и сы вается в стек п р ограм м ы (котор ы й , в свою очер ед ь, ад р есуется р еги стр овой п ар ой S S :S P ). Д ал ее и з таб ли ц ы вектор ов п р ер ы ван и й вы б и раю тся н овы е зн ачен и я д л я C S и IP , п р и этом уп р авл ен и е п ер ед аѐтся н а п р оц ед ур у об раб отки п р еры ван и я. П ер ед вход ом в п р оц ед ур у об р аб отки п р еры ван и я п р и н уд и тел ьн о сб р асы ваю тся ф лаж ки тр асси р овки T F и р азр еш ен и я п р ер ы ван и й IF. П оэтом у если ваш а п р оц ед ура п р ер ы ван и я сам а д ол ж н а б ы ть п р еры ваем ой , вам н еобход и м о разр еш и ть п р еры ван и я ком ан д ой S T I. В п р оти вн ом сл учае, д о завер ш ен и я п р оц ед ур ы об р аб отки п р ер ы ван и я все п р еры ван и я буд ут зап р ещ ен ы . Завер ш и в об раб отку п р ер ы ван и я, п р оц ед ур а д ол ж н а вы д ать ком ан д у IR E T , п о котор ой и з стека б уд ут и звл ечен ы зн ачен и я д л я C S , IP , FLA G S и загр уж ен ы в соответствую щ и е р еги стр ы . Д ал ее вы п олн ен и е п р ер ван н ой п р огр ам м ы б уд ет п р од олж ен о. Ч то ж е касается ап п ар атн ы х м аски р уем ы х п р ер ы ван и й , то в ком п ью тере IB M A T и совм ести м ы х с н и м сущ ествует всего ш естн ад ц ать таки х п р еры ван и й , об озн ачаем ы х IR Q 0 -IR Q 15. В р еал ьн ом р еж и м е д л я об р аб отки п р ер ы ван и й IRQ0-IR Q 7 и сп ол ьзую тся вектор а п р ер ы ван и й от 08h д о 0Fh, а д л я IR Q 8 -IRQ15 - от 70h д о 77h .
3 .2 . П р ер ы ван и я защ и щ ѐн н о го р еж и м а В защ и щ ѐн н ом р еж и м е все п рер ы ван и я р азд ел яю тся н а д ва ти п а - об ы чн ы е п рер ы ван и я и и скл ю чен и я (excep tion - и скл ю чен и е, особы й сл учай ).
О б ы чн ое п рер ы ван и е и н и ц и и р уется ком ан д ой IN T (п р огр ам м н ое п р ер ы ван и е) и л и вн еш н и м соб ы ти ем (ап п ар атн ое п р еры ван и е). П ер ед п ер ед ачей уп равл ен и я п р оц ед ур е об р аб отки об ы чн ого п р еры ван и я ф л аг р азр еш ен и я п р ер ы ван и й IF сбр асы вается и п р ер ы ван и я зап р ещ аю тся. И скл ю чен и е п р ои сход и т в р езул ьтате ош и б ки , возн и каю щ ей п ри вы п ол н ен и и како й -л и б о ком ан д ы , н ап ри м ер , есл и ком ан д а п ы тается вы п олн и ть зап и сь д ан н ы х за п р ед ел ам и сегм ен та д ан н ы х и ли и сп ол ьзует д л я ад ресац и и сел ектор , которы й н е оп р едел ѐн в таб ли ц е д ескри п торов. П о свои м ф ун кц и ям и скл ю чен и я соответствую т зар езерви р ован н ы м д л я п р оц ессор а вн утр ен н и м п р ер ы ван и ям р еал ьн ого р еж и м а. К огд а п р оц ед ур а об раб отки и скл ю чен и я п ол учает уп р авлен и е, ф л аг IF н е и зм ен яется. П оэтом у в м ул ьти зад ачн ой ср ед е особ ы е сл учаи , возн и каю щ и е в отд ел ьн ы х задачах, н е оказы ваю т вл и ян и я н а вы п ол н ен и е остал ьн ы х зад ач . В защ и щ ѐн н ом р еж и м е п р ер ы ван и я м огут п р и вод и ть к п ерекл ю чен и ю зад ач. О зад ачах и м ул ьти зад ачн ости м ы б уд ем говор и ть в сл ед ую щ ей гл аве. Т еп ер ь п ер ей д ѐм к р ассм отрен и ю м ехан и зм а об раб отки п рер ы ван и й и и скл ю чен и й в защ и щ ѐн н ом р еж и м е.
Т аб л и ц а п р ер ы в ан и й защ и щ ѐн н о го р еж и м а О б р аб отка п р ер ы ван и й и и скл ю чен и й в защ и щ ѐн н ом р еж и м е п о ан ал оги и с р еал ьн ы м р еж и м ом бази руется н а таб ли ц е п р ер ы ван и й . Н о табл и ц а п р еры ван и й защ и щ ѐн н ого р еж и м а является таб л и ц ей д ескр и п тор ов, котор ая сод ер ж и т так н азы ваем ы е вен ти л и п р ер ы в ан и й , вен ти ли и скл ю чен и й и вен ти л и зад ач. Т аб л и ц а п р еры ван и й защ и щ ѐн н ого реж и м а н азы вается д ескр и п тор н ой таб ли ц ей п р ер ы ван и й ID T (In terru p t D escrip tor T ab le). Т акж е как и табл и ц ы G D T и LD T , таб ли ц а ID T сод ерж и т 8 -б ай товы е д ескр и п тор ы . П ри чѐм это си стем н ы е д ескр и п тор ы - вен ти л и п р ер ы ван и й , и скл ю чен и й и зад ач. П ол е T Y P E вен ти ля п р ер ы ван и я сод ер ж и т зн ачен и е 6, а вен ти л я и скл ю чен и я - зн ачен и е 7. Ф ор м ат эл ем ен тов д ескри п торн ой таб л и ц ы п р ер ы ван и й ID T п оказан н а р и с. 12.
Р и с. 12. Ф ор м ат эл ем ен тов д ескр и п тор н о й таб л и ц ы п рер ы ван и й ID T . Гд е расп ол агается д ескр и п торн ая таб л и ц а п р ер ы ван и й ID T ? Е ѐ р асп ол ож ен и е оп р ед ел яется сод ер ж и м ы м 5 -бай тового вн утрен н его р еги стра п р оц ессор а ID T R . Ф ор м ат р еги стр а ID T R п ол н остью ан ал оги чен ф ор м ату р еги стр а G D T R , д л я его загр узки и сп ол ьзуется ком ан д а LID T . Т ак ж е, как р еги стр G D T R сод ерж и т 24 -б и товы й ф и зи чески й ад р ес таб ли ц ы G D T и еѐ п р ед ел , так и р еги стр ID T R сод ер ж и т 24 -б и товы й ф и зи чески й ад р ес д ескр и п торн ой табл и ц ы п р еры ван и й ID T и еѐ п ред ел . Р еги стр ID T R об ы чн о загр уж аю т п ер ед п ер еход ом в защ и щ ѐн н ы й р еж и м . Р азум еется, это м ож н о сд ел ать и п отом , н аход ясь в защ и щ ѐн н ом р еж и м е. О д н ако д л я этого п р ограм м а д ол ж н а р аб отать в п р и ви л еги р ован н ом н ул евом кол ьц е.
И скл ю ч ен и я в защ и щ ѐн н о м р еж и м е
Д л я об р аб отки особ ы х си туац и й - и скл ю чен и й - р азр аб отчи ки п р оц ессор а i80286 зар езер ви р овали 31 н ом ер п р ер ы ван и я. В таб ли ц е 3 п ри вед ѐн п олн ы й сп и сок зар езерви р ован н ы х п рер ы ван и й защ и щ ѐн н ого р еж и м а. Т аб л и ц а 4. Зар езерви р ован н ы е п рер ы ван и я защ и щ ѐн н ого реж и м а. 00h
О ш и б ка п р и вы п ол н ен и и ком ан д ы д ел ен и я.
01h
П р ер ы ван и е д л я п ош аговой раб оты , и сп ол ьзуется отл ад чи кам и .
02h
Н ем аски р уем ое п р ер ы ван и е.
03h
П р ер ы ван и е п о точке остан ова д л я отл ад чи ков.
04h
П ер еп ол н ен и е, ген ери р уется ком ан д ой IN T O , есл и устан овл ен ф л аг O F.
05h
Ген ер и руется п ри вы п олн ен и и м аш и н н ой ком ан д ы B O U N D , есл и п р оверяем ое зн ачен и е вы ш л о за п р ед ел ы зад ан н ого д и ап азон а.
06h
Н ед ей стви тел ьн ы й код оп ер ац и и , и ли д ли н а ком ан д ы б ол ьш е 10 б ай т.
07h
О тсутстви е ари ф м ети ческого соп р оц ессор а.
08h
Д вой н ая ош и б ка, вы р аб аты вается в том сл учае, если п р и об р аб отке и склю чен и я возн и кл о ещ ѐ одн о и скл ю чен и е. Е сл и во вр ем я об р аб отки этого п р ер ы ван и я возн и кает тр етье и скл ю чен и е, п р оц ессор п ер еходи т в состоян и е отклю чен и я, что п р и вод и т к п ер езап уску п р оц ессор а.
09h
П р евы ш ен и е сегм ен та ар и ф м ети чески м соп р оц ессор ом .
0Ah
Н ед ей стви тел ьн ы й сегм ен т состоян и я зад ачи T S S .
0Bh
О тсутстви е сегм ен та. В ы р аб аты вается п ри п оп ы тке и сп ол ьзовать д л я ад ресац и и д ескр и п тор , у котор ого би т п ри сустви я сегм ен та в п ам яти P сб р ош ен в 0. Э то п р ер ы ван и е и сп ол ьзуется д л я р еали зац и и м ехан и зм а ви ртуал ьн ой п ам яти . В этом сл учае п о п р ер ы ван и ю 0B h оп ер ац и он н ая си стем а м ож ет вы п ол н и ть п од качку отсутствую щ его сегм ен та в п ам ять.
0Ch
И скл ю чен и е п р и р аб оте со стеком . М ож ет возн и кать в сл учае отсутстви я сегм ен та стека в п ам яти и л и в сл учае п ереп ол н ен и я (ан ти п ереп олн ен и я) стека.
0Dh
И скл ю чен и е п о защ и те п ам яти . В озн и кает п ри лю б ы х п оп ы тках п олучен и я д оступ а к сегм ен там п ам яти , есл и п р ограм м а об л ад ает н ед остаточн ы м ур овн ем п ри ви л еги й .
0Eh
О тказ стр ан и ц ы д л я п р оц ессор ов i80386 и л и i8048 6, зар езер ви р ован о д л я i80286.
0Fh
Зар езер ви р ован о.
10h
И скл ю чен и е соп р оц ессора.
11h - 1Ah
Зар езер ви р ован ы .
П ер ед тем , как п ер едать уп р авл ен и е об р аб отчи ку и склю чен и я, д л я м н оги х зар езерви р ован н ы х п р ер ы ван и й п р оц ессор п ом ещ ает в стек 16 -б и товы й код о ш и б ки . Э тот код ош и б ки п р огр ам м а м ож ет п р оан ал и зи р овать и тем сам ы м п олучи ть н екотор ую д оп ол н и тел ьн ую и н ф ор м ац и ю об ош и б ке. Ф ор м ат код а ош и бки п ри вед ѐн н а р и с. 13.
Р и с. 13. Ф ор м ат код а ош и б ки п р оц ессор а i80286. П ол е и н д екса сод ер ж и т и н д екс д ескр и п тора , п ри обр ащ ен и и к котор ом у п р ои зош л а ош и б ка. П ол е I, равн ое 1, озн ачает, что этот и н д екс отн оси тся к таб ли ц е ID T . В этом сл учае п р ои зош л а ош и бка п ри об р аб отке п р ер ы ван и я и л и и скл ю чен и я. Е сл и б и т I равен 0, п ол е T I вы би р ает таб л и ц у д ескри п тор ов (G D T и л и LD T ) п о ан алоги и с соответствую щ и м п ол ем селектора. Б и т E X T устан авл и вается в том сл учае, когд а ош и б ка п р ои зош л а н е в р езул ьтате вы п ол н ен и я текущ ей ком ан д ы , а п о вн еш н и м отн оси тел ьн о вы п ол н яем ой п р огр ам м ы п р и чи н ам . Н ап ри м ер, п р и об р аб отке ап п ар атн ого п р ер ы ван и я от устр ой ства ввод а/вы вод а п р ои зош л о об р ащ ен и е к отсутствую щ ем у в п ам яти сегм ен ту (у котор ого в д ескри п тор е сб р ош ен б и т п р и сутстви я P).
К ак м ы тол ько что говор и л и , код ы ош и б ок вкл ю чаю тся в стек н е д л я всех и скл ю чен и й . П р ограм м а см ож ет п р оан ал и зи р овать этот код тол ько д л я сл ед ую щ и х и скл ю чен и й :
08h - д вой н ая ош и б ка; 0Ah - н ед ей стви тел ьн ы й T S S ; 0Bh - отсутстви е сегм ен та в п ам яти ; 0Ch - и скл ю чен и е п р и р аб оте со стеком ; 0Dh - и склю чен и е п о защ и те п ам яти .
Зам ети м , что ан ал ога код у ош и б ки д л я зар езер ви р ован н ы х п р ер ы ван и й в р еальн ом р еж и м е н ет. К р ом е того, н овы м п ри об р аб отке п р ер ы ван и й в защ и щ ѐн н ом р еж и м е явл яется свой ство зап ускаем ости и склю чен и й . С вой ством п овторн ой зап ускаем ости об л ад аю т н е все и скл ю чен и я.
п овторн ой
Ч то такое п овторн ая зап ускаем ость? П оясн и м это н а кон кр етн ом п р и м ер е. П усть в н аш ей си стем е р еал и зован а ви ртуал ьн ая п ам ять. П р огр ам м а в н екоторы й м ом ен т вр ем ен и об р ати л ась к отсутствую щ ем у в оп ер ати вн ой п ам яти сегм ен ту, вы д ав какую -л и б о ком ан д у, н ап ри м ер M O V и л и A D D . В озн и кл о и склю чен и е 0B h - отсутстви е сегм ен та в п ам яти . О б раб отчи к этого и склю чен и я, вход ящ и й в состав оп ер ац и он н ой си стем ы вы п ол н и л своп и н г соответствую щ его сегм ен та в оп ерати вн ую п ам ять. Ч то д ал ьш е? А д ал ьш е бы л о б ы н еп л охо п овтор и ть вы п ол н ен и е п р ер ван н ой ком ан д ы ! Э то м о ж н о сд ел ать, так как д л я всех п овтор н о зап ускаем ы х и скл ю чен и й (кр ом е 03h - п р ер ы ван и е п о точке остан ова и 04h - п ер еп ол н ен и е) в стек вкл ю чается ад рес н е сл ед ую щ ей за п р ер ван н ой ком ан д ой , а ад р ес п ер вого бай та ком ан д ы , котор ая вы звал а и скл ю чен и е. В ы п ол н и в к ом ан д у IR E T , п р огр ам м а об р аб отки и скл ю чен и я вн овь п ер ед аст уп р авлен и е п р ерван н ой ком ан д е. С вой ством п овторн ой зап ускаем ости об л ад ает б ол ьш и н ство зар езер ви р ован н ы х п р ер ы ван и й , кр ом е сл едую щ и х:
01h - п р ер ы ван и е д л я п ош аговой р аб оты ; 08h - д вой н ая ош и б ка; 09h - п р евы ш ен и е сегм ен та соп р оц ессор ом ; 0Dh - и склю чен и е п о защ и те п ам яти ; 10h - и скл ю чен и е соп р оц ессор а.
О б р аб о тка ап п ар атн ы х п р ер ы в ан и й В сп ом н и те д и ап азон н ом ер ов п р еры ван и й , и сп ол ьзуем ы й в р еал ьн ом р еж и м е в ком п ью тер ах IB M P C : д л я об р аб отки п р ер ы ван и й IR Q 0 -IR Q 7 и сп ол ьзую тся н ом ер а п рер ы ван и й от 08h д о 0Fh , а д л я IR Q 8 -IRQ15 - от 70h д о 77h. Н о в защ и щ ѐн н ом р еж и м е н ом ер а от 08h д о 0Fh зар езерви р ован ы д л я об р аб отки и скл ю чен и й ! К счастью , и м еется п р остой сп особ п ер еп р огр ам м и р ован и я кон тр ол л ер а п р ер ы ва н и й н а л ю б ой др угой д и ап азон н ом ер ов вектор ов ап п ар атн ы х п р ер ы ван и й . Н ап р и м ер , ап п ар атн ы е п рер ы ван и я м ож н о р асп ол ож и ть ср азу за п р ер ы ван и ям и , зар езер ви р ован н ы м и д л я об р аб отки и скл ю чен и й . П осл е возвр ата п р оц ессор а в р еал ьн ы й р еж и м н еоб ходи м о восстан ови ть состоян и я кон тр ол л ер а п р ер ы ван и й . Е сл и п р и п од готовке к возврату в р еал ьн ы й р еж и м м ы зап и сали в C M O S -п ам ять б ай т состоян и я отклю чен и я со зн ачен и ем 5, п осл е сб р оса B IO S сам п ер еп р огр ам м и р ует кон тр ол л ер п р ер ы ван и й д л я р аботы в р еал ьн ом р еж и м е и н ам н е н ад о об этом б есп окои ться. В п р оти вн ом сл учае п р огр ам м а д ол ж н а устан ови ть п р ави л ьн ы е н ом ер а д л я ап п ар атн ы х п р ер ы ван и й р еальн ого реж и м а.
3 .3 . П р о гр ам м а, ко то р ая р аб о тает с п р ер ы ван и я м и
С л ед ую щ ая п р ограм м а, котор ую м ы вам п р ед стави м , вы п ол н яет все н еобход и м ы е д ей стви я, связан н ы е с об р аб откой п р ер ы ван и й и и скл ю чен и й в защ и щ ѐн н ом р еж и м е. Н аш а п ер вая п р огр ам м а (ли сти н г 1) р аб отала в защ и щ ѐн н ом р еж и м е с зап р ещ ѐн н ы м и п рер ы ван и ям и . О н а как б ы п р ол етал а чер ез н еи звед ан н ое с завязан н ы м и гл азам и и ср азу ж е возвр ащ ал ась в х ор ош о освоен н ы й р еал ьн ы й р еж и м . Т еп ер ь ж е п р огр ам м а и м еет возм ож н ость "осм отр еться" и м ож ет реаги р овать н а таки е соб ы ти я, как п р ер ы ван и я от кл ави атур ы и тай м ера. К р ом е того, в сл учае возн и кн овен и я и скл ю чен и й вам буд ет вы д ан а н екотор ая д и агн ости ка, вклю чаю щ ая код и скл ю чен и я, код ош и б ки и сод ерж и м ое р еги стр ов п р оц ессор а н а м ом ен т возн и кн овен и я и скл ю чен и я. Т аб л и ц а ID T сод ерж и т д ескр и п тор ы д л я об раб отчи ков и скл ю чен и й и ап п аратн ы х п р еры ван и й . В ен ти ли и скл ю чен и й сод ер ж ат ссы л ки н а п р огр ам м ы с и м ен ам и exc_00...e xc_1F. В сл ед за вен ти л ям и и скл ю чен и й в таб ли ц е ID T сл ед ую т вен ти ли ап п ар атн ы х п р еры ван и й . И з н и х зад ей ствован ы тол ько IR Q 0 и IR Q 1 - п р еры ван и я от тай м ер а и кл ави атур ы . Т е ап п ар атн ы е п р еры ван и я, котор ы е н ас н е и н тер есую т, п ри вод ят к вы д аче в кон тр ол лер ы п р ер ы ван и я ком ан д ы кон ц а п р еры ван и я. Д л я таки х п р ер ы ван и й п ред усм отр ен ы загл уш ки - п р оц ед ур ы с и м ен ам и d u m m y_iret0 и d u m m y_iret1. П ер вая загл уш ка отн оси тся к п ервом у кон тр ол л ер у п р еры ван и я, втор ая - ко втор ом у. В сл ед за вен ти л ям и ап п аратн ы х п р ер ы ван и й м ы п о м ести л и в таб л и ц у ID T вен ти л ь п рогр ам м н ого п р ер ы ван и я int 30h , п р ед н азн ачен н ого д ля ор ган и зац и и взаи м од ей стви я с кл ави атур ой н а м ан ер п рер ы ван и я B IO S IN T 16h. П р и вы д аче п р ер ы ван и я in t 30h вы зы вается п р оц едур а с и м ен ем In t_30h _E n try. П осл е зап уска п р огр ам м а п ереход и т в защ и щ ѐн н ы й р еж и м и р азм аски р ует п р ер ы ван и я от тай м ер а и клави атур ы . Д ал ее он а вы зы вает в ц и кл е п р ер ы ван и е in t 30h (ввод си м вол а с кл ави атур ы ), и вы вод и т н а экр ан скан -код н аж атой кл ави ш и и состоян и е п ерекл ю чаю щ и х клави ш (таки х, как C ap sLock, In s, и т.д.). Е сл и окаж ется н аж атой кл ави ш а E S C , п р огр ам м а вы ход и т и з ц и кл а. Д ал ее в тексте п р огр ам м ы сл ед ует р яд ком ан д , закр ы ты х си м вол ом ком м ен тар и я. Э ти ком ан ды п р и вод ят к и скл ю чен и ю . В ы м ож ете п оп р об овать и х р аб оту, уд али в соответствую щ и й си м вол ком м ен тар и я. П ри возн и кн овен и и и скл ю чен и я н а экран б уд ет вы вед ен а д и агн ости ка, о чѐм п озаб оти тся об р аб отчи к и скл ю чен и й . П ер ед заверш ен и ем р аб оты п р огр ам м а устан авл и вает р еальн ы й р еж и м п р оц ессора и сти р ает экр ан . О б р аб отчи к ап п аратн ого п р еры ван и я кл ави атур ы - п р оц ед ур а с и м ен ем K eyb _in t. П осл е п р и ход а п р еры ван и я он а вы д аѐт кор отки й звуковой си гн ал , счи ты вает и ан али зи рует скан -код клави ш и , вы звавш ей п р ер ы ван и е. С кан код ы кл асси ф и ц и р ую тся н а об ы чн ы е и р асш и р ен н ы е (д л я 101 -кл ави ш н ой кл ави атур ы ). В отл и чи е от п р ер ы ван и я BIOS INT 16h , м ы д л я п р остоты н е стал и р еал и зовы вать очер ед ь, а огр ан и чи ли сь зап и сью п ол учен н ого скан -код а в гл обал ьн ую ячей ку п ам яти key_cod e. П р и чѐм п р ер ы ван и я, возн и каю щ и е п р и отп ускан и и кл ави ш и гн ор и р ую тся. Зап и сь скан -код а в ячей ку key_cod e вы п ол н яет п р оц ед ур а K eyb _P u tQ . П осл е зап и си эта п р оц ед ур а устан авл и вает п р и зн ак того, что бы л а н аж ата кл ави ш а - зап и сы вает зн ачен и е 0FFh в гл обал ьн ую п ер ем ен н ую key_flag . П р огр ам м н ое п р ер ы ван и е in t 30h оп р аш и вает состоян и е key_flag . Е сл и этот ф л аг оказы ва ется устан овл ен н ы м , он сб р асы вается, всл ед за чем об р аб отчи к in t 30h зап и сы вает в р еги стр A X скан -код н аж атой кл ави ш и , в р еги стр B X - состоян и е п ер еклю чаю щ и х кл ави ш н а м ом ен т н аж ати я кл ави ш и , код котор ой п ер едан в р еги стр е A X . Д л я того чтоб ы н е загр ом ож да ть п р огр ам м у втор остеп ен н ы м и д етал ям и , м ы н е стали п ер екод и р овать скан -код в код A S C II, вы см ож ете п р и н еоб ход и м ости сд елать это сам и . О б р аб отчи к п р ер ы ван и й тай м ер а - п р оц ед ур а с и м ен ем T im er_in t. Э та п р оц едур а п ри м ерн о р аз в секун д у вы д аѐт звуковой си гн ал, чем еѐ д ей стви я и огр ан и чи ваю тся. П р оц ед ур а rd u m p вы вод и т н а экр ан сод ер ж и м ое реги стр ов п р оц ессор а и м ож ет б ы ть и сп ол ьзован а д л я отл ад ки п р огр ам м ы . О б р ати те вн и м ан и е н а и сп ол ьзован н ы й сп особ возвр ата п роц ессор а в р еал ьн ы й р еж и м :
DATASEG ; Пустой дескриптор для выполнения возврата
; процессора в реальный режим через перевод ; его в состояние отключения. null_idt idt_struc <> CODESEG PROC
set_rmode mov
; ; ; ; ;
NEAR
[real_sp],sp
Переводим процессор в состояние отключения, это эквивалентно аппаратному сбросу, но выполняется быстрее. Сначала мы загружаем IDTR нулями, затем выдаѐм команду прерывания. lidt int
[FWORD null_idt] 3
hlt jmp
rwait
rwait:
LABEL
shutdown_return FAR
Р еги стр ID T R загр уж ается н ул ям и , сл ед овател ьн о, п р ед ел д ескр и п торн ой таб ли ц ы п р ер ы ван и й р авен н ул ю . П осл е этого м ы вы д аѐм ком ан д у п р ограм м н ого п р ер ы ван и я. П р и обр аб отке п рер ы ван и я возн и кает и склю чен и е, так как р еги стр ID T R и н и ц и ал и зи р ован н еп р ави л ьн о. Н о это и скл ю чен и е н е м ож ет б ы ть об р аб отан о п о той ж е п р и чи н е, что вы зы вает н овое и скл ю чен и е. Т еп ер ь п р оц ессор п ер еход и т уж е в состоян и е отклю чен и я и вы п олн яет р естар т в р еал ьн ом р еж и м е. Ч то н ам и тр еб овалось п ол учи ть! Д л я уд об ства м ы вы н если в отд ел ьн ы й ф ай л tin y-os.in c все н еоб ходи м ы е оп р ед ел ен и я структур д ан н ы х и кон стан т (ли сти н г 2). Ф ай л tiny-os.asm сод ер ж и т сам у п р ограм м у, текст котор ой п ри вед ѐн в ли сти н ге 3.
Листинг 2. Структуры данных и константы. ----------------------------------------------------------; -----------------------------------------------------------; Определения структур данных и констант ; -----------------------------------------------------------STRUC
ENDS STRUC
ENDS STRUC
desc_struc ; структура дескриптора limit dw 0 ; предел base_l dw 0 ; мл. слово физического адреса base_h db 0 ; ст. байт физического адреса access db 0 ; байт доступа rsrv dw 0 ; зарезервировано desc_struc idt_struc destoff dw 0 destsel dw 0 nparams db 0 assess db 0 rsrv dw 0 idt_struc
; ; ; ;
idtr_struc idt_lim dw idt_l dw idt_h db rsrv
; ; ; ; 0
0 0 0 db
вентиль прерывания смещение обработчика селектор обработчика кол-во параметров ; байт доступа ; зарезервировано регистр IDTR предел IDT мл. слово физического адреса ст. байт физического адреса ; зарезервировано
ENDS
idtr_struc
; --------------------------------------------------------------; Биты байта доступа ACC_PRESENT ACC_CSEG ACC_DSEG ACC_EXPDOWN ACC_CONFORM ACC_DATAWR ACC_INT_GATE ACC_TRAP_GATE
EQU EQU EQU EQU EQU EQU
10000000b ; сегмент есть в памяти EQU 00011000b ; сегмент кода EQU 00010000b ; сегмент данных 00000100b ; сегмент расширяется вниз 00000100b ; согласованный сегмент 00000010b ; разрешена запись 00000110b ; вентиль прерывания 00000111b ; вентиль исключения
; -----------------------------------------------------------; Типы сегментов ; сегмент данных DATA_ACC = ACC_PRESENT OR ACC_DSEG OR ACC_DATAWR ; сегмент кода CODE_ACC = ACC_PRESENT OR ACC_CSEG OR ACC_CONFORM ; сегмент стека STACK_ACC = ACC_PRESENT OR ACC_DSEG OR ACC_DATAWR OR ACC_EXPDOWN ; байт доступа сегмента таблицы IDT IDT_ACC
=
DATA_ACC
; байт доступа вентиля прерывания INT_ACC
=
ACC_PRESENT OR ACC_INT_GATE
; байт доступа вентиля исключения TRAP_ACC
=
ACC_PRESENT OR ACC_TRAP_GATE
; -----------------------------------------------------------; Константы STACK_SIZE B_DATA_SIZE B_DATA_ADDR MONO_SEG
0400 0300 0400 EQU
; размер стека ; размер области данных BIOS ; адрес области данных BIOS 0b000 ; сегмент видеопамяти ; монохромного
видеоадаптера COLOR_SEG
EQU
0b800
CRT_SIZE
EQU
4000
MONO_SIZE
EQU
1000
8000
; мл. байт физического адреса ; сегмента видеопамяти ; цветного видеоадаптера 0000 ; мл. байт физического адреса ; сегмента видеопамяти ; монохромного видеоадаптера
CRT_LOW MONO_LOW
EQU EQU EQU
EQU
EQU
; сегмент видеопамяти ; цветного видеоадаптера ; размер сегмента видеопамяти ; цветного видеоадаптера ; размер сегмента видеопамяти ; монохромного видеоадаптера
CRT_SEG
EQU
CMOS_PORT PORT_6845
0Bh EQU EQU
; ст. байт физического адреса ; сегмента видеопамяти 70h ; порт для доступа к CMOS-памяти 0063h ; адрес области данных BIOS, ; где записано значение
адреса COLOR_PORT EQU MONO_PORT видеоконтроллера STATUS_PORT EQU SHUT_DOWN VIRTUAL_MODE EQU A20_PORT A20_ON EQU A20_OFF EQU KBD_PORT_A EQU KBD_PORT_B EQU INT_MASK_PORT EQU EOI MASTER8259A EQU SLAVE8259A EQU
03d4h EQU
; порта контроллера 6845 ; порт цветного видеоконтроллера 03b4h ; порт монохромного
64h EQU 0001h EQU 0dfh 0ddh 60h 61h 21h EQU 20 0a0
; порт состояния клавиатуры 0feh ; команда сброса процессора ; бит перехода в защищѐнный режим 0d1h ; команда управления линией A20 ; открыть A20 ; закрыть A20 ; адреса клавиатурных ; портов ; порт для маскирования прерываний 20 ; команда конца прерывания ; первый контроллер прерываний ; второй контроллер прерываний
; -----------------------------------------------------------; Селекторы, определѐнные в таблице GDT DS_DESCR CS_DESCR SS_DESCR BIOS_DESCR CRT_DESCR MDA_DESCR
=
= (gdt_ds - gdt_0) = (gdt_cs - gdt_0) = (gdt_ss - gdt_0) (gdt_bio - gdt_0) = (gdt_crt - gdt_0) = (gdt_mda - gdt_0)
; -----------------------------------------------------------; Маски и инверсные маски для клавиш L_SHIFT NL_SHIFT
equ
0000000000000001b equ 1111111111111110b
R_SHIFT NR_SHIFT
equ
0000000000000010b equ 1111111111111101b
L_CTRL NL_CTRL
equ equ
0000000000000100b 1111111111111011b
R_CTRL NR_CTRL
equ equ
0000000000001000b 1111111111110111b
L_ALT NL_ALT
equ equ
0000000000010000b 1111111111101111b
R_ALT NR_ALT
equ equ
0000000000100000b 1111111111011111b
CAPS_LOCK SCR_LOCK NUM_LOCK INSERT
equ equ equ
0000000001000000b 0000000010000000b
equ 0000000100000000b 0000001000000000b
Листинг 3. Демонстрация обработки прерываний и исключений в защищѐнном режиме для процессора 80286
----------------------------------------------------------IDEAL RADIX P286 MODEL
16 LARGE
include 'tiny-os.inc' STACK
STACK_SIZE
DATASEG DSEG_BEG = THIS WORD real_ss dw real_sp dw real_es dw GDT_BEG = $ LABEL gdtr gdt_0 gdt_gdt gdt_idt gdt_ds gdt_cs gdt_ss gdt_bio gdt_crt gdt_mda
? ? ? WORD
desc_struc <0,0,0,0,0> desc_struc desc_struc desc_struc desc_struc desc_struc <STACK_SIZE-1,,,DATA_ACC,0> desc_struc desc_struc desc_struc <MONO_SIZE-1,MONO_LOW,CRT_SEG,DATA_ACC,0>
GDT_SIZE = ($ - GDT_BEG) ; Область памяти для загрузки регистра IDTR idtr
idtr_struc
; Таблица дескрипторов прерываний IDT_BEG = $ ; ---------------------- Вентили исключений -------------------idt
idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc
exc_00,CS_DESCR,0,TRAP_ACC,0> exc_01,CS_DESCR,0,TRAP_ACC,0> exc_02,CS_DESCR,0,TRAP_ACC,0> exc_03,CS_DESCR,0,TRAP_ACC,0> exc_04,CS_DESCR,0,TRAP_ACC,0> exc_05,CS_DESCR,0,TRAP_ACC,0> exc_06,CS_DESCR,0,TRAP_ACC,0> exc_07,CS_DESCR,0,TRAP_ACC,0> exc_08,CS_DESCR,0,TRAP_ACC,0> exc_09,CS_DESCR,0,TRAP_ACC,0> exc_0A,CS_DESCR,0,TRAP_ACC,0> exc_0B,CS_DESCR,0,TRAP_ACC,0> exc_0C,CS_DESCR,0,TRAP_ACC,0> exc_0D,CS_DESCR,0,TRAP_ACC,0> exc_0E,CS_DESCR,0,TRAP_ACC,0> exc_0F,CS_DESCR,0,TRAP_ACC,0> exc_10,CS_DESCR,0,TRAP_ACC,0> exc_11,CS_DESCR,0,TRAP_ACC,0> exc_12,CS_DESCR,0,TRAP_ACC,0> exc_13,CS_DESCR,0,TRAP_ACC,0>
idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc
exc_14,CS_DESCR,0,TRAP_ACC,0> exc_15,CS_DESCR,0,TRAP_ACC,0> exc_16,CS_DESCR,0,TRAP_ACC,0> exc_17,CS_DESCR,0,TRAP_ACC,0> exc_18,CS_DESCR,0,TRAP_ACC,0> exc_19,CS_DESCR,0,TRAP_ACC,0> exc_1A,CS_DESCR,0,TRAP_ACC,0> exc_1B,CS_DESCR,0,TRAP_ACC,0> exc_1C,CS_DESCR,0,TRAP_ACC,0> exc_1D,CS_DESCR,0,TRAP_ACC,0> exc_1E,CS_DESCR,0,TRAP_ACC,0> exc_1F,CS_DESCR,0,TRAP_ACC,0>
; --------------- Вентили аппаратных прерываний --------------; int 20h-IRQ0 idt_struc ; int 21h-IRQ1 idt_struc ; int 22h, 23h, 24h, 25h, 26h, 27h-IRQ2-IRQ7 idt_struc 6 dup () ; int 28h, 29h, 2ah, 2bh, 2ch, 2dh, 2eh, 2fh-IRQ8-IRQ15 idt_struc 8 dup () ; -------------------- Вентиль прерывания -------------------; int 30h idt_struc IDT_SIZE
= ($ - IDT_BEG)
CODESEG PROC
start mov mov call mov call
ax,DGROUP ds,ax set_crt_base bh, 77h clrscr
; Устанавливаем защищѐнный режим call call
set_pmode write_hello_msg
; Размаскируем прерывания от таймера и клавиатуры in and out
al,INT_MASK_PORT al,0fch INT_MASK_PORT,al
; Ожидаем нажатия на клавишу <ESC>
charin: int
30h
; ; ; ;
ожидаем нажатия на клавишу AX - скан-код клавиши, BX - состояние переключающих клавиш если <ESC> - выход из цикла
cmp jz
al, 1 continue
push mov call pop
bx bx, 0301h Print_Word bx
; выводим скан-код на экран ; координаты вывода
mov push mov call pop
ax, bx bx bx, 0306h Print_Word bx
; выводим состояние ; переключающих клавиш
jmp
charin
; Следующий байт находится в сегменте кода. ; Он используется нами для демонстрации возникновения ; исключения при попытке записи в сегмент кода. wrong1
db ?
continue: ; ; ; ; ;
После нажатия на клавишу <ESC> выходим в это место программы. Следующие несколько строк демонстрируют команды, которые вызывают исключение. Вы можете попробовать их, если уберѐте символ комментария из соответствующей строки.
; Попытка записи за конец сегмента данных. Метка wrong ; находится в самом конце программы. mov [wrong], al ; Попытка записи в сегмент кода. ; mov [wrong1], al ; Попытка извлечения из пустого стека. ; pop ax ; Загрузка в сегментный регистр неправильного селектора. ; mov ax, 1280h ; mov ds, ax ; Прямой вызов исключения при помощи команды прерывания. ; int 1
ENDP
call
set_rmode
; установка реального режима
mov call mov int
bh, 07h clrscr ah,4c 21h
; стираем экран и ; выходим в DOS
start
MACRO setgdtentry
mov mov
[(desc_struc bx).base_l],ax [(desc_struc bx).base_h],dl
ENDM ; ------------------------------------------; Установка защищѐнного режима ; ------------------------------------------PROC
set_pmode
NEAR
mov ax,DGROUP mov dl,ah shr dl,4 shl ax,4 mov si,ax mov di,dx add ax,OFFSET gdtr adc dl,0 mov bx,OFFSET gdt_gdt setgdtentry ; Заполняем дескриптор в GDT, указывающий на ; дескрипторную таблицу прерываний mov ax,si ; mov dx,di ; add ax,OFFSET adc dl,0 mov bx,OFFSET setgdtentry
загружаем 24-битовый адрес сегмента данных idt ; адрес дескриптора для IDT gdt_idt
; Заполняем структуру для загрузки регистра IDTR mov mov mov
bx,OFFSET idtr [(idtr_struc bx).idt_l],ax [(idtr_struc bx).idt_h],dl
mov bx,OFFSET gdt_ds mov ax,si mov dx,di setgdtentry mov bx,OFFSET gdt_cs mov ax,cs mov dl,ah shr dl,4 shl ax,4 setgdtentry mov bx,OFFSET gdt_ss mov ax,ss mov dl,ah shr dl,4 shl ax,4 setgdtentry ; готовим возврат в реальный режим push mov mov mov mov
ds ax,40 ds,ax [WORD 67],OFFSET shutdown_return [WORD 69],cs
pop
ds
cli mov out jmp
al,8f CMOS_PORT,al del1
mov out
al,5 CMOS_PORT+1,al
mov mov
ax,[rl_crt] es,ax
; сегмент видеопамяти
call
enable_a20
; открываем линию A20
mov mov
[real_ss],ss [real_es],es
; сохраняем сегментные ; регистры
del1:
; -------- Перепрограммируем контроллер прерываний -------; Устанавливаем для IRQ0-IRQ7 номера прерываний 20h-27h mov mov call
dx,MASTER8259A ah,20h set_int_ctrlr
; Устанавливаем для IRQ8-IRQ15 номера прерываний 28h-2Fh mov mov call
dx,SLAVE8259A ah,28h set_int_ctrlr
; Загружаем регистры IDTR и GDTR lidt lgdt
[FWORD idtr] [QWORD gdt_gdt]
; Переключаемся в защищѐнный режим
;
LABEL
mov lmsw
ax,VIRTUAL_MODE ax
jmp db dw dw flush
far flush 0ea OFFSET flush CS_DESCR FAR
; Загружаем селекторы в сегментные регистры mov mov mov mov
ax,SS_DESCR ss,ax ax,DS_DESCR ds,ax
; Разрешаем прерывания sti ENDP
ret set_pmode
; --------------------------------
; Возврат в реальный режим ; -------------------------------DATASEG ; Пустой дескриптор для выполнения возврата ; процессора в реальный режим через перевод ; его в состояние отключения. null_idt idt_struc <> CODESEG PROC
set_rmode mov
; ; ; ; ;
NEAR
[real_sp],sp
Переводим процессор в состояние отключения, это эквивалентно аппаратному сбросу, но выполняется быстрее. Сначала мы загружаем IDTR нулями, затем выдаѐм команду прерывания. lidt int
[FWORD null_idt] 3
; Это старый способ сброса процессора через ; контроллер клавиатуры. ; mov al,SHUT_DOWN ; out STATUS_PORT,al rwait: hlt jmp LABEL
ENDP
rwait
shutdown_return FAR in and out
al,INT_MASK_PORT al,0 INT_MASK_PORT,al
mov mov assume
ax,DGROUP ds,ax ds:DGROUP
cli mov ss,[real_ss] mov sp,[real_sp] mov ax,000dh out CMOS_PORT,al sti mov es,[real_es] call disable_a20 ret set_rmode
; ------------------------------------------------; Обработка исключений ; ------------------------------------------------; Обработчики исключений. Записываем в AX номер ; исключения и передаѐм управление процедуре
; shutdown LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL
exc_00 mov jmp exc_01 mov jmp exc_02 mov jmp exc_03 mov jmp exc_04 mov jmp exc_05 mov jmp exc_06 mov jmp exc_07 mov jmp exc_08 mov jmp exc_09 mov jmp exc_0A mov jmp exc_0B mov jmp exc_0C mov jmp exc_0D mov jmp exc_0E mov jmp exc_0F mov jmp exc_10 mov jmp exc_11 mov jmp exc_12 mov jmp exc_13 mov jmp exc_14
WORD ax,0 shutdown WORD ax,1 shutdown WORD ax,2 shutdown WORD ax,3 shutdown WORD ax,4 shutdown WORD ax,5 shutdown WORD ax,6 shutdown WORD ax,7 shutdown WORD ax,8 shutdown WORD ax,9 shutdown WORD ax,0ah shutdown WORD ax,0bh shutdown WORD ax,0ch shutdown WORD ax,0dh shutdown WORD ax,0eh shutdown WORD ax,0fh shutdown WORD ax,10h shutdown WORD ax,11h shutdown WORD ax,12h shutdown WORD ax,13h shutdown WORD
LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL LABEL
mov jmp exc_15 mov jmp exc_16 mov jmp exc_17 mov jmp exc_18 mov jmp exc_19 mov jmp exc_1A mov jmp exc_1B mov jmp exc_1C mov jmp exc_1D mov jmp exc_1E mov jmp exc_1F mov jmp
ax,14h shutdown WORD ax,15h shutdown WORD ax,16h shutdown WORD ax,17h shutdown WORD ax,18h shutdown WORD ax,19h shutdown WORD ax,1ah shutdown WORD ax,1bh shutdown WORD ax,1ch shutdown WORD ax,1dh shutdown WORD ax,1eh shutdown WORD ax,1fh shutdown
DATASEG exc_msg db "Exception ...., ....:.... code ..... Press any key... " CODESEG ; ; ; ;
----------------------------------------------Вывод на экран номера исключения, кода ошибки, дампа регистров и возврат в реальный режим. -----------------------------------------------
PROC
shutdown
NEAR
call
rdump
; дамп регистров процессора
push call
ax beep
; звуковой сигнал
; Выводим сообщение об исключении mov mov mov mov mov mov mov
ax,[vir_crt] es,ax bx,1d ax,4 si,OFFSET exc_msg dh,74h cx, SIZE exc_msg
ENDP
call pop
writexy ax
mov call
bx, 040bh Print_Word
pop mov call
ax bx, 0420h Print_Word
; код ошибки
pop mov call
ax bx, 0416h Print_Word
; смещение
pop mov call
ax bx, 0411h Print_Word
; селектор
call
set_rmode
; возвращаемся в реальный режим
mov int
ax, 0 16h
mov call mov int
bh, 07h clrscr ah,4Ch 21h
; номер исключения
; ожидаем нажатия на клавишу
shutdown
; ------------------------------------------------; Перепрограммирование контроллера прерываний ; На входе: DX - порт контроллера прерывания ; AH - начальный номер прерывания ; ------------------------------------------------PROC
set_int_ctrlr
NEAR
ENDP
mov al,11 out dx,al jmp SHORT $+2 mov al,ah inc dx out dx,al jmp SHORT $+2 mov al,4 out dx,al jmp SHORT $+2 mov al,1 out dx,al jmp SHORT $+2 mov al,0ff out dx,al dec dx ret set_int_ctrlr
; ------------------------------; Разрешение линии A20 ; ------------------------------PROC
enable_a20 NEAR mov al,A20_PORT
ENDP
out STATUS_PORT,al mov al,A20_ON out KBD_PORT_A,al ret enable_a20
; ------------------------------; Запрещение линии A20 ; ------------------------------PROC
ENDP
disable_a20 NEAR mov al,A20_PORT out STATUS_PORT,al mov al,A20_OFF out KBD_PORT_A,al ret disable_a20
; ---------- Обработчик аппаратных прерываний IRQ2-IRQ7 PROC
dummy_iret0 push ax
NEAR
; Посылаем сигнал конца прерывания в первый контроллер 8259A
ENDP
mov al,EOI out MASTER8259A,al pop ax iret dummy_iret0
; ---------- Обработчик аппаратных прерываний IRQ8-IRQ15 PROC
dummy_iret1 push ax
NEAR
; Посылаем сигнал конца прерывания в первый ; и второй контроллеры 8259A
ENDP
mov al,EOI out MASTER8259A,al out SLAVE8259A,al pop ax iret dummy_iret1
; -----------------------------------------; Процедура выдаѐт короткий звуковой сигнал ; -----------------------------------------PROC
beep push
NEAR ax bx cx
in push mov
al,KBD_PORT_B ax cx,80
push and out mov
cx al,11111100b KBD_PORT_B,al cx,60
loop
idle1
beep0:
idle1:
or out mov
al,00000010b KBD_PORT_B,al cx,60
loop pop loop
idle2 cx beep0
pop out
ax KBD_PORT_B,al
pop ret beep
cx bx ax
idle2:
ENDP ; ; ; ; ;
-----------------------------------------------Процедура задерживает выполнение программы на некоторое время, зависящее от быстродействия процессора. ------------------------------------------------
PROC
pause push mov
cx cx,10
NEAR
push xor
cx cx,cx
loop pop loop pop ret pause
ploop1 cx ploop0 cx
ploop0: ploop1:
ENDP
; -----------------------------------------; Процедуры для работы с клавиатурой ; -----------------------------------------DATASEG key_flag key_code ext_scan keyb_status
db dw db dw
0 0 0 0
CODESEG ; ---------------------------------------------; Обработчик аппаратного прерывания клавиатуры ; ---------------------------------------------PROC
Keyb_int
NEAR
call
beep
; выдаѐм звуковой сигнал
push mov cmp jz
ax al, [ext_scan] al, 0 normal_scan1
; расширенный скан-код ; или обычный ?
; --------- обработка расширенного скан-кода ------------cmp jz
al, 0e1h pause_key
in
al, 60h
; вводим скан-код
cmp jz
al, 2ah intkeyb_exit_1
; игнорируем префикс 2Ah
cmp jz
al, 0aah intkeyb_exit_1
; игнорируем отпускание ; клавиш
mov call
ah, [ext_scan] Keyb_PutQ
; записываем скан-код и ; расширенный скан-код ; в "очередь", состоящую ; из одного слова
mov mov jmp
al, 0 [ext_scan], al intkeyb_exit
; сбрасываем признак ; получения расширенного ; скан-кода
pause_key: in cmp jz cmp jz jmp pause_key1: mov call mov mov jmp
; это клавиша <Pause>?
; обработка клавиши <Pause> al, 60h al, 0c5h pause_key1 al, 45h pause_key1 intkeyb_exit
; вводим скан-код ; если это код <Pause>, ; записываем его в очередь, ; иначе игнорируем
ah, [ext_scan] Keyb_PutQ
; запись в очередь ; кода клавиши <Pause>
al, 0 [ext_scan], al intkeyb_exit
; сбрасываем признак ; получения расширенного ; скан-кода
; --------- обработка обычного скан-кода ------------normal_scan1: in
al, 60h
cmp jz
al, 0feh intkeyb_exit
cmp jz
al, 0e1h ext_key
cmp jnz
al, 0e0h normal_scan
mov jmp
[ext_scan], al intkeyb_exit
; вводим скан-код ; игнорируем FEh ; расширенный скан-код? ; если да, то на обработку ; расширенного скан-кода
ext_key: ; устанавливаем признак ; расширенного скан-кода
; Сброс признака расширенного скан-кода и выход intkeyb_exit_1: mov al, 0 mov [ext_scan], al
jmp
intkeyb_exit
; Запись нормального скан-кода в очередь и выход normal_scan: mov call
ah, 0 Keyb_PutQ
intkeyb_exit:
ENDP ; ; ; ;
in mov or out xchg out
al, 61h ah, al al, 80h 61h, al ah, al 61h, al
; разблокируем клавиатуру
mov out
al,EOI MASTER8259A,al
; посылаем сигнал конца ; прерывания
pop ax sti iret Keyb_int
--------------------------------------------------Запись скан-кода и расширенного скан-кода в "буфер", состоящий из одного слова. ---------------------------------------------------
PROC
Keyb_PutQ push mov
NEAR
ax [key_code], ax
; записываемый код
; ------- Обрабатываем переключающие клавиши --------cmp jnz mov or mov jmp
ax, 002ah @@kb1 ax, [keyb_status] ax, L_SHIFT [keyb_status], ax keyb_putq_exit
; L_SHIFT down
cmp jnz mov and mov jmp
ax, 00aah @@kb2 ax, [keyb_status] ax, NL_SHIFT [keyb_status], ax keyb_putq_exit
; L_SHIFT up
cmp jnz mov or mov jmp
ax, 0036h @@kb3 ax, [keyb_status] ax, R_SHIFT [keyb_status], ax keyb_putq_exit
; R_SHIFT down
cmp jnz mov and
ax, 00b6h @@kb4 ax, [keyb_status] ax, NR_SHIFT
; R_SHIFT up
@@kb1:
@@kb2:
@@kb3:
mov jmp
[keyb_status], ax keyb_putq_exit
cmp jnz mov or mov jmp
ax, 001dh @@kb5 ax, [keyb_status] ax, L_CTRL [keyb_status], ax keyb_putq_exit
; L_CTRL down
cmp jnz mov and mov jmp
ax, 009dh @@kb6 ax, [keyb_status] ax, NL_CTRL [keyb_status], ax keyb_putq_exit
; L_CTRL up
cmp jnz mov or mov jmp
ax, 0e01dh ; R_CTRL down @@kb7 ax, [keyb_status] ax, R_CTRL [keyb_status], ax keyb_putq_exit
cmp jnz mov and mov jmp
ax, 0e09dh ; R_CTRL up @@kb8 ax, [keyb_status] ax, NR_CTRL [keyb_status], ax keyb_putq_exit
cmp jnz mov or mov jmp
ax, 0038h @@kb9 ax, [keyb_status] ax, L_ALT [keyb_status], ax keyb_putq_exit
; L_ALT down
cmp jnz mov and mov jmp
ax, 00b8h @@kb10 ax, [keyb_status] ax, NL_ALT [keyb_status], ax keyb_putq_exit
; L_ALT up
cmp jnz mov or mov jmp
ax, 0e038h ; R_ALT down @@kb11 ax, [keyb_status] ax, R_ALT [keyb_status], ax keyb_putq_exit
cmp jnz mov and mov jmp
ax, 0e0b8h ; R_ALT up @@kb12 ax, [keyb_status] ax, NR_ALT [keyb_status], ax keyb_putq_exit
cmp jnz mov xor
ax, 003ah @@kb13 ax, [keyb_status] ax, CAPS_LOCK
@@kb4:
@@kb5:
@@kb6:
@@kb7:
@@kb8:
@@kb9:
@@kb10:
@@kb11:
@@kb12: ; CAPS_LOCK up
mov jmp
[keyb_status], ax keyb_putq_exit
cmp jnz jmp
ax, 00bah @@kb14 keyb_putq_exit
; CAPS_LOCK down
cmp jnz mov xor mov jmp
ax, 0046h @@kb15 ax, [keyb_status] ax, SCR_LOCK [keyb_status], ax keyb_putq_exit
; SCR_LOCK up
cmp jnz jmp
ax, 00c6h @@kb16 keyb_putq_exit
; SCR_LOCK down
cmp jnz mov xor mov jmp
ax, 0045h @@kb17 ax, [keyb_status] ax, NUM_LOCK [keyb_status], ax keyb_putq_exit
; NUM_LOCK up
cmp jnz jmp
ax, 00c5h @@kb18 keyb_putq_exit
; NUM_LOCK down
cmp jnz mov xor mov jmp
ax, 0e052h ; INSERT up @@kb19 ax, [keyb_status] ax, INSERT [keyb_status], ax keyb_putq_exit
cmp jnz jmp
ax, 0e0d2h @@kb20 keyb_putq_exit
test jnz
ax, 0080h keyb_putq_exit
mov mov
al, 0ffh [key_flag], al
@@kb13:
@@kb14:
@@kb15:
@@kb16:
@@kb17:
@@kb18:
@@kb19: ; INSERT down
@@kb20: ; фильтруем отжатия клавиш ; устанавиваем признак ; готовности для чтения ; символа из "буфера"
keyb_putq_exit: pop ax ret ENDP Keyb_PutQ ; ; ; ; ; ; ;
----------------------------------------------------Программное прерывание, предназначенное для чтения символа из буфера клавиатуры. По своим функциям напоминает прерывание INT 16h реального режима. В AX возвращается скан-код нажатой клавиши, в BX - состояние переключающих клавиш. -----------------------------------------------------
PROC
Int_30h_Entry push
dx
NEAR ; запрещаем прерывания и
cli mov mov
al, 0 [key_flag], al
; сбрасываем признак ; готовности скан-кода ; в буфере клавиатуры
; Ожидаем прихода прерывания от клавиатуры. ; Процедура клавиатурного прерывания установит ; признак в переменной key_flag. keyb_int_wait: sti nop nop cli mov cmp jz
ENDP
; разрешаем прерывания ; ждѐм прерывание al, [key_flag] al, 0 keyb_int_wait
; запрещаем прерывания ; и опрашиваем флаг ; готовности скан-кода
mov mov
al, 0 [key_flag], al
; сбрасываем флаг ; готовности
mov mov
ax, [key_code] bx, [keyb_status]
sti pop dx iret Int_30h_Entry
; записываем скан-код ; и состояние переключающих ; клавиш ; разрешаем прерывания
; ------------------------------------------; TIMER section ; ------------------------------------------DATASEG timer_cnt dw
0
CODESEG PROC
Timer_int cli push ax
NEAR
; Увеличиваем содержимое счѐтчика времени mov inc mov
ax, [timer_cnt] ax [timer_cnt], ax
; Примерно раз в секунду выдаѐм звуковой сигнал test jnz
ax, 0fh timer_exit
call
beep
timer_exit: ; Посылаем команду конца прерывания mov out
al,EOI MASTER8259A,al
ENDP
pop ax sti iret Timer_int
; -------------------------------------------------; Процедуры обслуживания видеоконтроллера ; -------------------------------------------------DATASEG columns db rows db rl_crt dw vir_crt dw curr_line text_buf
80d 25d COLOR_SEG CRT_DESCR dw 0d db "
CODESEG ; ----------------------------------------; Определение адреса видеопамяти ; ----------------------------------------PROC
set_crt_base NEAR mov ax,40 mov es,ax mov bx,[WORD es:4a] mov [columns],bl mov bl,[BYTE es:84] inc bl mov [rows],bl mov bx,[WORD es:PORT_6845] cmp bx,COLOR_PORT je color_crt mov [rl_crt],MONO_SEG mov [vir_crt],MDA_DESCR color_crt: ret ENDP set_crt_base ; ------------------------------------; Запись строки в видеопамять ; ------------------------------------PROC
writexy push push mov mul add shl mov mov write_loop: lodsb stosw loop pop pop ret ENDP writexy
NEAR si di dl,[columns] dl ax,bx ax,1 di,ax ah,dh
write_loop di si
"
; --------------------------------------; Стирание экрана (в реальном режиме) ; --------------------------------------PROC
clrscr xor mov mov mov int ret clrscr
ENDP
NEAR cx,cx dl,[columns] dh,[rows] ax,0600 10
DATASEG hello_msg db " Protected mode monitor *TINY/OS*, v.1.1 for CPU 80286 ¦ © Frolov A.V., 1992 " CODESEG ; ; ; ;
-----------------------------------Вывод начального сообщения в защищѐнном режиме ------------------------------------
PROC
ENDP
write_hello_msg NEAR mov ax,[vir_crt] mov es,ax mov si,OFFSET hello_msg mov bx,0 mov ax,[curr_line] inc [curr_line] mov cx,SIZE hello_msg mov dh,30h call writexy call beep ret write_hello_msg
; ---------------------------------------------; Процедура выводит на экран содержимое AX ; (x,y) = (bh, bl) ; ---------------------------------------------PROC Print_Word near push ax push bx push dx push ax mov cl,8 rol ax,cl call Byte_to_hex mov [text_buf], dh mov [text_buf+1], dl pop ax call Byte_to_hex mov [text_buf+2], dh mov [text_buf+3], dl mov
si, OFFSET text_buf
mov mov mov mov
dh, cx, al, ah,
70h 4 bh 0
mov call
bh, 0 writexy
pop dx pop bx pop ax ret ENDP Print_Word DATASEG tabl db '0123456789ABCDEF' CODESEG ; ; ; ; ; ;
----------------------------------------Преобразование байта в шестнадцатеричный символьный формат al - входной байт dx - выходное слово -----------------------------------------
PROC Byte_to_hex near push push
cx bx
mov
bx, OFFSET tabl
push and xlat mov
ax al,0fh
pop mov shr xlat mov
ax cl,4 al,cl
dl,al
dh,al
pop bx pop cx ret ENDP Byte_to_hex DATASEG reg_title DI " ; sreg_title " ; CODESEG
db " CS
IP
AX
BX
.... db " DS
.... ES
.... SS
....
....
....
CX
DX
SP
BP
.... .... FLAGS
....
....
....
....
....
....
....
....
SI
; -----------------------------------------------; Вывод на экран содержимого регистров процессора ; -----------------------------------------------PROC
rdump NEAR pushf pusha mov
di, es
mov mov mov mov mov mov mov call
ax,[vir_crt] es,ax si,OFFSET reg_title bx,1 ax,6 cx,SIZE reg_title dh,1fh writexy
; Выводим содержимое всех регистров mov mov call
ax,cs bx, 0702h Print_Word
mov
bp, sp
mov ax, [bp+18d] mov bx, 0708h call Print_Word mov mov call
bx, 070eh ax,[bp+14d] Print_Word
; cs
; ip
; ax
mov bx, 0714h mov ax,[bp+8d] call Print_Word
; bx
mov bx, 071ah mov ax,[bp+12d] call Print_Word
; cx
mov bx, 0720h mov ax,[bp+10d] call Print_Word
; dx
mov ax,bp add ax,20d mov bx, 0726h call Print_Word mov ax,[bp+4d] mov bx, 072ch call Print_Word mov bx, 0732h mov ax,[bp+2] call Print_Word mov mov
bx, 0738h ax, [bp]
; sp
; bp
; si
; di
; (X,Y) = (AX,BX) ; чѐрный на голубом фоне
call Print_Word mov mov mov mov mov call
si,OFFSET sreg_title bx,1 ax,8 cx,SIZE sreg_title dh,1fh writexy
mov bx, 0902h mov ax, ds call Print_Word
; ds
mov bx, 0908h mov ax, di call Print_Word
; es
mov bx, 090eh mov ax,ss call Print_Word
; ss
mov bx, 0914h mov ax, [bp+16d] call Print_Word
; flags
; Восстанавливаем содержимое регистров
ENDP
popa popf ret rdump
CSEG_SIZE
= ($ - start)
DATASEG DSEG_SIZE
= ($ - DSEG_BEG)
wrong
? start
db END
4 . М У Л Ь Т И З А Д А Ч Н О С Т Ь В П Р О Ц Е С С О Р Е I8 0 2 8 6 В п од авл яю щ ем б ол ьш и н стве п р огр ам м ы , составл ен н ы е д л я р еал ьн ого р еж и м а п р оц ессор а, вы п олн яю тся в од н озад ачн ом р еж и м е, п ол н остью м он оп ол и зи р уя все р есур сы ком п ью тер а. О д н ак о в реал ьн ой ж и зн и чел овеку, р аб отаю щ ем у с ком п ью тер ом тр ебуется одн оврем ен н ы й д оступ к двум и л и б ол ьш ем у чи слу п р огр ам м . П од тверж д ен и ем этом у сл уж и т н али чи е огр ом н ого коли чества рези д ен тн ы х п р огр ам м - от п р остей ш и х часов и кал ькул ятор ов д о сл ож н ы х р ези д е н тн ы х и н тегри р ован н ы х ср ед , ан ал оги чн ы х B orlan d S id eK ick. Р ези д ен тн ы е п р огр ам м ы , за р ед ки м и скл ю чен и ем , н е р еал и зую т н астоящ ую м ул ьти зад ачн ость. п ом ощ ью р ези д ен тн ы х п р ограм м вы м ож ете тол ько п ер екл ю чаться от од н ой зап ущ ен н ой п р огр ам м ы Т и п и чн ы й п р и м ер "м ул ьти зад ачн ой " р ези д ен тн ой п р огр ам м ы - часы , котор ы е р аб отаю т п арал л ел ьн о п р огр ам м ам и и п остоян н о п оказы ваю т врем я в заран ее оп ред ел ѐн н ом м есте экр ан а. Д р угой р ези д ен тн ая п р ограм м а ф он овой п ечати P R IN T , вход ящ ая в состав MS-DOS.
О бы чн о с к д р угой . с д р уги м и п р и м ер -
И сп ол ьзован и е р ези д ен тн ы х п р огр ам м - н е сам ы й л учш и й сп особ ор ган и зац и и п ер екл ю чен и я зад ач. Э то связан о с возн и кн овен и ем кон ф л и ктов м еж д у разл и чн ы м и р ези д ен тн ы м и п р ограм м ам и - н ап ри м ер , п о кл ави ш ам и х акти ви зац и и и ли п о и сп ол ьзуем ы м п р ер ы ван и ем .
У чи ты вая н еоб ходи м ость р еал и зац и и п ер екл ю чен и я п р ограм м , ф и р м а M icrosoft в оп ер ац и он н ой си стем е M S -DOS вер си и 5.0 р еали зовала п ер екл ю чател ь п р огр ам м , встр оен н ы й в д и ал оговую об ол очку D O S S H E LL. Э та об ол очка п озвол яет зап усти ть н а вы п ол н ен и е н ескол ько п р огр ам м и п ер еклю чаться от од н ой к д ругой . Н о акти вн а тол ько од н а зад ача - та, н а которую п ер еклю чи л ся п ол ьзовател ь. О стал ьн ы е н аход ятся в "зам ор ож ен н ом " состоян и и . О д н ако часто б ы вает н еоб ходи м о, чтоб ы п р огр ам м ы р аб отал и в р еж и м е р азд ел ен и я вр ем ен и п р оц ессор а. В эти х сл учаях н уж н о и сп ол ьзовать оп ер ац и он н ую си стем у, раб отаю щ ую в м ул ьти зад ачн ом р еж и м е - OS/2, UNIX, XENIX, WINDOWS, DeskView. М ул ьти зад ачн ость п озвол яет н е тол ько задей ствовать все р есур сы совр ем ен н ы х п ер сон ал ьн ы х ком п ью тер ов, н о и сущ ествен н о п ов ы ш ает п р ои звод и тел ьн ость труд а. Н ап р и м ер , вы с п ом ощ ью м од ем а п ри н и м аете ф ай л р азм ер ом 1 -2 м егаб ай та. С кор ость п ер ед ачи д ан н ы х п о тел еф он н ы м л и н и ям р ед ко п р евы ш ает 2400 б и т в секун д у, п оэтом у в худ ш ем сл учае п р оц есс п ол учен и я ф ай л а м ож ет р астян уться н а часы . Б ез и сп ол ьзован и я м ул ьти зад ачн ости ваш ком п ью тер всѐ это врем я б уд ет зан ят тол ько п р и ѐм ом ф ай л а. Б ол ее того, в осн овн ом он б уд ет н аход и ться в состоян и и ож и дан и я, так как п ер ед ача д ан н ы х п р ои звод и тся очен ь м ед л ен н о. Б ез м ул ьти зад ачн ости вы об р ечен ы ж дать завер ш ен и я п р оц есса и н е см ож ете вы п ол н ять н а ком п ью тер е н и какую д ругую р аб оту, что сам о п о себе весьм а п ечал ьн о. И это н есм отр я н а то, что ком п ью тер п р акти чески н и чем н е загр уж ен ! К ак ж е м ож н о ор ган и зовать м ул ьти зад ачн ость? С ам ы й п р остой сп особ закл ю ча ется в и сп ол ьзован и и тай м ера. Н ап ом н и м , что тай м ер вы р абаты вает п р еры ван и е IR Q 0 п ри м ер н о 18,2 р аза в секун д у. О п ер ац и он н ая си стем а м ож ет и сп ол ьзовать это п рер ы ван и е д л я п ер еклю чен и я с од н ой вы п ол н яю щ ей ся п р ограм м ы н а д р угую , п р ед оставл яя каж д ой п р огр ам м е кван т вр ем ен и . П ри этом у п ол ьзовател я ком п ью тер а возн и кн ет и лл ю зи я п ар ал лел ьн ой раб оты н ескол ьки х п р огр ам м . К сож ал ен и ю , и з-за огр ан и чен н ого об ъ ѐм а кн и ги м ы н е см ож ем п од р об н о об суд и ть все п р об л ем ы , связан н ы е с ор ган и зац и ей м ул ьти зад ачн ости . В кон ц е кн и ги есть сп и сок л и тератур ы , в котор ой эти воп р осы р ассм отр ен ы б ол ее п од р об н о. О дн ако м ы тем н е м ен ее остан ови м ся н а н ескол ьки х п ри н ц и п и ал ьн ы х м ом ен тах (которы е, кстати , н ап р ям ую н е связан ы с защ и щ ѐн н ы м р еж и м ом р аб оты п р оц ессор а). П ер вы й м ом ен т связан с загр узкой п р огр ам м . В м ул ьти зад ачн ой ср ед е од н овр ем ен н о р аб отаю т н ескол ько п р огр ам м . О н и д ол ж н ы ли б о все од н овр ем ен н о н аход и ться в оп ер ати вн ой п ам яти , л и б о загр уж аться туд а п о м ер е н еобход и м ости с м агн и тн ого д и ска. Е сл и п р ограм м ы загр уж ен ы в п ам ять од н овр ем ен н о, то д ля каж д ой и з н и х, р азум еется, д ол ж н а б ы ть вы дел ен а своя об л асть п ам яти . К ак д л я п р огр ам м , так и д л я об л астей д ан н ы х, п ри н ад л еж ащ и х эти м п р огр ам м ам . Д л я об есп ечен и я н ад ѐж н ой раб оты п р огр ам м б ы л о б ы такж е н еп л охо и золи р овать эти об л асти п ам яти д р уг от д р уга д л я п р ед отвр ащ ен и я случай н ого и л и п ред н ам ер ен н ого д оступ а за п р ед ел ы вы д ел ен н ой обл асти п ам яти . В тор ой м ом ен т - п р оц есс п ерекл ю чен и я от вы п ол н ен и я одн ой п р ограм м ы к вы п ол н ен и ю д р угой . И н и ц и атор ом этого п р оц есса об ы чн о явл яется тай м ер , ген ери р ую щ и й п ери од и чески е п р ер ы ван и я. П р и п ер екл ю чен и и н еоб ход и м о п ол н остью сохр ан и ть кон текст вы п ол н яем ой п р ограм м ы , чтоб ы в д ал ьн ей ш ем м ож н о б ы л о б ы п р од ол ж и ть еѐ вы п ол н ен и е с п р ер ван н ого м еста. П од кон текстом п р огр ам м ы м ы зд есь п он и м аем сод ер ж и м ое реги стр ов ц ен трал ьн ого п р оц ессор а (а такж е р еги стр ов ари ф м ети ческого соп р оц ессор а, есл и он и сп ол ьзуется од н овр ем ен н о н ескол ьки м и п р огр ам м ам и ). Т р ети й м ом ен т связан с н еоб ход и м остью об есп ечен и я взаи м од ей стви я п арал л ел ьн о р аб отаю щ и х п р огр ам м . П р огр ам м ы д ол ж н ы и м еть возм о ж н ость п ол учать д оступ к ап п ар атн ы м р есур сам ком п ью тер а, к сер ви су оп ер ац и он н ой си стем ы . К р ом е того, п р огр ам м ы д ол ж н ы ум еть об м ен и ваться д р уг с д р угом д ан н ы м и и си гн али зи р овать д р уг д р угу (а такж е оп ерац и он н ой си стем е) о возн и кн овен и и каки х ли б о соб ы ти й . П р и м он оп ол ьн ом и сп ол ьзован и и ком п ью тера в од н озад ачн ом р еж и м е все р есур сы ком п ью тер а н аход ятся во вл ад ен и и зап ущ ен н ой п р огр ам м ы . Н о есл и од н овр ем ен н о раб отаю т н ескол ько п р ограм м и все он и хотят вы вести что-н и б уд ь н а экр ан д и сп л ея... В этом сл учае д ол ж ен сущ ествовать м ехан и зм , обесп ечи ваю щ и й совм естн ое и сп ол ьзован и е ресур сов ком п ью тер а п ар ал л ел ьн о р аб отаю щ и м и п р огр ам м ам и . С и туац и я н ап ом и н ает ж ел езн од ор ож н ы й п ер еезд - д ви ж ен и е р азр еш ен о л и б о п оезд ам , л и б о автом об и л ям , н о н е од н овр ем ен н о и тем и д р уги м !
Р еш ен и е п р об л ем ы такж е ан ал оги чн ое - устан овка сем аф ор а. Т ол ько в сл учае с ж ел езн ой д ор огой это н астоящ и й сем аф ор , а в случае м ул ьти зад ачн ой оп ерац и он н ой си стем ы - это ячей ка п ам яти , отраж аю щ ая текущ ее состоян и е р есур са - своб од ен и л и зан ят. Е сл и ресур с ком п ью тер а зан ят какой л и б о п р огр ам м ой , др уги е п р огр ам м ы д олж н ы ж д ать, п ока он н е освоб од и тся (п ока н е п р оед ет п оезд ). Н ет н и каки х п ри н ц и п и ал ьн ы х п р еп ятстви й д л я р еали зац и и м ул ьти зад ачн ости в р еал ьн ом р еж и м е. О д н ако огр ан и чен и я, п ри сущ и е р еал ьн ом у реж и м у н е п о звол яю т сд ел ать это д остаточн о эф ф екти вн о. Н ап ри м ер , огр ан и чен н ое ад р есн ое п р остр ан ство н е п озвол яет д ер ж ать в оп ер ати вн ой п ам яти од н овр ем ен н о н ескол ько б ол ьш и х п р огр ам м , а п од гр узка п р огр ам м с д и ска вы п олн яется м ед л ен н о. О тсустви е какой б ы то н и бы л о и зол яц и и ад р есн ы х п р остр ан ств п р огр ам м влечѐт за соб ой н ен ад ѐж н ую р аб оту всей си стем ы в ц ел ом , так как л ю б ая п р огр ам м а и з-за ош и б ки и л и п р едн ам ер ен н о м ож ет разр уш и ть всю си стем у. П оэтом у все м ул ьти зад ачн ы е оп ер ац и он н ы е си стем ы и сп ол ьзую т защ и щ ѐн н ы й р еж и м р аб о ты п р оц ессор а. А д р есац и я п ам яти в защ и щ ѐн н ом р еж и м е п ол н остью уд овл етворяет тр еб ован и ям и зол и р ован и я п ар ал л ел ьн о р аб отаю щ и х п р огр ам м . Н ап ри м ер, д л я каж д ой п р ограм м ы м ож н о созд ать свою локал ьн ую таб л и ц у д ескр и п тор ов LD T . В этом сл учае п р огр ам м а п ри н ц и п и ал ьн о б уд ет и м еть д оступ тол ько к своей об ласти п ам яти , вы делен н ой ей оп ер ац и он н ой си стем ой . Д л я ор ган и зац и и м еж зад ачн ого взаи м од ей стви я м ож н о вы зы вать м од ул и оп ер ац и он н ой си стем ой чер ез вен ти ли вы зова. К р ом е того, оп ер ац и он н ая си стем а м ож ет созд ать об л асти п ам яти "об щ его п ол ьзован и я", п ом ести в соответствую щ и е дескр и п тор ы в гл обал ьн ую таб л и ц у д ескр и п тор ов G D T . Т аб л и ц а G D T од н а н а все п р огр ам м ы и д оступ н а всем п р огр ам м ам . К р ом е того, п р оц ессор i80286 и б ол ее стар ш и е м од ел и и м ею т сп ец и ал ьн ы е ср ед ства, зн ачи тел ь н о ускоряю щ и е п ер еклю чен и е с од н ой п р огр ам м ы н а д р угую за счѐт автом ати ческого сохр ан ен и я кон текста в сп ец и ал ьн о вы д ел ен н ой д л я каж д ой п р огр ам м ы об л асти п ам яти . В этой гл аве м ы р ассм отр и м ср ед ства м ул ьти зад ачн ости п роц ессор а i80286 и п ри вед ѐм
4 .1 . З ад ач а и сегм ен т со сто я н и я зад ач и Д о си х п ор м ы говори ли о п ар ал л ел ьн ой раб оте п р огр ам м . Н а сам ом д ел е каж дая отд ел ьн ая п р огр ам м а м ож ет состоять и з н ескол ьки х частей , р аб отаю щ и х п ар ал лел ьн о. Н ап р и м ер , текстовы й п р оц ессор м ож ет сод ерж ать п р огр ам м н ы е м од ули , котор ы е п ар ал л ел ьн о с р ед акти р ован и ем текста вы п ол н яю т н ум ер ац и ю стран и ц , п ечать текста и л и автом ати ческое сохр ан ен и е его н а д и ске. К аж д ую такую часть п р огр ам м ы м ы б уд ем н азы вать зад ачей . И сход я и з этой терм и н ол оги и в м ул ьти зад ачн ой ср ед е од н овр ем ен н о вы п ол н яется м н ого зад ач, п р и н ад л еж ащ и х р азн ы м п р огр ам м ам . П ри чѐм кол и чество зад ач б ол ьш е и л и р авн о коли честву вы п ол н яю щ и хся п р ограм м . К ак п р ави л о, кван тован и е вр ем ен и п р оц ессора вы п ол н яется н а ур овн е зад ач, а н е н а ур овн е п р ограм м . П о п р ер ы ван и ю тай м ер а п р оц ессор п ер екл ю чается от одн ой зад ачи к д р угой , и таки м об р азом осущ ествл яется п ар ал лел ьн ое вы п ол н ен и е п рогр ам м . Д л я хр ан ен и я кон текста н еакти вн ой в н астоящ ей м ом ен т зад ачи п р оц ессор i80286 и сп ол ьзует сп ец и ал ьн ую об л асть п ам яти , н азы ваем ую сегм ен том состоян и я зад ачи T S S (T ask S tate S eg m en t). Ф ор м ат T S S п р ед ставл ен н а р и с. 14.
Р и с. 14. Ф ор м ат сегм ен та состоян и я зад ачи T S S . С егм ен т T S S ад р есуется п р оц ессор ом п р и п ом ощ и 16 -б и тн ого р еги стр а T R (T ask R eg ister), сод ер ж ащ его сел ектор д ескр и п тор а T S S , н аход ящ егося в гл об ал ьн ой таб л и ц е д ескр и п тор ов G D T (ри с. 15).
Р и с. 15. Д ескр и п тор сегм ен та состоян и я зад ачи T S S . П ол е д оступ а сод ер ж и т би т B - б и т зан ятости . Е сл и зад ача акти вн а, этот б и т устан авли вается п р оц ессор ом в 1. О п ер ац и он н ая си стем а д л я каж д ой зад ачи созд аѐт свой T S S . П ер ед тем как п ер еклю чи ться н а вы п олн ен и е н овой зад ачи , п р оц ессор сохран яет кон текст стар ой зад ачи в еѐ сегм ен те T S S . Ч то ж е кон кретн о зап и сы вается в T S S п ри п ер екл ю чен и и зад ачи ? Зап и сы вается сод ер ж и м ое реги стр ов об щ его н азн ачен и я A X , B X , C X , D X , р еги стр ов SP, B P , S I, D I, сегм ен тн ы х р еги стр ов E S , C S , S S , D S , содер ж и м ое указател я ком ан д IP и р еги стр а ф л аж ков FLA G S . К р ом е того, сохр ан яется сод ер ж и м ое р еги стра LD T R , оп р ед ел яю щ его л окал ьн ое ад ресн ое п р остран ство зад ачи . Д оп ол н и тел ьн о п р и п ерекл ю че н и и задачи в об л асть T S S со см ещ ен и ем 44 оп ер ац и он н ая си стем а м ож ет зап и сать л ю б ую и н ф ор м ац и ю , котор ая отн оси тся к д ан н ой зад аче. Э та об л асть п р оц ессор ом н е счи ты вается и н и как н е м од и ф и ц и р уется.
П ол е Lin k п р ед ставл яет соб ой п ол е об ратн ой связи и и сп ол ьзу ется д л я ор ган и зац и и влож ен н ы х вы зовов зад ач. Э то п ол е м ы р ассм отр и м в сл ед ую щ ем р азд ел е. П ол я S tack 0, S tack 1, S tack 2 хр ан ят л оги чески е ад р еса (сел ектор :см ещ ен и е) отдел ьн ы х д л я каж д ого кол ьц а защ и ты стеков. Э ти п ол я и сп ол ьзую тся п ри м еж сегм ен тн ы х вы зов ах через вен ти ли вы зова. Д л я об есп ечен и я защ и ты д ан н ы х п р оц ессор н азн ачает отд ел ьн ы е стеки д л я каж д ого кол ьц а защ и ты . К огд а зад ача вы зы вает п одп р огр ам м у и з д р угого кол ьц а через вен ти л ь вы зова, п р оц ессор вн ачал е загруж ает указател ь стека S S :S P ад р есом н ово го стека, взятого и з соответствую щ его п ол я T S S . Затем в н овы й стек коп и р уется сод ер ж и м ое р еги стр ов S S :S P зад ачи (т.е. ад р ес вер ш и н ы стар ого стека зад ачи ). П осл е этого в н овы й стек коп и р ую тся п ар ам етр ы , коли чество котор ы х зад ан о в вен ти л е вы зова и ад р ес во зврата. Т аки м об р азом , п ри вы зове п р и ви л еги р ован н ого м од уля чер ез вен ти л ь вы зова м ен ее п р и ви л еги р ован н ая п р огр ам м а н е м ож ет п ер ед ать в стеке б ол ьш е п ар ам етров, чем это оп р ед ел ен о оп ер ац и он н ой си стем ой д л я д ан н ого м од ул я. В кл ю чен и е ад р есов стеков в T S S п о звол яет р азд ели ть стеки зад ач и обесп ечи вает и х автом ати ческое п ер еклю чен и е п ри п ер еклю чен и и задач.
4 .2 . П ер екл ю ч ен и е зад ач Д л я п ерекл ю чен и я зад ач и м ею тся сл ед ую щ и е возм ож н ости :
п ер еклю чен и е п о ком ан д е JM P ; п ер еклю чен и е п о ком ан д е C A LL; п ер еклю чен и е п о п р еры ван и ю . В п ер вом и втор ом сл учаях д ля п ер екл ю чен и я зад ачи и сп ользую тся об ы чн ы е ком ан д ы JM P и C A LL, н о в качестве оп ер ан д а в эти х ком ан д ах указы вается ад р ес сегм ен та T S S зад ачи , н а котор ую н еоб ходи м о п ерекл ю чи ться. Е сл и п р ои зош л о п ер еклю чен и е с п ер во й зад ачи н а втор ую п ри п ом ощ и ком ан д ы JM P , то д л я возвр ата к вы п олн ен и ю п ер вой зад ачи н еоб ход и м о вн овь и сп ол ьзовать JM P , указав в качестве оп ер ан д а адр ес T S S п ервой зад ачи . К ом ан д а C A LL п озвол яет ор ган и зовать вы зов вл ож ен н ы х зад ач. П ер еклю чи вш и сь и з п ер во й зад ачи н а вторую , п р огр ам м а м ож ет вн овь вер н уться к п ер вой зад аче, есл и он а вы п ол н и т ком ан д у IR E T . В этом сл учае п о ком ан д е IR E T п р ои зой д ет об р атн ое п ер екл ю чен и е зад ач. А д р ес T S S д л я возвр ата ком ан д а IR E T возьм ѐт и з п ол я об ратн ой связи Lin k текущ его сегм ен та T S S , куд а он б ы л зап и сан ком ан д ой C A LL п ри п ер вом п ер екл ю чен и и зад ач. К р ом е того, п ри п ер екл ю чен и и зад ачи ком ан д ой C A LL в п ол е FLA G S сегм ен та T S S вы зван н ой зад ачи устан авл и вается в 1 б и т вл ож ен н ой зад ачи N T . К ом ан д а JM P , есл и он а и сп ол ьзован а д л я п ер екл ю чен и я зад ачи , сб р асы вает би т N T . Ф ор м ат р еги стр а ф лагов д л я п р оц ессор ов i80386 и i8 0486 оп и сан в п ри л ож ен и и . Р еги стр ф л агов FLA G S п р оц ессора i80286 - это м лад ш ее сл ово 32 -разр яд н ого р еги стр а E FLA G S . А н ал оги чн о том у, как м ож н о вы звать п од п р огр ам м у чер е з вен ти л ь вы зова, д л я вы зова зад ачи ком ан д ой C A LL м ож н о и сп ол ьзовать вен ти л ь зад ачи . Ф ор м ат вен ти л я зад ачи п р ед ставл ен н а ри с. 16.
Р и с. 16. В ен ти л ь зад ачи .
В ен ти ли зад ач, вы зы ваем ы х п о ком ан де C A LL, м огут р асп олагаться в таб л и ц ах G D T и л и LD T . О б р ати те вн и м ан и е н а одн о сущ ествен н ое р азли чи е м еж ду вы зовом п од п р огр ам м ы и вы зовом зад ачи . П осл е возвр ата и з п од п р огр ам м ы п р и еѐ п овтор н ом вы зове м ы вой д ѐм в п р оц ед уру в н ачал ьн ой точке вход а. В ан ал оги чн ом сл учае п ри возвр ате и з задачи и еѐ п овтор н ом вы зове уп р авлен и е б уд ет п еред ан о ком ан д е, н аход ящ ей ся сразу за ком ан дой IR E T . Э то п р ои сходи т п отом у, что п р и п ер екл ю чен и и задачи в сегм ен те T S S зап и сы вается сод ер ж и м ое р еги стр ов C S :IP н а м ом ен т п ерекл ю чен и я задачи . Е сл и зад ача б ы л а вы зван а п р и п ом ощ и ком ан д ы C A LL и возврат (об ратн ое п ер еклю чен и е) б ы л о вы п олн ен о п о ком ан д е IR E T , в T S S зап и сы вается ад рес C S :IP , указы ваю щ и й н а сл ед ую щ ую п осл е IR E T ком ан д у. В ы м ож ете п ом ести ть там ком ан д у безусл овн ого п ер еход а JM P н а н ачал о задачи и таки м об р азом зац и кл и ть задачу. П осл е этого вы зов задачи стан ет п охож н а вы зов п од п р ограм м ы . С ущ ествует ещ ѐ од н а очен ь и н тер есн ая возм ож н ость дл я п ер екл ю чен и я зад ач - п ер екл ю чен и е зад ач п о п р ер ы ван и ю . Э ту возм ож н ость м ож н о л егко р еали зовать, если п ом ести ть вен ти л ь зад ачи в д ескр и п тор н ую таб ли ц у п р ер ы ван и й ID T . Н ап р и м ер , м ож н о сд ел ать отд ел ьн ы е зад ачи д л я об р аб отки и склю чен и й и л и ап п ар атн ы х п р ер ы ван и й . В п осл ед н ем сл учае об р аб отчи кам ап п ар атн ы х п р еры ван и й н е н уж н о и сп ол ьзовать стек п р и кл ад н ы х зад ач, так как он и б уд ут и м еть свой соб ствен н ы й стек.
4 .3 . С и н хр о н и зац и я зад ач и сем аф о р ы П р еж д е чем м ы п р и вед ѐм кон кр етн ы й п р и м ер п р остей ш ей м ул ьти задачн ой си стем ы , р асскаж ем н ем н ого о п р и м ен ен и и сем аф ор ов как сред ств си н хр он и зац и и зад ач. К ак п р ави л о, л ю бая м ул ьти зад ачн ая оп ер ац и он н ая си стем а сод ер ж и т б ол ее и ли м ен ее р азви ты е ср ед ства си н хр он и зац и и и взаи м од ей стви я зад ач. С ем аф ор ы как ср ед ство си н хр он и зац и и зад ач п ред н азн ачен ы д л я уп р авл ен и я кол лекти вн ы м д оступ ом со стор он ы зад ач к каком у л и б о р есур су. П од р есурсом м ы б уд ем п он и м ать н е тол ько ф и зи чески е р есур сы ком п ью тер а (д и ски , кл ави атур у и т.д .), н о и л оги чески е р есур сы - ячей ки п ам яти , б уф ера и т.п . П р огр ам м а, влад ею щ ая ресурсом и л и созд авш ая р есур с м ож ет созд ать сем аф ор д л я уп равл ен и я эти м р есур сом . Ф и зи чески сем аф ор р еал и зуется в оп ер ати вн ой п ам яти и п р ед ставл яет и з себ я ячей ку п ам яти (д остаточн о од н ого бай та и л и и н огд а д аж е од н ого б и та п ам яти ). В п р остей ш ем сл учае д л я сем аф ор а оп р едел яю тся оп ер ац и и :
созд ан и е сем аф ор а; ун и чтож ен и е сем аф ор а; сб р ос сем аф ор а; сб р ос сем аф ор а; ож и д ан и е, п ока сем аф ор н е буд ет устан овл ен .
Э ти оп ер ац и и вы п олн яю тся оп ер ац и он н ой си стем ой п о зап р осам п ри кл адн ы х п р ограм м . В п ри м ер е м ул ьти зад ачн ой п р огр ам м ы , п р и вед ѐн н ой н и ж е в этой главе, м ы д ол ж н ы сам и р еал и зовать все сем аф ор н ы е оп ер ац и и . Ч то касается д вух п ер вы х оп ер ац и й , то м ы вы б р али сам ое п р остое р еш ен и е. С ем аф оры созд аю тся стати чески н а этап е тр ан сл яц и и п р ограм м ы и п р ед ставл яю т и з себ ы п р осты е стати чески е п ерем ен н ы е. О п ер ац и я ун и чтож ен и я сем аф ор а в этом сл учае н е и сп ол ьзуется, т.к. м ы созд аѐм все н уж н ы е н ам сем аф оры п р и тр ан сл яц и и п р огр ам м ы . О п ер ац и и сб р оса и устан овки сем аф ора заклю чаю тся в зап и си , соответствен н о, н уля и ед и н и ц ы в ячей ки п ам яти , р асп ред ел ѐн н ы е сем аф ор ам . Е д и н ствен н ая особ ен н ость вы п ол н ен и я эти х оп ерац и й закл ю чается в том , что он и д ол ж н ы бы ть н еп р ер ы ваем ы м и , то есть н а вр ем я вы п ол н ен и я эти х оп ер ац и й н еоб ходи м о зап р ети ть п ер еклю чен и е зад ач. Т ак как в н аш ем сл учае зад ачи п ерекл ю чаю тся п о п р ер ы ван и ям тай м ера, м ы н а вр ем я вы п олн ен и я оп ер ац и й сб р оса и устан овки сем аф ор а зап р ещ аем все п р ер ы ван и я п ри п ом ощ и ком ан д ы C LI. О п ер ац и я ож и д ан и я устан овки сем аф ор а, н ап р оти в, д ол ж н а вы п олн яться с р азр еш ѐн н ы м и п р ер ы ван и ям и , так как сем аф ор ож и д ает од н а зад ача, а его устан овку вы п ол н яет др угая зад ача. О д н ако в п р оц ессе ож и д ан и я н еобход и м о счи тать сод ер ж и м ое сем аф ор а и п р овери ть его состоян и е, и вот эта оп ер ац и я д ол ж н а вы п олн яться с зап р ещ ѐн н ы м и п р ер ы ван и ям и .
4 .4 . П р и м ер м ул ьти зад ач н о го м о н и то р а Д л я того, чтоб ы вы м огли п очувствовать м ул ьти зад ачн ость, м ы п од готови л и п р и м ер п р огр ам м ы , реал и зую щ ей п ар ал лел ьн ую раб оту н ескол ьки х зад ач в р еж и м е р азд ел ен и я вр ем ен и . Э та п р огр ам м а состои т и з н ескол ьки х м од ул ей , составл ен н ы х н а язы ках ассем б л ер а и С и . П ер вы е д ва ф ай л а п р ед н азн ачен ы д л я оп р ед ел ен и я и сп ол ьзуем ы х кон стан т и стр уктур дан н ы х.
Листинг 4. Определение констант и структур для модулей, составленных на языке ассемблера. Файл tos.inc ----------------------------------------------------------CMOS_PORT PORT_6845 COLOR_PORT MONO_PORT STATUS_PORT SHUT_DOWN INT_MASK_PORT VIRTUAL_MODE A20_PORT A20_ON A20_OFF EOI MASTER8259A SLAVE8259A KBD_PORT_A KBD_PORT_B
equ equ equ equ equ equ equ equ equ equ
equ equ 3d4h equ 64h equ 21h 0001 equ 0dfh 0ddh equ 20h 0a0h 60h 61h
70h 63h 3b4h 0feh 0d1h 20h
L_SHIFT NL_SHIFT R_SHIFT NR_SHIFT
equ
L_CTRL NL_CTRL R_CTRL NR_CTRL
equ equ equ equ
0000000000000100b 1111111111111011b 0000000000001000b 1111111111110111b
L_ALT NL_ALT R_ALT NR_ALT
equ equ equ equ
0000000000010000b 1111111111101111b 0000000000100000b 1111111111011111b
equ
equ 0000000001000000b equ 0000000010000000b equ 0000000100000000b 0000001000000000b
equ
CAPS_LOCK SCR_LOCK NUM_LOCK INSERT STRUC
ENDS
0000000000000001b equ 1111111111111110b 0000000000000010b equ 1111111111111101b
idtr_struc idt_len dw 0 idt_low dw 0 idt_hi db 0 rsrv db 0 idtr_struc
Листинг 5. Определение констант и структур для модулей,
составленных на языке Си. Файл tos.h ----------------------------------------------------------#define word unsigned int // Селекторы, определѐнные в GDT #define CODE_SELECTOR #define DATA_SELECTOR
0x08 // сегмент кода 0x10 // сегмент данных
#define TASK_1_SELECTOR #define TASK_2_SELECTOR #define MAIN_TASK_SELECTOR
0x18 // задача TASK_1 0x20 // задача TASK_2 0x28 // главная задача
#define VID_MEM_SELECTOR #define IDT_SELECTOR
0x30 // сегмент видеопамяти 0x38 // талица IDT
#define KEYBIN_TASK_SELECTOR #define KEYB_TASK_SELECTOR
0x40 // задача ввода с клавиатуры 0x48 // задача обработки // клавиатурного
прерывания #define FLIP_TASK_SELECTOR
0x50 // задача FLIP_TASK
// Байт доступа typedef struct { unsigned accessed unsigned read_write unsigned conf_exp unsigned code unsigned xsystem unsigned dpl unsigned present } ACCESS;
: 1; : 1; : 1; : 1; : 1; : 2; : 1;
// Структура дескриптора typedef struct descriptor { word limit; word base_lo; unsigned char base_hi; unsigned char type_dpl; unsigned reserved; } descriptor; // Структура вентиля вызова, задачи, прерывания, // исключения typedef struct gate { word offset; word selector; unsigned char count; unsigned char type_dpl; word reserved; } gate; // Структура сегмента состояния задачи TSS typedef struct tss { word link;
// поле обратной связи
word word word word word word
sp0; ss0; sp1; ss1; sp2; ss2;
// указатель стека кольца 0
word word word word word word word word word word word word word word word
ip; flags; ax; cx; dx; bx; sp; bp; si; di; es; cs; ss; ds; ldtr;
// регистры процессора
// указатель стека кольца 1 // указатель стека кольца 1
} tss; // Размеры сегментов и структур #define #define #define #define
TSS_SIZE DESCRIPTOR_SIZE GATE_SIZE IDT_SIZE
(sizeof(tss)) (sizeof(descriptor)) (sizeof(gate)) (sizeof(idt))
// Физические адреса видеопамяти для цветного // и монохромного видеоадаптеров #define COLOR_VID_MEM #define MONO_VID_MEM
0xb8000L 0xb0000L
// Видеоржеимы #define MONO_MODE #define BW_80_MODE #define COLOR_80_MODE
0x07 // монохромный 0x02 // монохромный, 80 символов 0x03 // цветной, 80 символов
// Значения для поля доступа #define #define #define #define #define #define #define
TYPE_CODE_DESCR TYPE_DATA_DESCR TYPE_TSS_DESCR TYPE_CALL_GATE TYPE_TASK_GATE TYPE_INTERRUPT_GATE TYPE_TRAP_GATE
#define SEG_WRITABLE #define SEG_READABLE #define SEG_PRESENT_BIT
0x18 0x10 0x01 0x04 0x85 0x86 0x87 0x02 0x02 0x80
// Константы для обработки аппаратных // прерываний #define EOI #define MASTER8259A #define SLAVE8259A
0x20 0x20 0xa0
// Макро для формирования физического // адреса из компонент сегменоного адреса // и смещения #define MK_LIN_ADDR(seg,off) (((unsigned long)(seg))<<4)+(word)(off) // Тип указателя на функцию типа void без параметров typedef void (func_ptr)(void); Ф ай л tos.c (ли сти н г 6) содер ж и т осн овн ую п р ограм м у, которая и н и ц и али зи р ует п р оц ессор д л я раб оты в защ и щ ѐн н ом р еж и м е и зап ускает все зад ачи . С п ом ощ ью ф ун кц и и с н азван и ем In it_A n d _P rotected _M od e_E n try() м ы п оп адаем в защ и щ ѐн н ы й р еж и м и вы вод и м сооб щ ен и е н а экран о том , что в главн ой зад аче устан овл ен защ и щ ѐн н ы й р еж и м . Реги стр T R загр уж ается сел ектор ом главн ой зад ачи п р и п ом ощ и ф ун кц и и load_task_register(). С р азу п осл е этого п р ограм м а п ер екл ю чается н а вы п ол н ен и е зад ачи T A S K _1. Э та зад ача п р осто вы вод и т сооб щ ен и е о своѐм зап уске н а экр ан и возвр ащ ает уп р авл ен и е главн ой зад аче. Ц ел ь этой п р оц ед ур ы п р од ем он стр и р овать п р оц есс п ер еклю чен и я зад ач с п ом ощ ью ком ан д ы JM P. П осл е возвр ата в гл авн ую зад ачу п р огр ам м а р азм аски р ует п р ер ы ван и я от кл ави атур ы и тай м ера. К ак тол ько н ачи н аю т п оступ ать и об р абаты ваться п р ер ы ван и я тай м ер а, ож и ваю т остал ьн ы е зад ачи , оп р ед ел ѐн н ы е п р и и н и ц и али зац и и си стем ы . Н ачи н ая с этого м ом ен та главн ая зад ача разд ел яет п р оц ессор н ое вр ем я н аравн е с остал ьн ы м и задачам и . Ч то ж е он а д елает? Гл авн ая зад ача сб расы вает сем аф ор с н ом ер ом 0, всл ед за чем ож и д ает его устан овку. Э тот сем аф ор устан авл и вается зад ачей , котор ая зан и м ается ввод ом си м вол ов с кл ави атур ы и вы вод и т н а экр ан скан -код ы кл ави ш , а такж е состоян и е п ер екл ю чаю щ и х кл ави ш . К ак тол ько окаж ется н аж атой кл ави ш а E S C , зад ача ввод а си м вол ов с кл ави атур ы устан авл и вает сем аф ор 0, что и п ри вод и т к завер ш ен и ю р аб оты гл авн ой задачи . П ер ед тем , как завер ш и ть р аб оту, гл авн ая зад ача устан авл и вает реал ьн ы й р еж и м р аб оты п р оц ессор а, сти р ает экр ан и возвр ащ ает уп р авл ен и е оп ер ац и он н ой си стем е.
Листинг 6. Программа мультизадачного монитора. Файл tos.c ----------------------------------------------------------#include #include #include #include #include
<stdio.h> <stdlib.h> <dos.h> "tos.h"
// -------------------------------// Определения вызываемых функций // -------------------------------void Init_And_Protected_Mode_Entry(void); void protected_mode(unsigned long gdt_ptr, unsigned int gdt_size, word cseg, word dseg); word void void void void void
load_task_register(word tss_selector); real_mode(void); jump_to_task(word tss_selector); load_idtr(unsigned long idt_ptr, word idt_size); Keyb_int(void); Timer_int(void);
void Int_30h_Entry(void); extern void
word kb_getch(void); enable_interrupt(void);
void void void void
task1(void); task2(void); flipflop_task(void); keyb_task(void);
void init_tss(tss *t, word cs, word ds, unsigned char *sp, func_ptr ip); void init_gdt_descriptor(descriptor *descr, unsigned long base, word limit, unsigned char type); void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void
exception_0(void); //{ prg_abort(0); } exception_1(void); //{ prg_abort(1); } exception_2(void); //{ prg_abort(2); } exception_3(void); //{ prg_abort(3); } exception_4(void); //{ prg_abort(4); } exception_5(void); //{ prg_abort(5); } exception_6(void); //{ prg_abort(6); } exception_7(void); //{ prg_abort(7); } exception_8(void); //{ prg_abort(8); } exception_9(void); //{ prg_abort(9); } exception_A(void); //{ prg_abort(0xA); } exception_B(void); //{ prg_abort(0xB); } exception_C(void); //{ prg_abort(0xC); } exception_D(void); //{ prg_abort(0xD); } exception_E(void); //{ prg_abort(0xE); } exception_F(void); //{ prg_abort(0xF); } exception_10(void); //{ prg_abort(0x10); exception_11(void); //{ prg_abort(0x11); exception_12(void); //{ prg_abort(0x12); exception_13(void); //{ prg_abort(0x13); exception_14(void); //{ prg_abort(0x14); exception_15(void); //{ prg_abort(0x15); exception_16(void); //{ prg_abort(0x16); exception_17(void); //{ prg_abort(0x17); exception_18(void); //{ prg_abort(0x18); exception_19(void); //{ prg_abort(0x19); exception_1A(void); //{ prg_abort(0x1A); exception_1B(void); //{ prg_abort(0x1B); exception_1C(void); //{ prg_abort(0x1C); exception_1D(void); //{ prg_abort(0x1D); exception_1E(void); //{ prg_abort(0x1E); exception_1F(void); //{ prg_abort(0x1F);
void iret0(void); void iret1(void); // -------------------------------------// Глобальная таблица дескрипторов GDT // -------------------------------------descriptor
gdt[11];
// -------------------------------------// Дескрипторная таблица прерываний IDT // -------------------------------------gate
idt[] = {
} } } } } } } } } } } } } } } }
// Обработчики исключений { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { {
(word)&exception_0, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 0 (word)&exception_1, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 1 (word)&exception_2, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 2 (word)&exception_3, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 3 (word)&exception_4, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 4 (word)&exception_5, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 5 (word)&exception_6, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 6 (word)&exception_7, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 7 (word)&exception_8, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 8 (word)&exception_9, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 9 (word)&exception_A, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // A (word)&exception_B, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // B (word)&exception_C, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // C (word)&exception_D, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // D (word)&exception_E, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // E (word)&exception_F, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // F (word)&exception_10, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 10 (word)&exception_11, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 11 (word)&exception_12, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 12 (word)&exception_13, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 13 (word)&exception_14, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 14 (word)&exception_15, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 15 (word)&exception_16, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 16 (word)&exception_17, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 17 (word)&exception_18, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 18 (word)&exception_19, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 19 (word)&exception_1A, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 1A (word)&exception_1B, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 1B (word)&exception_1C, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 1C (word)&exception_1D, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 1D (word)&exception_1E, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 1E (word)&exception_1F, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 1F
// Обработчик прерываний таймера { (word)&Timer_int, CODE_SELECTOR, 0, TYPE_INTERRUPT_GATE, 0 }, // 20 // Вентиль задачи, запускающейся по прерыванию от клавиатуры { 0, KEYB_TASK_SELECTOR, 0, TYPE_TASK_GATE, 0 }, // 21 // Заглушки для остальных аппаратных прерываний { { { { { {
(word)&iret0, (word)&iret0, (word)&iret0, (word)&iret0, (word)&iret0, (word)&iret0,
CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR,
0, 0, 0, 0, 0, 0,
TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE,
0 0 0 0 0 0
}, }, }, }, }, },
// // // // // //
22 23 24 25 26 27
{ { { { { { { {
(word)&iret1, (word)&iret1, (word)&iret1, (word)&iret1, (word)&iret1, (word)&iret1, (word)&iret1, (word)&iret1,
CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR,
0, 0, 0, 0, 0, 0, 0, 0,
TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE,
0 0 0 0 0 0 0 0
}, }, }, }, }, }, }, },
// // // // // // // //
28 29 2A 2B 2C 2D 2E 2F
// Обработчик для программного прерывания, которое
// используется для ввода с клавиатуры { (word)&Int_30h_Entry, CODE_SELECTOR, 0, TYPE_INTERRUPT_GATE, 0 }, // Вентиль задачи FLIP_TASK { 0, FLIP_TASK_SELECTOR, 0, TYPE_TASK_GATE, 0 } // 31 }; // ------------------------------------------// Сегменты TSS для различных задач // ------------------------------------------tss tss tss tss tss tss
main_tss; // TSS главной задачи task_1_tss; // TSS задачи TASK_1 task_2_tss; // TSS задачи TASK_2 keyb_task_tss; // TSS задач обслуживания keyb_tss; // клавиатуры flipflop_tss; // TSS задачи FLIP_TASK
// ------------------------------------------// Стеки для задач // ------------------------------------------unsigned unsigned unsigned unsigned unsigned
char char char char char
word y=0;
task_1_stack[1024]; task_2_stack[1024]; keyb_task_stack[1024]; keyb_stack[1024]; flipflop_stack[1024]; // номер текущей строки для вывода на экран
// ------------------------------------------// Начало программы // ------------------------------------------void main(void) { // Стираем экран textcolor(BLACK); textbackground(LIGHTGRAY); clrscr(); // Входим в защищѐнный режим Init_And_Protected_Mode_Entry(); // Выводим сообщение vi_hello_msg(); y=3; vi_print(0, y++, " Установлен защищѐнный режим в главной задаче", 0x7f); // Загружаем регистр TR селектором главной задачи // т.е. задачи main() load_task_register(MAIN_TASK_SELECTOR); // Переключаемся на задачу TASK_1
// 30
jump_to_task(TASK_1_SELECTOR); // После возврата в главную задачу выдаѐм сообщение vi_print(0, y++ ," Вернулись в главную задачу", 0x7f); y++; // Запускаем планировщик задач vi_print(0, y++ ," Запущен планировщик задач", 0x70); enable_interrupt(); // разрешаем прерывание таймера // Ожидаем установки семафора с номером 0. После того, // как этот семафор окажется установлен, возвращаемся // в реальный режим. // Семафор 0 устанавливается задачей, обрабатывающей ввод с // клавиатуры, которая работает независимо от // главной задаче. vi_print(0, y++ ," Для возврата в реальный режим нажмите ESC", 0x70); sem_clear(0); // сброс семафора 0 sem_wait(0); // ожидание установки семафора 0 // Возврат в реальный режим, стирание экрана и // передача управления MS-DOS real_mode(); textcolor(WHITE); textbackground(BLACK); clrscr(); } // ----------------------------------// Функция инициализации сегмента TSS // ----------------------------------void init_tss(tss *t, word cs, word ds, unsigned char *sp, func_ptr ip) { t->cs t->ds t->es t->ss t->ip t->sp t->bp
= = = = = = =
cs; ds; ds; ds; (word)ip; (word)sp; (word)sp;
// селектор сегмента кода // поля ds, es, ss устанавливаем // на сегмент данных // указатель команд // смещение стека
} // ------------------------------------------------// Функция инициализации дескриптора в таблице GDT // ------------------------------------------------void init_gdt_descriptor(descriptor *descr, unsigned long base, word limit, unsigned char type) { // Младшее слово базового адреса descr->base_lo = (word)base; // Старший байт базового адреса descr->base_hi = (unsigned char)(base >> 16);
// Поле доступа дескриптора descr->type_dpl = type; // Предел descr->limit
= limit;
// Зарезервированное поле, должно быть // сброшено в 0 descr->reserved = 0; } // // // //
----------------------------------------------Инициализация всех таблиц и вход в защищѐнный режим -----------------------------------------------
void Init_And_Protected_Mode_Entry(void) { union REGS r; // Инициализируем таблицу GDT, элементы с 1 по 5 init_gdt_descriptor(&gdt[1], MK_LIN_ADDR(_CS, 0), 0xffffL, TYPE_CODE_DESCR | SEG_PRESENT_BIT | SEG_READABLE); init_gdt_descriptor(&gdt[2], MK_LIN_ADDR(_DS, 0), 0xffffL, TYPE_DATA_DESCR | SEG_PRESENT_BIT | SEG_WRITABLE); init_gdt_descriptor(&gdt[3], MK_LIN_ADDR(_DS, &task_1_tss), (unsigned long)TSS_SIZE-1, TYPE_TSS_DESCR | SEG_PRESENT_BIT); init_gdt_descriptor(&gdt[4], MK_LIN_ADDR(_DS, &task_2_tss), (unsigned long)TSS_SIZE-1, TYPE_TSS_DESCR | SEG_PRESENT_BIT); init_gdt_descriptor(&gdt[5], MK_LIN_ADDR(_DS, &main_tss), (unsigned long)TSS_SIZE-1, TYPE_TSS_DESCR | SEG_PRESENT_BIT); // Инициализируем TSS для задач TASK_1, TASK_2 init_tss(&task_1_tss, CODE_SELECTOR, DATA_SELECTOR, task_1_stack+ sizeof(task_1_stack), task1); init_tss(&task_2_tss, CODE_SELECTOR, DATA_SELECTOR, task_2_stack+ sizeof(task_2_stack), task2); // Инициализируем элемент 6 таблицы GDT // дескриптор для сегмента видеопамяти // Определяем видеорежим r.h.ah=15; int86(0x10,&r,&r); // Инициализация для монохромного режима if(r.h.al==MONO_MODE) init_gdt_descriptor(&gdt[6], MONO_VID_MEM, 3999, TYPE_DATA_DESCR | SEG_PRESENT_BIT | SEG_WRITABLE); // Инициализация для цветного режима
else if(r.h.al == BW_80_MODE || r.h.al == COLOR_80_MODE) init_gdt_descriptor(&gdt[6], COLOR_VID_MEM, 3999, TYPE_DATA_DESCR | SEG_PRESENT_BIT | SEG_WRITABLE); else { printf("\nИзвините, этот видеорежим недопустим."); exit(-1); } // Инициализация элементов 7 и 8 таблицы GDT init_gdt_descriptor(&gdt[7], MK_LIN_ADDR(_DS, &idt), (unsigned long)IDT_SIZE-1, TYPE_DATA_DESCR | SEG_PRESENT_BIT | SEG_WRITABLE); init_gdt_descriptor(&gdt[8], MK_LIN_ADDR(_DS, &keyb_task_tss), (unsigned long)TSS_SIZE-1, TYPE_TSS_DESCR | SEG_PRESENT_BIT); // Инициализация TSS для задачи KEYB_TASK init_tss(&keyb_task_tss, CODE_SELECTOR, DATA_SELECTOR, keyb_task_stack + sizeof(keyb_task_stack), keyb_task); // Инициализация элемента 9 таблицы GDT init_gdt_descriptor(&gdt[9], MK_LIN_ADDR(_DS, &keyb_tss), (unsigned long)TSS_SIZE-1, TYPE_TSS_DESCR | SEG_PRESENT_BIT); // Инициализация TSS для задачи KEYB обработки ввода с клавиатуры init_tss(&keyb_tss, CODE_SELECTOR, DATA_SELECTOR, keyb_stack + sizeof(keyb_stack), Keyb_int); // Инициализация элемента 10 таблицы GDT init_gdt_descriptor(&gdt[10], MK_LIN_ADDR(_DS, &flipflop_tss), (unsigned long)TSS_SIZE-1, TYPE_TSS_DESCR | SEG_PRESENT_BIT); // Инициализация TSS для задачи FLIP_TASK init_tss(&flipflop_tss, CODE_SELECTOR, DATA_SELECTOR, flipflop_stack + sizeof(flipflop_stack), flipflop_task); // Загрузка регистра IDTR load_idtr(MK_LIN_ADDR(_DS, &idt), IDT_SIZE); // Вход в защищѐнный режим protected_mode(MK_LIN_ADDR(_DS, &gdt), sizeof(gdt), CODE_SELECTOR, DATA_SELECTOR); }
Ф ай л tasks.c сод ер ж и т тексты п р ограм м , котор ы е б уд ут раб отать в р еж и м е разд ел ен и я вр ем ен и (кр ом е зад ачи T A S K _1, эта зад ача зап ускается тол ько од и н р аз). Зад ача T A S K _1 (п р оц ед ур а task1) вы даѐт сооб щ ен и е о своѐм зап уске и п ер едаѐт уп р авл ен и е гл авн ой зад аче. Зад ача T A S K _2 (п р оц ед ур а task2) п оп ер ем ен н о вы вод и т н а экр ан стр оки "FLIP" и "FLO P ", п ер екл ю чая п оп утн о сем аф ор с н ом ер ом 1. Зад ача FLIP _T A S K (п р оц ед ура flip flop _task) такж е п оп ер ем ен н о вы вод и т н а экр ан строки "FLIP " и "FLO P ", н о тол ько тогд а, когд а сем аф ор с н ом ер ом 1 устан овл ен . Т аки м об р азом , зад ача T A S K _2 уп р авл яет р аб отой зад ачи FLIP_TASK. Зад ача K E Y B _T A S K (п р оц ед ур а keyb _task) ввод и т си м вол ы с кл ави а тур ы и вы вод и т скан -код ы н аж аты х кл ави ш , а такж е состоян и е п ер екл ю чаю щ и х кл ави ш . К ак тол ько оказы вается н аж атой кл ави ш а E S C , зад ача устан авли вает сем аф ор с н ом ер ом 0, что п р и вод и т к завер ш ен и ю р аб оты главн ой задачи (ож и даю щ ей устан овки этого сем аф ор а).
Листинг 7. Задачи, которые будут работать параллельно. Файл tasks.c ----------------------------------------------------------#include #include #include #include #include
<stdio.h> <dos.h> <stdlib.h> "tos.h"
word dispatcher(void); // Номер текущей строки для вывода на экран extern unsigned int y; // Задача TASK_1 void task1(void) { while(1){ vi_print(0,y++," Запущена задача TASK_1, " "переходим к главной задаче", 0x70); jump_to_task(MAIN_TASK_SELECTOR); // После повторного запуска этой задачи // снова входим в цикл. } } // Задача TASK_2 word flipflop1 = 0; long delay_cnt1 = 0l; void task2(void) { while(1){ // Периодически выводим на экран строки // FLIP/FLOP, каждый раз переключая // семафор номер 1. Этот семафор однозначно
// соответствует выведенной на экран строке. asm sti if(delay_cnt1 > 150000l ) { asm cli if(flipflop1) { vi_print(73,3," FLIP ", 0x4f); sem_clear(1); } else { vi_print(73,3," FLOP ", 0x1f); sem_set(1); } flipflop1 ^= 1; delay_cnt1 = 0l; asm sti } delay_cnt1++; } } word flipflop = 0; long delay_cnt = 0l; void flipflop_task(void) { // // // // //
Эта задача также периодически выводит на экран строки FLIP/FLOP, но выводит строкой выше и с меньшим периодом. Кроме того, эта задача работает только тогда, когда установлен семафор номер 1. while(1){ asm sti if(delay_cnt > 20000l ) sem_wait(1); // asm cli if(flipflop) else flipflop ^= 1; delay_cnt = 0l; asm sti } delay_cnt++; }
{ ожидаем установки семафора vi_print(73,2," FLIP ", 0x20); vi_print(73,2," FLOP ", 0x20);
} word keyb_code; extern word keyb_status; void keyb_task(void) { // // // // // // // // // //
Эта задача вводит символы с клавиатуры и отображает скан-коды нажатых клавиш и состояние переключающих клавиш на экране. Если нажимается клавиша ESC, задача устанавливает семафор номер 0. Работающая параллельно главная задача ожидает установку этого семафора. Как только семафор 0 окажется установлен, главная задача завершает свою работу и программа возвращает процессор в реальный режим, затем передаѐт
// управление MS-DOS. vi_print(60, 5, " Key code: .... ", 0x20); vi_print(60, 6, " Key status: .... ", 0x20); while(1){ keyb_code = kb_getch(); vi_put_word(73, 5, keyb_code, 0x4f); vi_put_word(73, 6, keyb_status, 0x4f); if((keyb_code & 0x00ff) == 1) sem_set(0); } }
Ф ай л sem ap h or.c сод ерж и т и сход н ы е тексты п р оц едур сб р оса сем аф ор а, устан овки сем аф ор а и ож и д ан и я сем аф ор а. В м асси ве sem ap h ore[5] оп ред ел ен о п ять сем аф ор ов. Р азум еется, что когд а вы буд ете эксп ер и м ен ти р овать с п р огр ам м ой , вы м ож ете и зм ен и ть кол и чество д оступ н ы х сем аф ор ов.
Листинг 8. Процедуры для работы с семафорами. Файл semaphor.c ----------------------------------------------------------#include #include #include #include #include
<stdio.h> <dos.h> <stdlib.h> "tos.h"
// Массив из пяти семафоров word semaphore[5]; // Процедура сброса семафора. // Параметр sem - номер сбрасываемого семафора void sem_clear(int sem) { asm cli semaphore[sem] = 0; asm sti } // Процедура установки семафора // Параметр sem - номер устанавливаемого семафора void sem_set(int sem) { asm cli semaphore[sem] = 1; asm sti } // Ожидание установки семафора // Параметр sem - номер ожидаемого семафора void sem_wait(int sem) { while(1) { asm cli
if(semaphore[sem]) break; // проверяем семафор asm sti // ожидаем установки семафора asm nop asm nop } asm sti }
Ф ай л tim er.c сод ер ж и т об р аботчи к ап п аратн ого п р ер ы ван и я тай м ер а, котор ы й п ер и оди чески вы д аѐт звуковой си гн ал и и н и ц и и р ует р аб оту д и сп етчер а зад ач. Д и сп етчер зад ач ц и кли чески п ер еб и р ает сел ектор ы T S S зад ач, участвую щ и х в п р оц ессе разд ел ен и я вр ем ен и , возвр ащ ая сел ектор той зад ачи , котор ая дол ж н а стать акти вн ой . В сам ом кон ц е обр аб отки ап п аратн ого п р ер ы ван и я тай м ер а п р ои сход и т п ер екл ю чен и е и м ен н о н а эту задачу.
Листинг 9. Процедуры для работы с таймером и диспетчер задач. Файл timer.c ----------------------------------------------------------#include #include #include #include #include
<stdio.h> <dos.h> <stdlib.h> "tos.h"
// ------------------------------------------// Модуль обслуживания таймера // ------------------------------------------#define EOI 0x20 #define MASTER8259A 0x20 extern void beep(void); extern void flipflop_task(void); void Timer_int(void); word dispatcher(void); word
timer_cnt;
// -----------------------------------------// Обработчик аппаратного прерывания таймера // -----------------------------------------void Timer_int(void) { asm pop bp // Периодически выдаѐм звуковой сигнал timer_cnt += 1; if((timer_cnt & 0xf) == 0xf) { beep(); } // Выдаѐм в контроллер команду конца // прерывания
asm mov al,EOI asm out MASTER8259A,al // Переключаемся на следующую задачу, // селектор TSS которой получаем от // диспетчера задач dispatcher() jump_to_task(dispatcher()); asm iret } // -------------------------------------// Диспетчер задач // -------------------------------------// Массив селекторов, указывающих на TSS // задач, участвующих в параллельной работе, // т.е. диспетчеризуемых задач word task_list[] = { MAIN_TASK_SELECTOR, FLIP_TASK_SELECTOR, KEYBIN_TASK_SELECTOR, TASK_2_SELECTOR }; word current_task = 0; // текущая задача word max_task = 3; // количество задач - 1 // // // //
Используем простейший алгоритм диспетчеризации выполняем последовательное переключение на все задачи, селекторы TSS которых находятся в массиве task_list[].
word dispatcher(void) { if(current_task < max_task) current_task++; else current_task = 0; return(task_list[current_task]); }
Д л я сокр ащ ен и я об ъ ѐм а и б ез того сл ож н ой п р огр ам м ы м ы н е стали д ел ать ф ун кц и он ал ьн о п ол н ую обр аб отку и скл ю чен и й , огр ан и чи вш и сь п р осты м авар и й н ы м завер ш ен и ем р аб оты п р огр ам м ы с вы д ачей н ом ера и скл ю чен и я. И сход н ы е тексты обр аб отчи ков и склю чен и й н аход ятся в ф ай л е excep t.c.
Листинг 10. Обработка исключений. Файл except.c ----------------------------------------------------------#include #include #include #include #include
<stdio.h> <dos.h> <stdlib.h> "tos.h"
void prg_abort(int err); // Номер текущей строки для вывода на экран extern unsigned int y; // Обработчики исключений void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void void
exception_0(void) { prg_abort(0); } exception_1(void) { prg_abort(1); } exception_2(void) { prg_abort(2); } exception_3(void) { prg_abort(3); } exception_4(void) { prg_abort(4); } exception_5(void) { prg_abort(5); } exception_6(void) { prg_abort(6); } exception_7(void) { prg_abort(7); } exception_8(void) { prg_abort(8); } exception_9(void) { prg_abort(9); } exception_A(void) { prg_abort(0xA); } exception_B(void) { prg_abort(0xB); } exception_C(void) { prg_abort(0xC); } exception_D(void) { prg_abort(0xD); } exception_E(void) { prg_abort(0xE); } exception_F(void) { prg_abort(0xF); } exception_10(void) { prg_abort(0x10); exception_11(void) { prg_abort(0x11); exception_12(void) { prg_abort(0x12); exception_13(void) { prg_abort(0x13); exception_14(void) { prg_abort(0x14); exception_15(void) { prg_abort(0x15); exception_16(void) { prg_abort(0x16); exception_17(void) { prg_abort(0x17); exception_18(void) { prg_abort(0x18); exception_19(void) { prg_abort(0x19); exception_1A(void) { prg_abort(0x1A); exception_1B(void) { prg_abort(0x1B); exception_1C(void) { prg_abort(0x1C); exception_1D(void) { prg_abort(0x1D); exception_1E(void) { prg_abort(0x1E); exception_1F(void) { prg_abort(0x1F);
} } } } } } } } } } } } } } } }
// -----------------------------// Аварийный выход из программы // -----------------------------void prg_abort(int err) { vi_print(1,y++,"!!! ---> Произошло исключение", 0xc); real_mode(); // Возвращаемся в реальный режим // В реальном режиме выводим сообщение об исключении gotoxy(1, ++y); cprintf(" Исключение %X, нажмите любую клавишу", err); getch(); textcolor(WHITE); textbackground(BLACK); clrscr(); exit(0);
}
В ф ай л е in tp roc.c расп ол ож ен ы загл уш ки д л я тех ап п ар атн ы х п р ер ы ван и й , об раб отка котор ы х свод и тся к п р остой п осы л ке код а кон ц а п р ер ы ван и я в соответствую щ и й кон тр ол л ер п р ер ы ван и я.
Листинг 11. Заглушки для аппаратных прерываний. Файл intproc.c ----------------------------------------------------------#include #include #include #include #include
<stdio.h> <dos.h> <stdlib.h> "tos.h"
// Заглушки для необрабатываемых // аппаратных прерываний. void iret0(void) { // первый контроллер прерываний asm { push ax mov al,EOI out MASTER8259A,al pop ax pop bp iret } } void iret1(void) { // второй контроллер прерываний asm { push ax mov al,EOI out MASTER8259A,al out SLAVE8259A,al pop ax pop bp iret } }
Ф ай л keyb .c сод ер ж и т п р остой и н тер ф ей с д л я вы зова п р огр ам м н ого п р ер ы ван и я in t 30h , об есп ечи ваю щ его ввод с кл ави атур ы .
Листинг 12. Ввод символа с клавиатуры. Файл keyb.c ----------------------------------------------------------#include <stdio.h> #include <dos.h>
#include #include <stdlib.h> #include "tos.h" extern word key_code; // Функция, ожидающая нажатия любой // клавиши и возвращающая еѐ скан-код unsigned int kb_getch(void) { asm int 30h return(key_code); }
О б р аб отчи к ап п ар атн ого п рер ы ван и я кл ави атур ы м ы взял и п р акти чески б ез и зм ен ен и й и з п р огр ам м ы , п р ед ставл ен н ой в п ред ы д ущ ей главе. И сход н ы е тексты н аход ятся в ф ай л е keyb oard .asm .
Листинг 13. Процедуры для работы с клавиатурой. Файл keyboard.asm ----------------------------------------------------------IDEAL MODEL SMALL RADIX 16 P286 include "tos.inc" ; -----------------------------------------; Модуль обслуживания клавиатуры ; -----------------------------------------PUBLIC _Keyb_int, _Int_30h_Entry, _key_code, _keyb_status EXTRN _beep:PROC DATASEG _key_flag _key_code ext_scan _keyb_status
db dw db dw
CODESEG PROC
_Keyb_int cli
NEAR
call
_beep
push mov cmp jz cmp jz
ax al, [ext_scan] al, 0 normal_scan1 al, 0e1h pause_key
in
al, 60h
0 0 0 0
cmp jz cmp jz
al, 2ah intkeyb_exit_1 al, 0aah intkeyb_exit_1
mov call
ah, [ext_scan] Keyb_PutQ
mov mov jmp
al, 0 [ext_scan], al intkeyb_exit
pause_key: in cmp jz cmp jz
al, 60h al, 0c5h pause_key1 al, 45h pause_key1
jmp
intkeyb_exit
pause_key1: mov call mov mov jmp normal_scan1: in cmp jz cmp jz cmp jnz
ah, [ext_scan] Keyb_PutQ al, 0 [ext_scan], al intkeyb_exit
al, 60h al, 0feh intkeyb_exit al, 0e1h ext_key al, 0e0h normal_scan
ext_key: mov jmp
[ext_scan], al intkeyb_exit
intkeyb_exit_1: mov al, 0 mov [ext_scan], al jmp intkeyb_exit normal_scan: mov call
ah, 0 Keyb_PutQ
intkeyb_exit: in mov or out xchg out mov out
al, 61h ah, al al, 80h 61h, al ah, al 61h, al al,EOI MASTER8259A,al
ENDP
pop ax sti iret jmp _Keyb_int _Keyb_int
PROC
Keyb_PutQ
NEAR
push
ax
cmp jnz mov or mov jmp
ax, 002ah ; L_SHIFT down @@kb1 ax, [_keyb_status] ax, L_SHIFT [_keyb_status], ax keyb_putq_exit
cmp jnz mov and mov jmp
ax, 00aah ; L_SHIFT up @@kb2 ax, [_keyb_status] ax, NL_SHIFT [_keyb_status], ax keyb_putq_exit
cmp jnz mov or mov jmp
ax, 0036h ; R_SHIFT down @@kb3 ax, [_keyb_status] ax, R_SHIFT [_keyb_status], ax keyb_putq_exit
cmp jnz mov and mov jmp
ax, 00b6h ; R_SHIFT up @@kb4 ax, [_keyb_status] ax, NR_SHIFT [_keyb_status], ax keyb_putq_exit
cmp jnz mov or mov jmp
ax, 001dh ; L_CTRL down @@kb5 ax, [_keyb_status] ax, L_CTRL [_keyb_status], ax keyb_putq_exit
cmp jnz mov and mov jmp
ax, 009dh ; L_CTRL up @@kb6 ax, [_keyb_status] ax, NL_CTRL [_keyb_status], ax keyb_putq_exit
cmp jnz mov or mov jmp
ax, 0e01dh ; R_CTRL down @@kb7 ax, [_keyb_status] ax, R_CTRL [_keyb_status], ax keyb_putq_exit
cmp jnz
ax, 0e09dh @@kb8
@@kb1:
@@kb2:
@@kb3:
@@kb4:
@@kb5:
@@kb6:
@@kb7: ; R_CTRL up
mov and mov jmp
ax, [_keyb_status] ax, NR_CTRL [_keyb_status], ax keyb_putq_exit
cmp jnz mov or mov jmp
ax, 0038h ; L_ALT down @@kb9 ax, [_keyb_status] ax, L_ALT [_keyb_status], ax keyb_putq_exit
cmp jnz mov and mov jmp
ax, 00b8h ; L_ALT up @@kb10 ax, [_keyb_status] ax, NL_ALT [_keyb_status], ax keyb_putq_exit
cmp jnz mov or mov jmp
ax, 0e038h ; R_ALT down @@kb11 ax, [_keyb_status] ax, R_ALT [_keyb_status], ax keyb_putq_exit
cmp jnz mov and mov jmp
ax, 0e0b8h ; R_ALT up @@kb12 ax, [_keyb_status] ax, NR_ALT [_keyb_status], ax keyb_putq_exit
cmp jnz mov xor mov jmp
ax, 003ah ; CAPS_LOCK up @@kb13 ax, [_keyb_status] ax, CAPS_LOCK [_keyb_status], ax keyb_putq_exit
cmp jnz jmp
ax, 00bah @@kb14 keyb_putq_exit
cmp jnz mov xor mov jmp
ax, 0046h ; SCR_LOCK up @@kb15 ax, [_keyb_status] ax, SCR_LOCK [_keyb_status], ax keyb_putq_exit
cmp jnz jmp
ax, 00c6h @@kb16 keyb_putq_exit
cmp jnz mov xor mov jmp
ax, 0045h ; NUM_LOCK up @@kb17 ax, [_keyb_status] ax, NUM_LOCK [_keyb_status], ax keyb_putq_exit
cmp
ax, 00c5h
@@kb8:
@@kb9:
@@kb10:
@@kb11:
@@kb12:
@@kb13: ; CAPS_LOCK down
@@kb14:
@@kb15: ; SCR_LOCK down
@@kb16:
@@kb17: ; NUM_LOCK down
jnz jmp
@@kb18 keyb_putq_exit
cmp jnz mov xor mov jmp
ax, 0e052h ; INSERT up @@kb19 ax, [_keyb_status] ax, INSERT [_keyb_status], ax keyb_putq_exit
cmp jnz jmp
ax, 0e0d2h @@kb20 keyb_putq_exit
test jnz
ax, 0080h keyb_putq_exit
mov
[_key_code], ax
@@kb18:
@@kb19: ; INSERT down
@@kb20:
mov al, 0ffh mov [_key_flag], al keyb_putq_exit: pop ax ret ENDP Keyb_PutQ ; ; ; ;
Обработчик программного прерывания для ввода с клавиатуры. По своим функциям напоминает прерывание INT 16 реального режима.
PROC
_Int_30h_Entry push ax dx
NEAR
; Ожидаем прерывание от клавиатуры keyb_int_wait: sti nop nop cli ; Проверяем флаг, который устанавливается ; обработчиком аппаратного прерывания клавиатуры mov cmp jz
al, [_key_flag] al, 0 keyb_int_wait
; Сбрасываем флаг после прихода прерывания
ENDP END
mov al, 0 mov [_key_flag], al sti pop dx ax iret _Int_30h_Entry
Ф ай л screen .c сод ерж и т п р оц ед ур ы , н еобход и м ы е д л я вы вод а и н ф ор м а ц и и н а экр ан д и сп л ея. Р аб ота эти х п р оц ед ур осн ован а н а н еп осред ствен н ой зап и си д ан н ы х в ви д еоп ам ять.
Листинг 14. Процедуры для работы с видеоадаптером. Файл screen.c ----------------------------------------------------------#include #include #include #include #include
<stdio.h> <dos.h> <stdlib.h> "tos.h"
void vi_putch(unsigned int x, unsigned int y ,char c, char attr); char hex_tabl[] = "0123456789ABCDEF"; // Вывод байта на экран, координаты (x,y), // выводится шестнадцатеричное представление // байта chr с экранными атрибутами attr. void vi_put_byte(unsigned int x, unsigned int y, unsigned char chr, char attr) { unsigned char temp; temp = hex_tabl[(chr & 0xf0) >> 4]; vi_putch(x, y, temp, attr); temp = hex_tabl[chr & 0xf]; vi_putch(x+1, y, temp, attr); } // Вывод слова на экран, координаты (x,y), // выводится шестнадцатеричное представление // слова chr с экранными атрибутами attr. void vi_put_word(unsigned int x, unsigned int y, word chr, char attr) { vi_put_byte(x, y, (chr & 0xff00) >> 8, attr); vi_put_byte(x+2, y, chr & 0xff, attr); } // Вывод символа c на экран, координаты - (x,y), // атрибут выводимого символа - attr void vi_putch(unsigned int x, unsigned int y ,char c, char attr) { register unsigned int offset; char far *vid_ptr; offset=(y*160) + (x*2); vid_ptr=MK_FP(VID_MEM_SELECTOR, offset); *vid_ptr++=c; *vid_ptr=attr; } // Вывод строки s на экран, координаты - (x,y),
// атрибут выводимой строки - attr void vi_print(unsigned int x, unsigned int y, char *s, char attr) { while(*s) vi_putch(x++, y, *s++, attr); } // Вывод стоки сообщения о запуске программы void vi_hello_msg(void) { vi_print(0, 0, " Protected mode monitor *TINY/OS*, " "v.1.2 for CPU 80286 ¦ © Frolov A.V., 1992 ", 0x30); }
П осл ед н и й ф ай л - tossyst.asm - сод ер ж и т уж е зн аком ы е вам п р оц ед ур ы д л я вход а в защ и щ ѐн н ы й р еж и м и возвр ата об р атн о в р еал ьн ы й р еж и м . О б рати те вн и м ан и е н а п р оц ед уры _load _task_reg ister и _ju m p _to_task, вы п олн яю щ и е загр узку реги стр а задачи T R и п ерекл ю чен и е н а д р угую зад ачу соответствен н о.
Листинг 15. Процедуры для инициализации, перехода в защищѐнный режим и возврата в реальный режим, для загрузки регистра TR и переключения задач. Файл tossyst.asm ----------------------------------------------------------IDEAL MODEL SMALL RADIX 16 P286 DATASEG include "tos.inc" PUBLIC
_beep
; Область памяти для инициализации IDTR idtr
idtr_struc <,,,0>
; Область памяти для инициализации GDTR gdt_ptr gdt_ptr2 gdt_ptr4
dw
(8*15)-1 ; размер GDT, 15 элементов dw ? dw ?
; Область памяти для записи селектора задачи, ; на которую будет происходить переключение new_task new_select
dw dw
00h
00h
; Область памяти для хранения регистров, ; используется для возврата в реальный режим
real_ss real_sp real_es
dw dw dw
? ? ?
protect_sel
dw
?
init_tss
dw
?
CODESEG PUBLIC PUBLIC ; ; ; ; ; ;
_real_mode,_protected_mode,_jump_to_task _load_task_register, _load_idtr, _enable_interrupt
------------------------------------------------------------------Процедура для переключения в защищѐнный режим. Прототип для вызова: void protected_mode(unsigned long gdt_ptr, unsigned int gdt_size, unsigned int cseg, unsigned int dseg) -------------------------------------------------------------------
PROC _protected_mode NEAR push bp mov bp,sp ; Параметр gdt_ptr mov mov
ax,[bp+4] dx,[bp+6]
; мл. слово адреса GDT ; ст. слово адреса GDT
mov mov
[gdt_ptr4], dx [gdt_ptr2], ax
; запоминаем адрес GDT
ax,[bp+8] [gdt_ptr], ax
; получаем размер GDT ; и запоминаем его
mov
ax,[bp+10d]
; получаем селектор сегмента
mov
dx,[bp+12d]
; получаем селектор сегмента
mov
[cs:p_mode_select], ax
mov
[protect_sel], dx
; Параметр gdt_size mov mov ; Параметры cseg и dseg кода данных ; запоминаем для
команды ; перехода far jmp
; Подготовка к возврату в реальный режим push
ds
; готовим
mov
ax,40h
mov mov mov pop
ds,ax [WORD 67h],OFFSET shutdown_return [WORD 69h],cs ds
адрес возврата ; из защищѐнного
режима
; Запрещаем и маскируем все прерывания cli in and
al, INT_MASK_PORT al, 0ffh
out
INT_MASK_PORT, al
; Записываем код возврата в CMOS-память mov out jmp
al,8f CMOS_PORT,al delay1
mov out
al,5 CMOS_PORT+1,al
delay1:
call
enable_a20
mov
[real_ss],ss
mov
[real_es],es
; открываем линию A20 ; запоминаем регистры SS и
ES ; Перепрограммируем контроллер прерываний ; для работы в защищѐнном режиме mov mov call mov mov call
dx,MASTER8259A ah,20 set_int_ctrlr dx,SLAVE8259A ah,28 set_int_ctrlr
; Загружаем регистры IDTR и GDTR lidt lgdt
[FWORD idtr] [QWORD gdt_ptr]
mov lmsw ; p_mode_select
jmp db dw dw
LABEL
FAR
flush
mov mov mov mov
ax, 0001h ax
; переключаем процессор ; в защищѐнный режим
far flush 0eah OFFSET flush ?
dx, [protect_sel] ss, dx ds, dx es, dx
; Обнуляем содержимое регистра LDTR mov lldt pop ret ENDP _protected_mode ; ; ; ; ;
ax, 0 ax bp
---------------------------------------------------Возврат в реальный режим. Прототип для вызова void real_mode(); ----------------------------------------------------
PROC _real_mode
NEAR
; Сброс процессора cli mov mov out
[real_sp], sp al, SHUT_DOWN STATUS_PORT, al
hlt jmp
rmode_wait
rmode_wait:
LABEL
shutdown_return FAR
; Вернулись в реальный режим mov mov assume
ax, DGROUP ds, ax
ds:DGROUP mov mov
ss,[real_ss] sp,[real_sp]
in and out
al, INT_MASK_PORT al, 0 INT_MASK_PORT, al
call
disable_a20
mov mov mov mov
ax, ds, ss, es,
mov out sti
ax,000dh CMOS_PORT,al
DGROUP ax ax ax
ret ENDP _real_mode ; ; ; ; ;
------------------------------------------------------Загрузка регистра TR. Прототип для вызова: void load_task_register(unsigned int tss_selector); -------------------------------------------------------
PROC _load_task_register NEAR push bp mov bp,sp ltr [bp+4] ; селектор для текущей задачи pop bp ret ENDP _load_task_register ; ; ; ; ;
------------------------------------------------------Переключение на задачу. Прототип для вызова: void jump_to_task(unsigned int tss_selector); -------------------------------------------------------
PROC _jump_to_task
NEAR
push mov mov
bp bp,sp ax,[bp+4]
mov
[new_select],ax
jmp
[DWORD new_task] ; переключаемся на ; новую задачу bp
pop ret ENDP _jump_to_task
; получаем селектор ; новой задачи ; запоминаем его
; -----------------------------; Открываем линию A20 ; -----------------------------PROC
ENDP
enable_a20 NEAR push ax mov al, A20_PORT out STATUS_PORT, al mov al, A20_ON out KBD_PORT_A, al pop ax ret enable_a20
; -----------------------------; Закрываем линию A20 ; -----------------------------PROC
ENDP ; ; ; ; ;
disable_a20 NEAR push ax mov al, A20_PORT out STATUS_PORT, al mov al ,A20_OFF out KBD_PORT_A, al pop ax ret disable_a20
----------------------------------------------------------Готовим структуру для загрузки регистра IDTR Прототип для вызова функции: void load_idtr(unsigned long idt_ptr, word idt_size); -----------------------------------------------------------
PROC _load_idtr NEAR push mov mov mov mov
bp bp,sp ax,[bp+4] ; мл. слово адреса IDT dx,[bp+6] ; ст. слово адреса IDT bx, OFFSET idtr
; Запоминаем адрес IDTR в структуре mov mov
[(idtr_struc bx).idt_low], ax [(idtr_struc bx).idt_hi], dl
; Получаем предел IDT и запоминаем его в структуре mov mov
ax, [bp+8] [(idtr_struc bx).idt_len], ax
pop ret
bp
ENDP _load_idtr ; ---------------------------------; Установка контроллера прерываний ; ---------------------------------PROC
set_int_ctrlr
NEAR
ENDP
mov al, 11 out dx, al jmp SHORT $+2 mov al, ah inc dx out dx, al jmp SHORT $+2 mov al, 4 out dx, al jmp SHORT $+2 mov al, 1 out dx, al jmp SHORT $+2 mov al, 0ffh out dx, al dec dx ret set_int_ctrlr
; -------------------------; Выдача звукового сигнала ; -------------------------PROC
_beep
NEAR
push
ax bx cx
in push mov
al,KBD_PORT_B ax cx,80
push and out mov
cx al,11111100b KBD_PORT_B,al cx,60
loop or out mov
idle1 al,00000010b KBD_PORT_B,al cx,60
loop pop loop
idle2 cx beep0
pop
ax
beep0:
idle1:
idle2:
ENDP
out
KBD_PORT_B,al
pop ret
cx bx ax
_beep
; ------------------------------; Задержка выполнения программы ; ------------------------------PROC
_pause
NEAR
push mov
cx cx,10
push xor
cx cx,cx
loop pop loop
ploop1 cx ploop0
pop ret
cx
ploop0:
ploop1:
ENDP
_pause
; ----------------------; Размаскирование прерываний ; ----------------------PROC
_enable_interrupt NEAR in and out
ENDP
al, INT_MASK_PORT al, 0fch INT_MASK_PORT, al
sti ret _enable_interrupt end
5 . О С О Б Е Н Н О С Т И П Р О Ц Е С С О Р О В I8 0 3 8 6 И I80486 П оявл ен и е сл ед ую щ ей п осл е i80286 м од ел и п р оц ессор а ф и р м ы In tel - п р оц ессор а i80 386 - п р ед оп р ед ели л о кон ец эр ы и сп ол ьзован и я ср ед н и м и и н екотор ы м и б ол ьш и м и орган и зац и ям и кр уп н ы х ком п ью тер ов кл асса IB M -360/370 (ан ал огам и котор ы х явл яю тся ш и р око р асп р остр ан ѐн н ы е в н аш ей стр ан е Э В М сер и и Е С ). П о свои м возм ож н остям п ер сон ал ьн ы е ком п ью теры , вы п ол н ен н ы е н а б азе п р оц ессор а i80386 соп остави м ы , а в р яд е сл учаев п р евосход ят Э В М сер и и Е С . И это ещ ѐ без уч ѐта п отр еб и тел ьски х свой ств и затрат н а р ем он т и об служ и ван и е. П осл ед н яя н а м ом ен т н ап и сан и я д ан н ой кн и ги м од ел ь - п р оц ессор i80486 - об л ад ает ещ ѐ б ол ьш ей п р ои звод и тел ьн остью .
Н есм отр я н а зн ачи тел ьн ы е ар хи тектур н ы е отл и чи я п о сравн ен и ю с п р оц ессорам и i808 6 и i8 0286, п р оц ессор ы i8038 6 и i8 0486 об есп ечи ваю т п ол н ую совм ести м ость с п рогр ам м н ы м об есп ечен и ем , р азр аб отан н ы м д л я б ол ее р ан н и х м од ел ей п р оц ессор ов. П р оц ессор i80386 вы п ол н яет все п р огр ам м ы , составл ен н ы е д л я п р оц ессор а i8086, и п р и том д елает это зн ачи тельн о бы стр ее, чем сам i8086. К сож ал ен и ю , часто вл ад ел ьц ы такой м ощ н ой техн и ки , как п ер сон ал ьн ы е ком п ью тер ы н а б азе i80386 и i8048 6, н е и сп ол ьзую т возм ож н остей эти х ком п ью тер ов д аж е н ап ол ови н у. Р аб отая в ср ед е оп ер ац и он н ой си стем ы M S D O S с п р огр ам м ам и , п од готовл ен н ы м и сп ец и ал ьн о д л я этой оп ер ац и он н ой си стем ы , вы б уд ете и сп ол ьзовать тол ько р еж и м совм ести м ости п р оц ессор ов i80386 и i80486, остал ьн ы е п р еи м ущ ества н овы х п р оц ессор ов (п ом и м о б ол ее вы сокой скор ости вы п ол н ен и я п р ограм м ) буд ут вам н ед оступ н ы . А н ал оги чн ое м ож н о сказать и об оп ер ац и он н ой си стем е O S /2 вер си й от 1.0 д о 1.3. Э та оп ер ац и он н ая си стем а р ассчи тан а н а п р оц ессор i80286. Р азум еется, вы м ож ете и сп ол ьзовать O S /2 эти х вер си й в ком п ью терах н а б азе i8038 6 и л и i80486, од н ако л учш е п р и об р ести O S/2 ве р си и 2.0 и л и б ол ее стар ш ей вер си и , ор и ен ти р ован н ой н а и сп ол ьзован и е ар хи тектурн ы х особ ен н остей н овы х п р оц ессор ов. К аки е ж е п р еи м ущ ества и м ею т п р оц ессор ы i80386 и i8 04 86 п ер ед п р ед ы д ущ и м и м од ел ям и ? П р и вед ѐм тол ько сам ы е важ н ы е, н а н аш взгл яд, особ ен н ости н овы х п р оц ессор ов:
В ы сокое б ы стр од ей стви е, оп ред ел яем ое, в частн ости , вы сокой тактовой частотой (25 М гц , 33 М гц и д аж е б ол ьш е).
Р азр яд н ость п р оц ессор ов i803 86 и i80486 составл яет 32 би та (п р ед ы д ущ и е м од ел и от i8086 д о i80286
б ы л и 16 -р азр яд н ы м и ). У вел и чен и е р азр яд н ости п р оц ессор а п р и вод и т к увели чен и ю скор ости вы п олн ен и я п р ограм м , так как п р оц ессор сп особен за оди н м аш и н н ы й такт об р аб отать бол ьш и й об ъ ѐм и н ф ор м ац и и . Р асш и р ен н ы й н аб ор м аш и н н ы х ком ан д и б ол ьш ое кол и чество п од д ерж и ваем ы х п р оц ессор ом ти п ов д ан н ы х п озвол яю т созд авать б ол ее эф ф екти вн ы е, б ол ее ком п актн ы е п р огр ам м ы , котор ы е р аб отаю т зн ачи тел ьн о бы стр ее ори ен ти р ован н ы х н а 16 -р азряд н ы е п роц ессор ы . Н овы й м ехан и зм п р еоб р азован и я ад р есов, явл яю щ и й ся д альн ей ш и м р азви ти ем м ехан и зм а, и сп ол ьзован н ого в п р оц ессоре i80286. Т еп ер ь п р оц ессор м ож ет р ассм атр и вать п ам ять как од и н и л и н ескол ько сегм ен тов, п р и чѐм р азм ер сегм ен та м ож ет д ости гать 4 ги габ ай т (4*2*30 б ай т). С д р угой стор он ы , стран и чн ая ад ресац и я п озвол яет ор ган и зовать защ и ту п ам яти д л я каж д ой стр ан и ц ы . Р азм ер стр ан и ц ы составл яет 4 ки л об ай та. И сп ол ьзован и е стр ан и ц зн ачи тел ьн о об легчает р еал и зац и ю ви р туал ьн ой п ам яти . П ом и м о р еал ьн ого и защ и щ ѐн н ого реж и м а р аб оты , в п р оц ессор ах i80386 и i80486 п р ед усм отр ен р еж и м ви р туал ьн ого п р оц ессор а 8086 (ви р туал ьн ы й р еж и м ), в котор ы й п р оц ессор м ож ет вой ти и з защ и щ ѐн н ого р еж и м а. В и р туал ьн ы й р еж и м п озвол яет эм ули р овать п р оц ессор i8086, н аход ясь в защ и щ ѐн н ом р еж и м е. Э то, в частн ости , д аѐт возм ож н ость в м ул ьти зад ачн ой оп ер ац и он н ой си стем е ор ган и зовать одн овр ем ен н ое вы п олн ен и е н ескол ьки х п р ограм м , ори ен ти р ован н ы х н а п р оц ессор i8086. О б ъ ѐм кн и ги огран и чен , п оэтом у м ы н е см ож ем п од р обн о р ассм отр еть все особ ен н ости п р оц ессор ов i80836 и i8048 6. Д л я п ол н ого оп и сан и я п отр еб овал ось бы м н ого сотен стран и ц . Н о это и н е является н аш ей ц ел ью . В се п од р обн ости п ри н еобход и м ости вы см ож ете узн ать и з ли тературы , сп и сок котор ой п р и вед ѐн в кон ц е кн и ги . О д н ако д л я п р акти ческого и сп ол ьзован и я м н оги х п р еи м ущ еств н овы х п р оц ессор ов вам н е п отр ебую тся п од р обн ы е зн ан и я всех особ ен н остей . Э то связан о с тем , что р еал ьн о вы б уд ете р аб отать в ср ед е м ул ьти задачн ой оп ер ац и он н ой си стем ы и ли и сп ол ьзовать и н ое п р огр ам м н ое об есп ечен и е, котор ое окаж ет вам зн ачи тельн ую п ом ощ ь в составл ен и и п р огр ам м д л я защ и щ ѐн н ого р еж и м а. Е сл и ж е ваш а об ласть и н тер есов связан а с р азр аб откой оп ерац и он н ы х си стем защ и щ ѐн н ого р еж и м а д л я п р оц ессор ов i80386 и л и i8048 6, вам н е об ой ти сь б ез тол сты х р уковод ств п о п р оц ессор ам , п оставл яем ы х ф и р м ой In tel. И так, м ы скон ц ен тр и р уем вн и м ан и е н а п ракти ческом и сп ол ьзован и и сам ы х важ н ы х особ ен н осте й п р оц ессора i8083 6. И п ервое, с чего м ы н ачн ѐм - это м ехан и зм п р еоб р азован и я адр есов в п р оц ессор е i80836.
5 .1 . П р ео б р азо ван и е ад р есо в П р оц ессор i80386 в защ и щ ѐн н ом р еж и м е и сп ол ьзует тр ѐхступ ен чатую схем у п р еобр азован и я ад р еса. П р огр ам м ы и сп ол ьзую т л оги ч ески й ад р ес, состоящ и й и з сел ектор а и см ещ ен и я (ан ал оги чн о п р оц ессор у i80286). С ел ектор п олн остью ан ал оги чен и сп ол ьзуем ом у в п р оц ессор е i80286. К ом п он ен та см ещ ен и я явл яется 32 р азр яд н ой , т.к. д оп усти м ы й разм ер сегм ен та зн ачи тельн о п р евы ш ает 64 ки л об ай та.
У р овен ь л оги ческого ад р еса - это п ер вая ступ ен ь в схем е п реоб р азован и я ад р есов. В тор ая ступ ен ь - п ол учен и е и з л оги ческого ад реса 32 -р азряд н ого ли н ей н ого ад р еса. Л и н ей н ы й ад р ес б ер ѐтся и з гл об ал ьн ой и л и л окал ьн ой таб л и ц ы д ескр и п тор ов (G D T и л и LD T ) в зави си м ости от соответствую щ его б и та сел ектор а (би т 2). М ехан и зм п ол учен и я ли н ей н ого ад реса н ап ом и н ает м ехан и зм п ол учен и я 24 -р азр яд н ого ф и зи ческого ад р еса в п р оц ессор е i8028 6. О д н ако л и н ей н ы й ад р ес н е отоб р аж ается н еп оср ед ствен н о н а ад р есн ую ш и н у п ам яти , то есть он н е явл яется ф и зи чески м ад р есом . Д л я п ол учен и я и з л и н ей н ого ад р еса ф и зи ческого ад р еса и сп ол ьзуется третья ступ ен ь - м ехан и зм стр ан и чн ой ад р есац и и . С п ом ощ ью этого м ехан и зм а 20 стар ш и х б и т л и н ей н ого ад реса и сп ол ьзую тся д л я вы б ора б л ока п ам яти разм ер ом 4 ки л об ай та. Т акой б л ок н азы вается стр ан и ц ей ф и зи ческой п ам яти . О ставш и еся 12 би т л и н ей н ого ад р еса п р ед ставл яю т соб ой см ещ ен и е вн утри стр ан и ц ы . П р оц есс п р еоб разован и я л оги ческого ад р еса в л и н ей н ы й и лл ю стр и р уется р и с. 17.
Р и с. 17. П реоб р азован и е л оги ческого ад р еса в л и н ей н ы й . Зн ачен и е и з п ол я и н д екса сел ектор а и сп ол ьзуется в качестве и н д екса в таб л и ц е LD T и л и G D T д л я вы б ор ки 32 р азр яд н ого б азового адр еса. Э тот б азовы й ад рес скл ад ы вается со втор ой ком п он ен той л оги ческого ад реса см ещ ен и ем . В р езул ьтате п олучается 32 -р азр яд н ы й ли н ей н ы й адр ес. П р еобр азован и е ли н ей н ого адр еса в ф и зи чески й и лл ю стри руется ри с. 18.
Р и с. 18. П реоб р азован и е л и н ей н ого ад р еса в ф и зи чески й . П р оц есс вы чи сл ен и я ад р еса стр ан и ц ы часто н азы ваю т тран сл яц и ей стр ан и ц . С тар ш и е 10 б и т л и н ей н ого ад р еса и сп ол ьзую тся как и н д екс в таб ли ц е, н азы ваем ой катал огом таб ли ц стр ан и ц . Р асп олож ен и е катал ога таб ли ц стр ан и ц в ф и зи ческой п ам яти оп р ед еляется сод ер ж и м ы м си стем н ого р еги стр а п р оц ессор а C R 3. К атал ог таб л и ц стр ан и ц содер ж и т д ескри п тор ы таб л и ц стр ан и ц , оп р ед ел яю щ и е ф и зи чески й ад р ес таб ли ц стр ан и ц . В катал оге таб ли ц стр ан и ц всего м ож ет б ы ть 1024 д ескр и п тор а. С ам и х ж е катал огов м ож ет б ы ть скол ько угод н о, н о в каж д ы й м ом ен т вр ем ен и и сп ол ьзуется тол ько од и н - тот, н а котор ы й указы вает р еги стр C R 3. С л ед ую щ и е 10 би т ли н ей н ого ад р еса п р ед н азн ачен ы д л я и н д ексац и и табл и ц ы стр ан и ц , вы б ран н ой с п ом ощ ью стар ш и х 10 б и т ад р еса. Т аб ли ц а стр ан и ц сод ер ж и т 1024 д ескр и п тор а, оп р ед ел яю щ и х ф и зи чески е адр еса стран и ц п ам яти . Р азм ер одн ой стр ан и ц ы составл яет 4 ки л об ай та, т.е. 4096 б ай т. М л ад ш и е 12 б и т ли н ей н ого адр еса указы ваю т см ещ ен и е к ад р есуем ом у б ай ту вн утри стр ан и ц ы . Н а ри с. 19 п р ед ставл ен ф ор м ат д ескр и п тор а таб ли ц ы стр ан и ц .
Р и с. 19. Д ескр и п тор таб ли ц ы стр ан и ц . Д л я п р ед ставл ен и я стар ш и х 20 б и тов ф и зи ческого ад р еса таб л и ц ы ср ан и ц в д ескр и п тор е и сп ол ьзую тся би ты 12 31. М л ад ш и е 12 б и тов адр еса таб ли ц ы всегд а р авн ы н ул ю , таки м об р азом , таб л и ц а стр ан и ц д ол ж н а бы ть вы р овн ен а в п ам яти н а гр ан и ц у 4096 б ай т (н а гр ан и ц у стр ан и ц ы ). Ф ор м ат д ескр и п тор а стр ан и ц ы п ред ставл ен н а ри с. 20.
Р и с. 20. Д ескр и п тор стр ан и ц ы .
Б и ты 12 -31 в д ескр и п тор е стр ан и ц указы ваю т стар ш и е 20 б и т ф и зи ческого ад реса стран и ц ы . М л ад ш и е 12 б и т ад р еса стр ан и ц ы всегд а р авн ы н ул ю . Н азн ачен и е би т 0 -11 од и н аково и д л я д ескр и п тор а таб ли ц ы стр ан и ц , и д л я д ескр и п тора стр ан и ц ы . В таб ли ц е 4 п р и вед ен о оп и сан и е эти х б и т. Т аб л и ц а 5. Б и ты 0 -12 д ескр и п тор ов таб л и ц стр ан и ц и стран и ц . Н ом ер б и та
Н азн ачен и е
0 (P)
Б и т п р и сутстви я в п ам яти . У стан овл ен в 1, есл и оп ред ел яем ая д ан н ы м д ескри п тор ом таб ли ц а стр ан и ц н аход и тся в оп ер ати вн ой п ам яти . Э тот би т и сп ол ьзуется д л я ор ган и зац и и ви ртуал ьн ой п ам яти .
1 (W)
Р азр еш ен и е зап и си . Е сл и би т устан овл ен в 1, то зап и сь в стр ан и ц ы разр еш ен а. Б и т и сп ол ьзуется д л я ор ган и зац и и защ и ты от зап и си н а ур овн е стр ан и ц .
2 (U)
П ол ьзовател ь/суп ерви зор. И сп ол ьзуется д л я р азгран и чен и я д оступ а к стран и ц ам оп ер ац и он н ой си стем ы (стр ан и ц ы суп ер ви зор а) и стр ан и ц ам п р огр ам м п ол ьзовател я. Зн ачен и е б и та, р авн ое 0, соответствует стран и ц ам суп ер ви зор а, 1 - стран и ц ам п р огр ам м ы п ол ьзовател я.
3-4
Э ти б и ты зар езер ви р ован ы и д ол ж н ы б ы ть устан овл ен ы в 0 д л я совм ести м ости со сл ед ую щ и м и м од ел ям и п р оц ессор а.
5 (A)
Б и т д оступ а. О н устан авл и вается п р оц ессор ом п ер ед вы п олн ен и ем оп ерац и й чтен и я стр ан и ц ы и л и зап и си в стран и ц у.
6 (D)
Б и т м усора. У стан авл и вается , есл и б ы л а вы п ол н ен а зап и сь в катал ог и ли стр ан и ц у.
7-8
Э ти б и ты зар езер ви р ован ы и д ол ж н ы б ы ть устан овл ен ы в 0 д л я совм ести м ости со сл ед ую щ и м и м од ел ям и п р оц ессор а.
9-12 (AVL)
Э ти б и ты д оступ н ы д л я и сп ользован и я оп ер ац и он н ой си стем ой (A V L - Available for use).
М ы ви д и м , что д л я п р оц ессор а i80386 д об ави л ось ещ ѐ д ва ти п а таб л и ц , сод ерж ащ и х д ескри п тор ы соответствен н о, д ва ти п а д ескр и п тор ов - д ескри п тор таб л и ц стр ан и ц и д ескри п тор стр ан и ц .
и,
Д л я и сп ол ьзован и я м ехан и зм а тр ан сл яц и и стр ан и ц оп ер ац и он н ая си стем а д ол ж н а устан ови ть в 1 стар ш и й б и т си стем н ого реги стр а C R 0. Есл и этот би т н е устан овл ен в 1, ф и зи чески й ад р ес буд ет р авен л и н ей н ом у, сод ер ж и м ое р еги стр а ад р еса катал ога таб ли ц стран и ц C R 3 п ри этом д л я п р еобр азован и я ад р еса и сп ол ьзоваться н е б уд ет. Ф ор м аты д ескри п тор ов, р асп ол агаю щ и хся в таб л и ц ах G D T , LD T и ID T п ретерп ели и зм ен ен и я п о ср авн ен и ю с и сп ол ьзуем ы м и в п р оц ессор е i8028 6. Н ап ри м ер, вм есто 24 -б и тового ф и зи ческого ад реса в д ескри п тор ах д ол ж ен н аход и ться 32 -би товы й л и н ей н ы й ад р ес. Н ап ом н и м , что в дескр и п торах п р оц ессор а i80286 б ы л о зар езер ви р ован о д ва б ай та. Э ти б ай ты и сп ол ьзую тся п р оц ессор ом i80386 (р и с. 21).
Р и с. 21. Д ескр и п тор ы д л я п р оц ессор а i80386. П р оц ессор i80386 и сп ол ьзует 32 -р азр яд н ы й б азовы й ад р ес сегм ен та и 20 -р азр яд н ое п ол е п р ед ел а. В зар езерви р ован н ом д л я п р оц ессор а i80286 п ол е в би тах 24 -31 н аход и тся стар ш и й б ай т 32 -р азр яд н ого б азового ад р еса сегм ен та. Б и ты 16 -19 и сп ол ьзую тся д л я хран ен и я стар ш и х четы р ѐх б и тов п р ед ел а. В п р оц ессор е i80286 п ол е п ред ел а указы вал о р азм ер сегм ен та в б ай тах. Д л я п р оц ессора i80486 и н тер п р етац и я п ол я п р ед ел а зави си т от устан овки б и та G - б и та гран уляр н ости . Е сл и б и т G устан овл ен в 1, п ол е п р ед ел а сод ер ж и т р азм ер сегм ен та в стр ан и ц ах (разм ер ом 4096 б ай т). Е сл и б и т G сбр ош ен , р азм ер сегм ен та вы чи сл яется в бай тах. Б и т гр ан ул яр н ости G зар езерви р ован н ое.
такж е
н аход и тся
в
п ол е, котор ое
в
п р оц ессор е
i8028 6
бы ло
отм ечен о
как
П ол е, об озн ачен н ое н а ри с. 21 как X , указы вает р азр яд н ость вы п ол н яем ы х ком ан д , п р и н яты х п о ум ол чан и ю . Е сл и этот б и т устан овл ен в 1, и сп о л ьзую тся 32 -р азряд н ы е ком ан д ы , есл и сб р ош ен в 0 - 16-р азр яд н ы е. Б и т A V L п р ед н азн ачен д л я и сп ол ьзован и я си стем н ы м п р ограм м н ы м об есп ечен и ем . Б и т S - п р и зн ак си стем н ого сегм ен та. Е сл и этот б и т сб р ош ен в 0, то сегм ен т си стем н ы й . Н азн ачен и е остал ьн ы х п ол ей д ескр и п тор а ан ал оги чн о и сп ол ьзуем ом у в п р оц ессор е i80286. В п ер вой гл аве м ы п р и вел и таб ли ц у ти п ов сегм ен тов, в н ей оп и сан ы и сегм ен ты д л я п р оц ессор а i80386.
5 .2 . О б р аб о тка п р ер ы ван и й П р оц ессор i80386 в защ и щ ѐн н ом р еж и м е об раб аты вает п рер ы ван и я точн о такж е, как и п р оц ессор i80286. Е сть отл и чи я в ф ор м ате д ескр и п тор ов, р асп ол агаю щ и хся в д ескр и п тор н ой таб ли ц е п р ер ы ван и й ID T . Э ти отли чи я закл ю чаю тся в и сп ол ьзован и и д р уги х зн ачен и й в п ол е ти п а (см . таб л и ц у 1 в гл аве 1) и в том , что д ва б ай та, зар езерви р ован н ы е в вен ти лях п р еры ван и я и и скл ю чен и я п р оц ессор а i80286 и сп ол ьзую тся п р оц ессор ом i80386 д л я хр ан ен и я би тов 16 -31 32-р азр яд н ого см ещ ен и я.
5 .3 . М ул ьти зад ач н о сть В п р оц ессор е i80386 п ол учи л а д ал ьн ей ш ее р азви ти е ап п ар атн ая п од д ерж ка м ул ьти зад ачн ости , вп ервы е введ ѐн н ая в п р оц ессор е i8028 6. Н а ри с. 22 п р ед ставл ен ф орм ат сегм ен та T S S д л я п р оц ессор а i80386.
Р и с. 22. С егм ен т T S S п р оц ессор а i80386. И з р и сун ка ви дн о, что в T S S п р ед усм отрен ы п ол я д л я хран ен и я сегм ен тн ы х р еги стр ов G S , FS , D S , S S , C S , E S (п р оц ессо р i80386 и м еет д ва н овы х сегм ен тн ы х р еги стр а - G S и FS ). И м еется п ол е д ля хр ан ен и я сод ерж и м ого р еги стр а LD T R , указы ваю щ его н а л окал ьн ую таб ли ц у д ескр и п тор ов, расп р ед елѐн н ую д ан н ой зад аче. Д л я хр ан ен и я сод ерж и м ого 32 -р азр яд н ы х р еги стр ов и сп ользую тся п ол я T S S , об озн ачен н ы е н а ри сун ке как E D I, ESI, EBP, ESP, EBX, EDX, ECX, EAX, EFLAGS, EIP. П ол е C R 3 хр ан и т сод ерж и м ое си стем н ого р еги стр а C R 3. Э тот р еги стр явл яется указател ем н а катал ог таб ли ц стр ан и ц . Т аки м об р азом , каж д ая зад ача м ож ет и м еть свой соб ствен н ы й катал ог таб ли ц стр ан и ц , что п озвол яет вы п олн и ть и зол яц и ю зад ач н е тол ько н а ур овн е сегм ен тов, н о и н а ур овн е стр ан и ц . T S S п р оц ессор а i80386 сод ер ж и т указател и н а стеки д л я втор ого, п ер вого и н ул евого п р и ор и тетн ы х кол ец . Э то п ол я S S 2:E S P 2, S S 1:E S P 1, S S 0:E S P0. П ол е LIN K и сп ол ьзуется д л я ссы л ки н а T S S вы звавш ей зад ачи п ри вл ож ен н ом вы зове задач, ан ал оги чн о том у как это б ы л о в п р оц ессор е i80286. Б и т T и сп ол ьзуется д л я отл ад ки . Е сл и он устан овл ен в 1, п р и п ер екл ю чен и и н а зад ачу возн и кает отл ад очн ое и скл ю чен и е, котор ое м ож ет бы ть и сп ол ьзован о си стем н ы м отл ад чи ком . Е сть ещ ѐ од н о очен ь и н тер есн ое н овш ество, введ ѐн н ое в п р оц ессор i80386 - б и товая кар та ввод а/вы вод а. Ч то это такое? М ы уж е говор и ли о том , что д л я об есп ечен и я б езоп асн ой р аб оты си стем ы н еоб ходи м о огр ан и чи ть д оступ п р огр ам м ам п ол ьзовател я ко всем и л и п о кр ай н ей м ере к н екоторы м п ор там ввод а/вы вод а. Зл он ам ерен н ая п р огр ам м а, и м ею щ ая д оступ к п ор там кон тр ол л ер а п р ям ого д оступ а к п ам яти , м ож ет вы п ол н и ть с п ом ощ ью этого кон тр ол лер а чтен и е и л и зап и сь и н ф ор м ац и и п о л ю бы м ф и зи чески м ад р есам . П р оц ессор i80286 хр ан и т в р еги стр е ф л агов ур овен ь п р и ви л еги й IO P L, н а котор ом р азр еш ен о вы п олн ять ком ан д ы ввод а/вы вод а. С п ом ощ ью этого м ехан и зм а м ож н о зап р ети ть н еп р и ви л еги р ован н ы м п р огр ам м ам вы п ол н ять ком ан д ы ввода/вы вод а.
О д н ако такой сп особ защ и ты н е сл и ш ком уд об ен . Н екотор ы е п орты ввод а/вы вод а н е тол ько б езоп асн ы д л я и сп ол ьзован и я, н о и весьм а п ол езн ы д л я об ы чн ы х п р огр ам м (н ап р и м ер , п ор т си стем н ого д и н ам и ка и л и п р и н тер а). Б и товая кар та ввод а/вы вода п р оц ессор а i80386 п озвол яет д л я каж д ой зад ачи оп р ед ели ть п ор ты , которы е эта зад ача м ож ет и сп ол ьзовать. Т о есть оп ер ац и он н ая си стем а и м еет возм ож н ость сан кц и он и р овать л ю б ую зад ачу д л я и сп ол ьзован и я л ю б ого н аб ора ад р есов п ортов ввод а/вы вода. Е сл и зад ача п оп ы тается об р ати ться к н есан кц и он и р ован н ом у п орту ввод а/вы вод а, п р ои зой д ѐт и скл ю чен и е. С егм ен т T S S сод ер ж и т п ол е, об озн ачен н ое н а ри с. 22 как б аза карты ввод а/вы вод а. О н о сл уж и т д л я указан и я р асп ол ож ен и я б и товой карты ввод а/вы вод а зад ачи , и сп ол ьзую щ ей д ан н ы й T S S . П ол е б азы кар ты ввод а/вы вод а указы вает 16 -р азр ядн ое см ещ ен и е н ачала б и товой кар ты отн оси тел ьн о T S S . П р ед ел T SS д ол ж ен оп р ед ел яться с учѐтом карты ввод а/вы вод а.
ввод а/вы вод а
К аж д ы й б и т в кар те ввод а/вы вод а соответствует ад р есу б ай та п орта ввод а/вы вод а. П осл е би товой кар ты д ол ж ен р асп ол агаться б ай т 0FFh . П р и вы п ол н ен и и 16 - и л и 32 -р азр яд н ы х оп ер ац и й ввод а/вы вод а п р оц ессор п р овер яет все б и ты (2 и л и 4 би та), соответствую щ и е ад р есу п орта. Е сл и п р овер яем ы й б и т устан овл ен в 1, п р ои сход и т и скл ю чен и е. Д л я тех п р огр ам м , котор ы е явл яю тся п р и ви л еги р ован н ы м и , есл и ур овен ь п р и ви л еги й м ен ьш е и ли р авен ур овн ю IO P L, п р оц ессор н е вы п олн яет п р овер ку би товой карты ввода/вы вод а. Д л я того чтоб ы п ол н остью зап р ети ть зад аче об р ащ аться к п ортам ввод а/вы вод а, д остаточн о устан ови ть базу кар ты ввод а/вы вод а б ол ьш ей или равной пределу TSS. В этом случае лю бая ком анда ввода/вы вода
приведёт к генерации исклю чения.
5 .4 . Р еж и м ви р туал ьн о го п р о ц ессо р а i8 0 8 6 П р оц ессор i80386 сод ер ж и т ср ед ства д л я р аб оты в так н азы ваем ом реж и м е ви ртуальн ого п р оц ессор а i8086, н азы ваем ого такж е д л я краткости р еж и м ом V 86 и л и п р осто ви р туал ьн ы м р еж и м ом . Зам ети м , что д о р азр аб отки ф и р м ой In tel п р оц ессор а i80836 тер м и н "ви р туал ьн ы й р еж и м " и н огд а и сп ол ьзовал ся в ли тератур е д л я об озн ачен и я защ и щ ѐн н ого р еж и м а р аб оты п р оц ессор а i80286. В р еж и м V 86 п р оц ессор м ож ет п ер ей ти и з защ и щ ѐн н ого р еж и м а, есл и устан ови ть в р еги стр е ф лагов E FLA G S би т ви р туал ьн ого реж и м а (V M -б и т). Н ом ер би та V M в р еги стре EFLA G S - 17. К огд а п р оц ессор i80386 н аход и тся в ви ртуал ьн ом р еж и м е, его п овед ен и е во м н огом н ап ом и н ает п овед ен и е хор ош о зн аком ого н ам п роц ессор а i8086. В частн ости , д л я ад ресац и и п ам яти и сп ол ьзуется схем а < сегм ен т:см ещ ен и е> , р азм ер сегм ен та составл яет 64 ки л об ай та, а разм ер ад ресуем ой в этом р еж и м е п ам яти - 1 м егаб ай т. В и р туал ьн ы й р еж и м п р едн азн ачен д л я р аб оты п р ограм м , ор и ен ти р ован н ы х н а п р оц ессор i8086 (и л и i8088). Н о ви р туал ьн ы й р еж и м - это н е р еал ьн ы й р еж и м п р оц ессора i808 6, и м ею тся сущ ествен н ы е отл и чи я. П р оц ессор ф акти чески п р од ол ж ает и сп ол ьзовать схем у п реоб разов ан и я ад р есов п ам яти и ср ед ства м ул ьти зад ачн ости защ и щ ѐн н ого р еж и м а. В ви р туал ьн ом р еж и м е и сп ол ьзуется тр ан сл яц и я стр ан и ц п ам яти . Э то п озвол яет в м ул ьти зад ачн ой оп ер ац и он н ой си стем е созд авать н ескол ько зад ач, р аб отаю щ и х в ви р туал ьн ом р еж и м е. К аж д ая и з эти х зад ач м ож ет и м еть соб ствен н ое ад р есн ое п р остран ство, каж д ое р азм ер ом в 1 м егаб ай т. В се зад ачи ви ртуал ьн ого р еж и м а об ы чн о вы п ол н яю тся в тр етьем , н аи м ен ее п ри ви леги рован н ом кол ьц е защ и ты . К огд а в такой зад аче возн и кает п р ер ы ван и е, п р оц ессор автом ати чески п ер екл ю чается и з ви р туал ьн ого р еж и м а в защ и щ ѐн н ы й . П оэтом у все п р ер ы ван и я отоб р аж аю тся в оп ер ац и он н ую си стем у, р аб отаю щ ую в защ и щ ѐн н ом р еж и м е. О б р аб отчи ки п р ер ы ван и й защ и щ ѐн н ого р еж и м а м огут м од ел и р овать ф ун кц и и соответствую щ и х п р е р ы ван и й р еал ьн ого р еж и м а, что н еобход и м о д л я п рави л ьн ой р аб оты п р огр ам м , ори ен ти р ован н ы х н а реал ьн ы й р еж и м оп ер ац и он н ой си стем ы M S -DOS.
5 .5 . В и р туал ьн ы е м аш и н ы О б ы чн о м ул ьти зад ачн ы е оп ер ац и он н ы е си стем ы п р ед оставл яю т д л я вы п ол н ен и я i8086 -п р огр ам м "ви р туал ьн ы е м аш и н ы i8086". Э ти ви р туал ьн ы е м аш и н ы р еал и зую тся п ри п ом ощ и зад ач ви р туал ьн ого реж и м а. О п ер ац и он н ая си стем а м ож ет ви ртуали зовать р есур сы ком п ью тер а - п ам ять, п ор ты ввод а/вы вод а, си стем у об р аб отки п р ер ы ван и й . П р и этом п р огр ам м а, ор и ен ти р ован н ая н а реал ьн ы й р еж и м M S -D O S п ол учает в своѐ р асп ор яж ен и е р есур сы , которы е он а восп р и н и м ает как ф и зи чески е. В и р туали зац и я п ам яти заклю чается в п р еоб р азован и и ад реса ф ор м ата реал ьн ого р еж и м а < сегм ен т:см ещ ен и е> в л и н ей н ы й , а затем и ф и зи чески й с и сп ол ьзован и ем схем ы п р еобр азован и я ад р есов защ и щ ѐн н ого р еж и м а. В этом сл учае п р огр ам м е п р ед оставл яется 1 м егабай т п ам яти , котор ы й м ож ет б ы ть расп ол ож ен в лю б ом м есте ф и зи ческой п ам яти ком п ью тер а и м ож ет п од вер гаться своп и н гу н а д и ск д л я р еал и зац и и ви р туал ьн ой оп ер ати вн ой п ам яти . С точки зр ен и я п р огр ам м ы , р аб отаю щ ей н а ви р туал ьн ой м аш и н е, ад р еса отобр аж аю тся н а этот 1 м егеб ай т п ам яти так, как буд то б ы это б ы ла ф и зи ческая п ам ять ком п ью тер а. В и р туали зац и я ввод а/вы вод а осн ован а н а том , что таки е ком ан д ы , как IN , O U T , IN S , O U TS, CLI, STI чувстви тел ьн ы к текущ ем у уровн ю IO P L. Т ак как об ы чн о ви р туал ьн ая м аш и н а р аб отает в н еп р и ви л еги р ован н ом тр етьем кол ьц е защ и ты , вы д ача эти х ком ан д п р ограм м ой в ви ртуал ьн ом р еж и м е п р и вод и т к и скл ю чен и ю . О п ер ац и он н ая си стем а м ож ет эм ули р овать д ей стви е эти х ком ан д б езоп асн ы м д л я себя об р азом , что од н ако м ож ет п ри вести к сущ ествен н ом у зам ед л ен и ю раб оты ви ртуал ьн ой м аш и н ы . В и р туали зац и я п р ер ы ван и й осн ован а н а вы ход е п р оц ессор а и з ви р туал ьн ого р еж и м а и возвр ате в защ и щ ѐн н ы й п р и возн и кн овен и и п р ер ы ван и й . П р и возн и кн овен и и п р ер ы ван и я уп равл ен и е п ол учает об р аб отчи к защ и щ ѐн н ого р еж и м а, устан овл ен н ы й оп ер ац и он н ой си стем ой . О п ер ац и он н ая си стем а м ож ет эм ул и р овать ф ун кц и и соответствую щ его об р аб отчи ка р еал ьн ого р еж и м а, н ап р и м ер , ф ун кц и и об раб отчи ка п р еры ван и я INT 21h MS-DOS и л и B IO S .
5 .6 . П ер екл ю ч ен и е в защ и щ ѐн н ы й и р еал ьн ы й р еж и м ы П р оц ессор ы i80386 и i8 0486 м огут л егко п ер еклю чаться и з р еал ьн ого р еж и м а в защ и щ ѐн н ы й и обр атн о с п ом ощ ью ком ан д ы M O V . М л ад ш и й б и т P E си стем н ого р еги стр а C R 0 (см . п ри л ож ен и е) оп ред ел яет текущ и й р еж и м р аб оты п р оц ессор а. Е сл и этот б и т устан овл ен в 1, п р оц ессор р аб отает в защ и щ ѐн н ом р еж и м е, а есл и в 0 - в р еал ьн ом . Д л я п ер екл ю чен и я п р оц ессор а и з р еал ьн ого р еж и м а в защ и щ ѐн н ы й м ож н о и сп ол ьзовать, н ап р и м ер , таку ю п осл ед овател ьн ость ком ан д :
mov or mov
ax, ax, cr0,
cr0 1 ax
Д л я совм ести м ости с п р оц ессор ом i802 86 оставл ен а возм ож н ость п ер екл ю чен и я в защ и щ ѐн н ы й р еж и м с п ом ощ ью ком ан ды LM S W . Д л я возврата в р еал ьн ы й реж и м н еобход и м о сб р оси ть б и т PE :
mov and mov
ax, ax, cr0,
cr0 0fffe ax
Т аки м об р азом , сущ ествует бол ее кр аси вы й сп особ возврата в р еал ьн ы й р еж и м , чем вы п ол н ен и е ап п ар атн ого сб р оса и л и п ер евод п р оц ессор а в состоян и е отклю чен и я (кон ечн о, вы п о -п р еж н ем у м ож ете п ол ьзоваться стар ы м сп особ ом п ер евода п р оц ессора в р еал ьн ы й реж и м ). П ер ед п ер екл ю чен и ем в р еальн ы й р еж и м и з защ и щ ѐн н ого п р огр ам м а д олж н а вы п олн и ть сл ед ую щ и е д ей стви я:
об есп ечи ть р авен ство ли н ей н ы х адр есов ф и зи чески м ;
откл ю чи ть тр ан сл яц и ю стран и ц , сб р оси в б и т P G в р еги стр е C R 0; загр узи ть н ол ь в р еги стр C R 3 д л я сб р оса кэш -п ам яти стр ан и ц ; п ер ед ать уп р авл ен и е сегм ен ту код а с п р ед ел ом 64 ки л об ай та; загр узи ть в сегм ен тн ы е р еги стр ы S S, D S , E S , FS , G S сел ектор ы д ескри п тор ов , п од готовл ен н ы х д л я ад р есац и и п ам яти в реал ьн ом р еж и м е и сод ер ж ащ и х соответствую щ и е р еал ьн ом у р еж и м у зн ачен и я; зап р ети ть м аски р уем ы е и н ем аски р уем ы е п р еры ван и я; сб р оси ть би т P E , п ерекл ю чи в п р оц ессор в р еал ьн ы й р еж и м ; вы п олн и ть ком ан д у д ал ьн его п ер ехода д л я очи стки вн утр ен н ей очер еди ком ан д п р оц ессор а; н астр ои ть си стем у п р еры ван и й д л я р аб оты в р еал ьн ом р еж и м е; р азр еш и ть п р ер ы ван и я; загр узи ть в сегм ен тн ы е р еги стр ы зн ачен и я, н еобход и м ы е дл я р аб оты в р еал ьн ом р еж и м е.
К ак ви д и те, п р оц ед ур а возвр ата в р еа л ьн ы й р еж и м си л ьн о уп р ости лась и ускори л ась п о ср авн ен и ю с и сп ол ьзован н ой д л я п р оц ессор а i80286. О д н ако б ол ьш и н ство п р огр ам м , п ер екл ю чи вш и сь в защ и щ ѐн н ы й р еж и м , н и когд а б ол ьш е н е возвр ащ аю тся н азад . О н и ли б о всѐ вр ем я р аб отаю т в защ и щ ѐн н ом р еж и м е, ли б о п ер еклю чаю тся в р еж и м ви р туал ьн ого п р оц ессора 8086.
5 .7 . П р о ц ессо р i8 0 4 8 6 В этом р азд ел е м ы очен ь кр атко оп и ш ем п осл ед н ее н а м ом ен т н ап и сан и я д ан н ой кн и ги д ости ж ен и е ф и р м ы In tel п р оц ессор i80486. Э тот 32 -р азр яд н ы й б ы стр од ей ствую щ и й п р оц ессор сп ец и ал ьн о п ред н азн ачен д л я р аб оты м ул ьти зад ачн ы х оп ер ац и он н ы х си стем , таки х как U N IX и ли O S /2. П р оц ессор i80486 п ол н остью совм ести м с б ол ее р ан н и м и м од ел ям и - i80 86, i8028 6, i80386, н о в тож е вр ем я об л ад ает сущ ествен н о б ол ее в ы соки м б ы стр од ей стви ем . Н аи б ол ее часто встр ечаю щ и еся в п р огр ам м ах ком ан ды вы п олн яю тся за од и н м аш и н н ы й ц и кл . Н а кри стал л е п р оц ессор а н аход и тся 8 -ки л обай тн ы й кэш оп ерати вн ой п ам яти , об есп ечи ваю щ и й вы сокую п р ои звод и тел ьн ость д аж е п р и и сп ол ьзован и и отн оси тел ь н о м ед л ен н ой п ам яти . К р ом е того, п р оц ессор i8048 6 сод ер ж и т встр оен н ы й 32 -р азр яд н ы й ар и ф м ети чески й соп р оц ессор , зн ачи тел ьн о увел и чи ваю щ и й скор ость вы п ол н ен и я ар и ф м ети чески х ком ан д . С точки зр ен и я п р и кл ад н ого п р огр ам м и ста п р оц ессор i8048 6 п р акти чески н е отли чается от п р оц ессор а i80386 (за и скл ю чен и ем б ол ее вы сокой п р ои звод и тел ьн ости ). В се отл и чи я касаю тся тол ько си стем н ого ур овн я. Т ак как п р огр ам м и р ован и е п р оц ессора i8048 6 н а си стем н ом ур овн е - д остаточн о сл ож н ы й п р оц есс, м ы н е стан ем оп и сы вать этот п р оц ессор во всех п одр обн остях. К ак п р ави л о, б ол ьш и н ство п р огр ам м и стов н и когд а н е р аб отаю т с си стем н ы м и р еги стр ам и п р оц ессор ов i80386 и i80486 , оставл яя эту раб оту оп ерац и он н ой си стем е и ли д р ай вер ам р асш и р ен н ой п ам яти . В п р оц ессор е i80486 стал и оп р ед елен ы н екото р ы е, зар езер ви р ован н ы е р ан ее в п р оц ессор е i80386, б и ты р еги стр ов C R 0, C R 3, E FLA G S , есть н екотор ы е н овш ества в таб л и ц ах стран и ц , н овое и скл ю чен и е и н ескол ько н овы х ком ан д . В р еги стр е C R 0 стали оп р ед елен ы п ять н овы х би тов - NE, WP, AM, NW, CD. В р еги стр е C R 3 оп р ед ел ен ы два н овы х би та - P C D и P W T . В р еги стр е E FLA G S п ояви л ся н овы й ф л аг A C (б и т 18). Э тот б и т вм есте с б и том A M р еги стр а C R 0 кон тр ол и р ует п р оверку вы р авн и ван и я об ъ ектов в п ам яти . Ф ор м аты си стем н ы х р еги стров C R 0 и C R 3 д л я п р оц ессор а i80486, а такж е р еги стр а E FLA G S оп и сан ы в п р и л ож ен и и . Н овое и склю чен и е касается п р овер ки вы равн и ван и я и и м еет н ом ер 17. О н о возн и кает п р и п оп ы тке об ращ ен и я к д ан н ы м , н е вы р овн ен н ы м в п ам яти . Д л я того, чтоб ы п ри об р ащ ен и и к н е вы р овн ен н ом у оп ер ан д у в п ам яти п р ои зош л о и склю чен и е кон трол я вы р авн и ван и я, д ол ж н ы бы ть устан овл ен ы ф л аг A C в р еги стр е E FLA G S и би т A M в уп р авл яю щ ем р еги стр е C R 0. Зам ети м , что и скл ю чен и е кон тр ол я вы равн и ван и я ген ер и р уется тол ько в п р огр ам м ах, р аб отаю щ и х в тр етьем , н еп ри ви л еги р ован н ом кол ьц е.
Д об ави ли сь тр и ком ан д ы , п р ед н азн ачен н ы е д л я и сп ол ьзован и я п р и клад н ы м и п р огр ам м ам и - BSWAP, XADD, C M P X C H G , а такж е три н овы е си стем н ы е ком ан д ы , уп р авляю щ и е кэш ем и T LB - IN V D , W B IN V D , IN V LP G . Н овы е ком ан д ы об л егчаю т и ускоряю т р аб оту с сем аф ор ам и , что очен ь важ н о д л я м ул ьти зад ачн ы х оп ерац и он н ы х си стем . Е сть такж е н екотор ы е и зм ен ен и я в ф ор м ате ком ан ды M O V , и сп ол ьзуем ой д л я д оступ а к тестовы м р еги стр ам . П ояви ли сь н овы е р еги стры д ля р аб оты с кэш ем . В ц ел ом м ож н о отм ети ть, что ар хи тектур а п р оц ессор а i80486 н е п р ете рп ел а р еволю ц и он н ы х и зм ен ен и й п о ср авн ен и ю с п р оц ессор ом i80386. П оэтом у в б ол ьш и н стве сл учаев п р и кл ад н ой п р ограм м и ст м ож ет счи тать, что п р оц ессор i80486 - это очен ь б ы стр ы й вари ан т п р оц ессор а i80386.
5 .8 . 8 0 2 8 6 , 8 0 3 8 6 , 8 0 4 8 6 ...Ч то д ал ьш е? В 199 3 год у д ол ж ен п ояви ться н овы й п р оц ессор - i805 86. П р ед п олагается, что он п о своей п р ои звод и тел ьн ости см ож ет состави ть р еал ьн ую кон кур ен ц и ю R IS C -п р оц ессор ам , и сп ол ьзуем ы м в р аб очи х стан ц и ях ти п а S U N . Ф и р м а In tel п ока хр ан и т в секр ете п од р обн ости ар хи те ктуры н ового п р оц ессор а, п оэтом у м ы м ож ем тол ько д огад ы ваться о его возм ож н остях. У чи ты вая п реѐм ствен н ость во всех п р оц ессор ах, р азр аб аты ваем ы х ф и р м ой In tel н ачи н ая с м од ел и i8080, м ож н о п р ед п олагать, что этот суп ер совр ем ен н ы й скор остн ой п р оц ессор б уд ет сп особ ен вы п олн ять п р ограм м ы , р азр аб отан н ы е когда-то д л я п р оц ессор а i8086, п р и чѐм с н еоб ы чай н о вы сокой скор остью !
6.И ЕР А Р Х И Я С Р ЕД С ТВ Д Л Я Р А Б О ТЫ В ЗА Щ И Щ ЁН Н О М Р ЕЖ И М Е В ы уж е, н аверн ое, об р ати ли вн и м ан и е н а то, что п р ограм м и р ован и е д л я защ и щ ѐн н ого р еж и м а зн ачи тел ьн о сл ож н ее, чем д л я р еал ьн ого, и тр еб ует учѐта б ол ьш ого кол и чества важ н ы х д еталей . Д аж е д л я того, чтоб ы п р осто п ер евести п р оц ессор i80286 в защ и щ ѐн н ы й р еж и м , тр ебуется п р овести осн овательн ую п од готови тел ьн ую р аб оту. П р оц ессор ы i80386 и i8048 6 зн ач и тел ьн о сл ож н ее, чем i80286. И сп ол ьзован и е всех возм ож н остей эти х п р оц ессор ов д оступ н о тол ько вы сококвал и ф и ц и р ован н ы м си стем н ы м п р огр ам м и стам и тр ебует п од р об н ого озн аком л ен и я с р уковод ствам и п о п р оц ессор ам , п оставл яем ы м и ф и р м ой In tel. К счастью , сущ ествует п р ограм м н ое об есп ечен и е, об легчаю щ ее п р оц есс созд ан и я п р огр ам м д л я защ и щ ѐн н ого р еж и м а. Э то п р огр ам м н ое обесп ечен и е вы ступ ает в качестве и н тер ф ей са м еж д у п р ограм м ой п ол ьзовател я и н екотор ой уп равл яю щ ей п р огр ам м ой (н ап р и м ер , м ул ьти задачн ой оп ер ац и он н ой си стем ой защ и щ ѐн н ого р еж и м а). М ы р ассм отри м сред ства, д оступ н ы е п р огр ам м и стам в ср ед е M S -D O S вер си и 5.0 и M S W IN D O W S вер си й 3.0 и 3.1. С ущ ествует н ескол ько ур овн ей р асш и р ен н ой п ам ятью :
п р огр ам м н ой
п од д ер ж ки
защ и щ ѐн н ого р еж и м а и
п од д ер ж ки
раб оты
с
и н тер ф ей с B IO S ; и н тер ф ей с д рай вер а H IM E M .S Y S ; и н тер ф ей с E M S /V C P I; и н тер ф ей с D P M I; р асш и ри тели D O S (D O S -экстен д ер ы ).
И н терф ей сом сам ого н и зкого ур овн я явл яется и н тер ф ей с B IO S , п р ед оставл яем ы й п р огр ам м ам в ви д е н ескол ьки х ф ун кц и й п рер ы ван и я B IO S IN T 15h. И н тер ф ей с B IO S п озвол яет п р огр ам м е п ер евести п р оц ессор и з р еал ьн ого р еж и м а в защ и щ ѐн н ы й , п ересл ать б л ок п ам яти и з стан д ар тн ой п ам яти в расш и р ен н ую и л и и з р асш и р ен н ой в стан д артн ую . Э ти м все его возм ож н ости и огр ан и чи ваю тся. И н терф ей с B IO S и сп ол ьзуется д л я стар та м ул ьти зад ачн ы х оп ер ац и он н ы х си стем защ и щ ѐн н ого р еж и м а (таки х, как O S/2) и ли в стары х п р огр ам м ах, р аб отаю щ и х с р асш и р ен н ой п ам ятью в защ и щ ѐн н ом р еж и м е (н ап р и м ер , С У Б Д O R A C LE вер си и 5.1). Н азн ачен и е д р ай вера H IM E M .S Y S и его возм ож н ости б ы ли п од р обн о оп и сан ы во второй части втор ого том а "Б и б л и отеки си стем н ого п р огр ам м и ста" (гл ава 10). С п ом ощ ью ф ун кц и й , п р ед оставляем ы х эти м д рай вер ом , п р огр ам м а м ож ет вы п ол н ять р азл и чн ы е д ей стви я с б л окам и р асш и р ен н ой п ам яти , а такж е уп р авл ять ад р есн ой л и н и ей A 20. О сн овн ое р азли чи е м еж д у сп особ ом р аб оты с р асш и р ен н ой п ам ятью д р ай вер а H IM E M .S Y S и и н тер ф ей сом п р ер ы ван и я B IO S IN T 15h закл ю чается в том , что п ер вы й вы п олн яет вы д ел ен и е п р огр ам м е и
вн утр ен н и й учѐт б л оков р асш и р ен н ой п ам яти , а втор ой р ассм атр и вает всю р асш и рен н ую п ам ять как од и н н еп рер ы вн ы й участок. Е сл и в си стем е устан овл ен д р ай вер H IM E M .S Y S , ваш а п р огр ам м а н е д ол ж н а п ол ьзоваться п р ер ы ван и ем IN T 15h во и зб еж ан и е кон ф ли кта со схем ой р асп р ед ел ен и я р асш и р ен н ой п ам яти , и сп ол ьзуем ой д р ай вер ом . О дн ако д р ай вер H IM E M .S Y S н е откры вает д л я п р ограм м д оступ к защ и щ ѐн н ом у реж и м у. О н п олн остью р аб отает в р еал ьн ом р еж и м е, а д л я об р ащ ен и я к р асш и р ен н ой п ам яти и сп ол ьзует л и б о н ед окум ен ти р ован н ую м аш и н н ую ком ан д у LO A D A LL (есл и и сп ользуется п р оц ессор 80286), л и б о возм ож н ости п р о ц ессор а 80386, котор ы й п озвол яет ад р есовать р асш и рен н ую п ам ять в р еал ьн ом реж и м е (п р и соответствую щ ей и н и ц и али зац и и си стем н ы х р еги стр ов и таб ли ц ). В п р и л ож ен и и м ы оп и сал и дей стви я, вы п ол н яем ы ком ан д ой LO A D A LL. В ы уб еди тесь, что ком ан д а п ол н остью оп р авд ы вает своѐ н азван и е! (Load A ll - загр узи ть всѐ). С л ед ую щ и й ур овен ь - и н тер ф ей с E M S /V C P I. В о второй части втор ого том а "Б и б л и отеки си стем н ого п р огр ам м и ста", в гл аве 11, м ы п од р обн о р ассм атри вали и н тер ф ей с E M S , котор ы й и сп ол ьзуется д л я р аб оты с д оп ол н и тел ьн ой п ам ятью . Т ам ж е р азъ ясн яю тся отл и чи я м еж д у р асш и р ен н ой и д оп ол н и тел ьн ой п ам ятью . И сп ол ьзуя тр ан сл яц и ю стр ан и ц , н екоторы е д р ай вер ы п ам яти (н ап ри м ер, E M M 38 6 и л и Q E M M ) м огут эм ул и р овать п р и сустви е д оп ол н и тел ьн ой п ам яти , и сп ол ьзуя расш и р ен н ую п ам ять. П ри этом стан дар тн ы й н аб ор ф ун кц и й уп р авл ен и я д оп ол н и тел ьн ой п ам ятью , р еали зован н ы й в р ам ках п рер ы ван и я IN T 67h , д оп ол н ен еш ѐ н ескол ьки м и ф ун кц и ям и д л я р аб оты в защ и щ ѐн н ом р еж и м е п р оц ессор а. Э ти н овы е ф ун кц и и р еал и зую т и н тер ф ей с ви р туал ьн ой уп равл яю щ ей п р огр ам м ы V CPI (Virtual Control Programm In terface). О н и п озвол яю т устан авл и вать защ и щ ѐн н ы й и ви р туал ьн ы й р еж и м ы р аб оты п р оц ессор а, р аб отать с р асш и р ен н ой п ам ятью н а ур овн е стр ан и ц и устан авл и вать сп ец и ал ьн ы е отл ад очн ы е р еги стр ы п р оц ессор а i80386. И н терф ей с V C PI об ле гчает и сп ол ьзован и е м ехан и зм а тр ан сл яц и и стр ан и ц , освоб ож д ая п р ограм м и ста от н еобход и м ости раб отать с си стем н ы м и р еги стр ам и п р оц ессор а. И н терф ей с D P M I (D O S P rotected M od e In terface - и н терф ей с защ и щ ѐн н ого р еж и м а д л я D O S ) р еали зуется м од ул ем , н азы ваю щ и м ся сервер ом D P M I. Э тот и н тер ф ей с д оступ ен д л я тех п р огр ам м , котор ы е р аб отаю т н а ви р туал ьн ой м аш и н е W IN D O W S и ли O S/2 вер си и 2.0 (п озж е м ы об суди м н екотор ы е д етали , связан н ы е с и сп ол ьзован и ем и н тер ф ей са D P M I в W IN D O W S ). И н терф ей с D P M I п р ед оставляет п ол н ы й н аб о р ф ун кц и й д л я созд ан и я од н озад ачн ы х п р огр ам м , раб отаю щ и х в защ и щ ѐн н ом реж и м е. В этом и н тер ф ей се и м ею тся ф ун кц и и д л я п ерекл ю чен и я и з р еал ьн ого р еж и м а в защ и щ ѐн н ы й и обр атн о (!), дл я р аб оты с л окал ьн ой таб ли ц ей д ескри п тор ов LD T , д л я раб оты с р асш и р ен н ой и стан д артн ой п ам ятью н а ур овн е стр ан и ц , д л я раб оты с п р ер ы ван и ям и (в том чи сл е дл я вы зова п р ер ы ван и й р еал ьн ого р еж и м а и з защ и щ ѐн н ого реж и м а), д л я р аб оты с отл ад очн ы м и р еги стр ам и п р оц ессор а i80386. Э то н аи б ол ее р азви ты й и н терф ей с и з всех р ассм отр ен н ы х р ан ее. П осл ед н и й , сам ы й вы соки й уровен ь п р огр ам м н ой п од д ер ж ки защ и щ ѐн н ого р еж и м а - р асш и р и тел и D O S и л и D O S экстен д ер ы (D O S -exten d er). О н и п оставл яю тся, как п р ави л о, вм есте со ср ед ствам и р азр аб отки п р ограм м (тр ан сл ятор ам и ) в ви д е б и бл и отек и ком п он ую тся вм есте с созд аваем ой п р огр ам м ой в ед и н ы й загр узочн ы й м од ул ь. DOS-экстен д ер ы зн ачи тел ьн о об л егчаю т и сп ол ьзован и е защ и щ ѐн н ого реж и м а и р асш и р ен н ой п ам яти в п р огр ам м ах, п ред н азн ачен н ы х д л я зап уска и з ср ед ы M S -D O S . П р огр ам м ы , составл ен н ы е с и сп ол ьзован и ем D O S экстен д ер ов, вн еш н е очен ь п охож и н а об ы чн ы е п р огр ам м ы M S -D O S , од н ако он и п ол учаю т уп равл ен и е, когд а п р оц ессор уж е н аход и тся в защ и щ ѐн н ом р еж и м е. К ф ор м и р уем ом у с п ом ощ ью D O S -экстен д ер а загр узочн ом у м од ул ю д об авл яю тся п р оц ед ур ы , н еоб ходи м ы е д л я и н и ц и али зац и и защ и щ ѐ н н ого р еж и м а. Э ти п р оц ед ур ы п ервы м и п ол учаю т уп р авл ен и е и вы п ол н яю т н ачал ьн ую и н и ц и али зац и ю таб ли ц G D T , LD T , ID T , сод ер ж ат обр аб отчи ки п р еры ван и й и и скл ю чен и й , си стем у уп равл ен и я ви р туал ьн ой п ам ятью и т.д . П р и м ер D O S -экстен д ер а, п оставл яем ого вм есте с тр а н сл ятор ом - 386-D O S /E xtend er ф и р м ы P h ar Lap .
6 .1 . И н тер ф ей с B IO S Э тот и н тер ф ей с р еали зуется в р ам ках п р ер ы ван и я B IO S IN T 15h в ком п ью тер ах м од ел ей IB M A T н а осн ове п р оц ессор ов i80286, i80386 и л и i80486.
О п р ед ел и ть р азм ер р асш и р ен н о й п ам я ти
Регистры на входе: AH 88h Регистры на выходе: AX Размер доступной расширенной памяти в килобайтах. Э та ф ун кц и я п ред н азн ачен а д л я оп р ед ел ен и я р азм ера р асш и р ен н ой п ам яти , д оступ н ой д л я и сп ол ьзован и я ф ун кц и ям и п р ер ы ван и я IN T 15h. У чти те, что есл и в си стем е устан овл ен д р ай вер H IM E M .S Y S , ф ун кц и я 88h м ож ет вер н уть н ул евой разм ер д оступ н ой расш и р ен н ой п ам яти . Н екотор ы е п р огр ам м ы (н ап р и м ер, С У Б Д O racle вер си и 5.1) м огут оказаться н есовм ести м ы м и с д р ай вер ом H IM E M .S Y S , так как он и р аб отаю т с р асш и рен н ой п ам ятью ср ед ствам и п р ер ы ван и я INT 15h . А н ал оги чн ы е п р об л ем ы м огут возн и кн уть и п ри и сп ол ьзован и и д р уги х д рай вер ов р асш и рен н ой п ам яти , н ап р и м ер, Q E M M . К ак п р ави л о, д р ай вер ы р асш и р ен н ой п ам яти п озвол яю т зар езерви р овать часть р асш и р ен н ой п ам я ти д л я п р огр ам м , и сп ол ьзую щ и х и н тер ф ей с IN T 15h . Д л я этого н еоб ходи м о зад ать соответствую щ и е п ар ам етр ы . Н ап ри м ер, д л я д рай вер а H IM E M .S Y S р азм ер зар езер ви р ован н ой р асш и р ен н ой п ам яти м ож н о указать сл ед ую щ и м об р азом :
device=c:\dos\himem.sys /int15=xxxx В это й стр оке "xxxx" - р азм ер зар езерви р ован н ой п ам яти в ки л об ай тах.
П ер есл ать б л о к р асш и р ен н о й п ам яти Регистры на входе: AH 87h CX Размер пересылаемого блока в словах. ES:SI Адрес таблицы GDT, подготовленной специальным образом. Регистры на выходе: CARRY = 0 Функция выполнилась без ошибки. AX 00h В случае ошибки: CARRY = 1 Произошла ошибка при пересылке блока. AH Код ошибки: 01h - ошибка чѐтности; 02h - произошло исключение; 03h - сбой адресной линии A20. П ер ед вы зовом этой ф ун кц и и н еобход и м о п од готови ть G D T , состоящ ую и з 6 д ескр и п тор ов. Д ва п ер вы х и д ва п осл ед н и х д ескри п тор а д олж н ы сод ерж ать н ули . Т р ети й д ескр и п тор д ол ж ен указы вать н а н ачал о об л асти п ам яти , и з котор ой б уд ет вы п ол н яться коп и р ован и е. Ч етвѐрты й д ескр и п тор д ол ж ен указы вать н а об л асть п ам яти , в котор ую б уд ет вы п ол н яться коп и р ован и е б л ока д ан н ы х. В тр етьем и четвѐр том д ескри п тор е н еоб ходи м о зап олн и ть п ол я п р ед ела д л я коп и р уем ого б л ока п ам яти (в н и х д ол ж н о б ы ть зап и сан о зн ачен и е C X *2 - 1), и п ол е д оступ а (зн ачен и е 93): Т аб л и ц а 6. G D T д л я п ер есы л ки бл ока п ам яти ср ед ствам и B IO S . С м ещ ен и е б ай та
С од ер ж и м ое
00h - 0Fh
Э то п ол е д ол ж н о сод ерж ать н ул и .
10h - 11h
П р ед ел сегм ен та (C X *2 -1).
12h - 14h
24-р азр яд н ы й ф и зи чески й ад рес и сходн ого б л ока п ам яти .
15h
Б ай т д оступ а, д олж ен б ы ть р авен 93h .
16h - 17h
Э то п ол е д ол ж н о сод ерж ать н ул и .
18h - 19h
П р ед ел сегм ен та (C X *2 -1).
1Ah - 1Ch
24-р азр яд н ы й ф и зи чески й ад рес р езул ьти рую щ его б л ока п ам яти .
1Dh
Б ай т д оступ а, д олж ен б ы ть р авен 93h .
1Eh - 2Fh
Э то п ол е д ол ж н о сод ерж ать н ул и .
Д л я п ер есы л ки б л ока ф ун кц и я 87h п ер евод и т п р оц ессор в защ и щ ѐн н ы й реж и м , и сп ол ьзуя п од готовл ен н ую таб ли ц у G D T . Т ак как указы ваю тся 24 -р азр яд н ы е ф и зи чески е ад р еса и сходн ого и резул ьти р ую щ его б л оков, возм ож н а п ер есы л ка б л оков и з л ю б ого м еста п ам яти в лю б ое м есто п ам яти . Разм ер б л ока, очеви д н о, огр ан и чен 64 ки л об ай там и . П ер есы л ка б л ока вы п олн яется в защ и щ ѐн н ом р еж и м е обы чн ой ком ан д ой M O V S , п ри чѐм во вр ем я п ер есы лки п р ер ы ван и я зап р ещ ен ы . П еред возвратом ф ун кц и я вы п ол н яет сбр ос п р оц ессор а и устан овку реал ьн ого реж и м а. В ся п р оц ед ур а п ересы л ки оказы вается д остаточн о д ли тел ьн ой , так к ак н еоб ходи м о вы п ол н и ть сб р ос п р оц ессор а. И з-за того, что во вр ем я п ересы л ки п р ер ы ван и я зап р ещ ен ы , возм ож ен кон ф л и кт с устр ой ствам и ввод а/вы вод а (п отер я п р ер ы ван и й ).
У стан о в и ть защ и щ ѐн н ы й р еж и м р аб о ты п р о ц ессо р а Ф ун кц и я п ер еклю чает п р оц ессор и з р еал ьн ого р еж и м а в защ и щ ѐн н ы й . К р ом е этого, он а п р ои зводи т п ер еп р огр ам м и р ован и е кон тр ол л ер ов п р ер ы ван и й , н еобход и м ое и з-за кон ф л и кта и сп ол ьзуем ы х в р еал ьн ом р еж и м е вектор ов ап п ар атн ы х п р ер ы ван и й с зар езер ви р ован н ы м и п р ер ы ван и ям и защ и щ ѐн н ого реж и м а.
Регистры на входе: AH 89h BH Номер прерывания для IRQ0, используется для перепрограммирования первого контроллера прерывания. Этот номер должен быть кратен 8. BL Номер прерывания для IRQ8, используется для перепрограммирования второго контроллера прерывания. Этот номер также должен быть кратен 8. ES:SI Адрес таблицы GDT, подготовленной специальным образом. Регистры на выходе: CARRY = 0 Функция выполнилась без ошибки. AH 00h CS, DS, ES, SS В эти регистры заносятся значения в соответствии с подготовленной перед вызовом функции таблицей GDT, адрес которой задаѐтся в регистрах ES:SI. В случае ошибки: CARRY = 1 Произошла ошибка при входе в защищѐнный режим. AH FF П од готовл ен н ая п ер ед вы зовом ф ун кц и и 89h таб ли ц а G D T дол ж н а состоять и з восьм и д ескр и п тор ов: Т аб л и ц а 7. G D T д л я п ер еход а в защ и щ ѐн н ы й р еж и м ср ед ствам и B IO S . 0
П устой д ескри п тор , сод ер ж и т н ул и во всех п ол ях.
1
Д ескр и п тор , оп и сы ваю щ и й таб л и ц у G D T .
2
Д ескр и п тор , оп и сы ваю щ и й таб л и ц у ID T .
3
Д ескр и п тор д л я сегм ен та д ан н ы х, сответствует сел ектор у, котор ы й буд ет загруж ен в реги стр DS.
4
Д ескр и п тор д оп ол н и тел ьн ого сегм ен та д ан н ы х (р еги стр E S ).
5
Д ескр и п тор сегм ен та стека (реги стр S S ).
6
Д ескр и п тор сегм ен та код а (р еги стр C S ).
7
Э тот д ескр и п тор и н и ц и ал и зи ровать н е н ад о, он б уд ет и сп ользоваться ф ун кц и ей 89h д л я ад р есац и и сегм ен та д ан н ы х B IO S .
В р ам ках п р ер ы ван и я IN T 15h н ет ф ун кц и и д л я возврата и з защ и щ ѐн н ого р еж и м а в реал ьн ы й . П очем у? П отом у, что во -п ер вы х, в защ и щ ѐн н ом р еж и м е п рер ы ван и е 15h зар езерви р ован о ф и рм ой In tel, во -втор ы х, д л я р аб оты в защ и щ ѐн н ом р еж и м е вам и п од готавли вается таб л и ц а ID T и оп ред ел яю тся зан ово все обр аб отчи ки п р ер ы ван и й . О б раб отчи ки п р ер ы ван и й B IO S р ассчи тан ы н а р аб оту в р еал ьн ом р еж и м е и п осл е п ер еход а в защ и щ ѐн н ы й р еж и м стан овятся н ед оступ н ы .
П р и м ер и сп о л ьзо ван и я и н тер ф ей са B IO S Н аш п р и м ер д ем он стри р ует и сп ол ьзован и е ф ун кц и и 89h п р еры ван и я IN T 15h д л я устан овки защ и щ ѐн н ого р еж и м а раб оты п р оц ессор а. П р огр ам м а устан авл и вает защ и щ ѐн н ы й реж и м , вы д аѐт п ер вое сооб щ ен и е и через н екотор ое вр ем я, вы д ав втор ое сооб ещ н и е, возвращ ается в р еал ьн ы й р еж и м . П осл е того, как б уд ет н аж а та л ю б ая кл ави ш а, раб ота п р ограм м ы б уд ет завер ш ен а. О б р ати те вн и м ан и е н а то, как в ф ай л е tos.c п од готавли вается таб ли ц а G D T . А д р ес п од готовл ен н ой таб ли ц ы п ер ед аѐтся ф ун кц и и p rotected _m od e(), котор ая п ер ед аѐт его ф ун кц и и 89h п р ер ы ван и я IN T 15h . В ы зов этой ф ун кц и и вы п ол н яется в ф ай ле tossyst.asm .
Листинг 16. Определение констант и структур данных Файл tos.h ----------------------------------------------------------#define word unsigned int // Селекторы, определѐнные в GDT #define GDT_SELECTOR #define IDT_SELECTOR #define DATA_SELECTOR
0x08 // 1 - селктор для GDT 0x10 // 2 - селектор для IDT 0x18 // 3 - селектор для DS
#define VID_MEM_SELECTOR // #define SS_SELECTOR #define CODE_SELECTOR #define BIOS_SELECTOR #define #define #define #define #define
COLOR_VID_MEM MONO_VID_MEM MONO_MODE BW_80_MODE COLOR_80_MODE
0x20 // 4 - селектор для ES, будет использован для адресации видеопамяти 0x28 // 5 - селектор для SS 0x30 // 6 - селектор для CS 0x38 // 7 - селектор для адресации // области данных BIOS 0xb8000L 0xb0000L 0x07 0x02 0x03
typedef struct descriptor { word limit; word base_lo; unsigned char base_hi; unsigned char type_dpl; unsigned reserved; } descriptor; typedef struct gate { word offset; word selector; unsigned char count; unsigned char type_dpl; word reserved; } gate; #define DESCRIPTOR_SIZE
(sizeof(descriptor))
#define GATE_SIZE #define IDT_SIZE
(sizeof(gate)) (sizeof(idt))
#define #define #define #define #define #define #define #define #define
0x18 0x10 0x86 0x87 0x02 0x02 0x04 0x01 0x80
TYPE_CODE_DESCR TYPE_DATA_DESCR TYPE_INTERRUPT_GATE TYPE_TRAP_GATE SEG_WRITABLE SEG_READABLE SEG_EXPAND_DOWN SEG_ACCESSED SEG_PRESENT_BIT
#define EOI #define MASTER8259A #define SLAVE8259A
0x20 0x20 0xA0
#define MK_LIN_ADDR(seg,off) (((unsigned long)(seg))<<4)+(word)(off) Листинг 17. Главная программа Файл tos.c ----------------------------------------------------------#include #include #include #include #include
<stdio.h> <stdlib.h> <dos.h> "tos.h"
void void void void
Init_And_Protected_Mode_Entry(void); protected_mode(descriptor far *gdt_ptr); real_mode(void); init_gdt_descriptor(descriptor *descr, unsigned long base, word limit, unsigned char type); void vi_print(unsigned int x, unsigned int y, char *s, char attr); void vi_hello_msg(void); void void void void void void void void void void void void void void void void void void void void void void void void void
exception_0(void); //{ prg_abort(0); } exception_1(void); //{ prg_abort(1); } exception_2(void); //{ prg_abort(2); } exception_3(void); //{ prg_abort(3); } exception_4(void); //{ prg_abort(4); } exception_5(void); //{ prg_abort(5); } exception_6(void); //{ prg_abort(6); } exception_7(void); //{ prg_abort(7); } exception_8(void); //{ prg_abort(8); } exception_9(void); //{ prg_abort(9); } exception_A(void); //{ prg_abort(0xA); } exception_B(void); //{ prg_abort(0xB); } exception_C(void); //{ prg_abort(0xC); } exception_D(void); //{ prg_abort(0xD); } exception_E(void); //{ prg_abort(0xE); } exception_F(void); //{ prg_abort(0xF); } exception_10(void); //{ prg_abort(0x10); exception_11(void); //{ prg_abort(0x11); exception_12(void); //{ prg_abort(0x12); exception_13(void); //{ prg_abort(0x13); exception_14(void); //{ prg_abort(0x14); exception_15(void); //{ prg_abort(0x15); exception_16(void); //{ prg_abort(0x16); exception_17(void); //{ prg_abort(0x17); exception_18(void); //{ prg_abort(0x18);
} } } } } } } } }
void void void void void void void
exception_19(void); exception_1A(void); exception_1B(void); exception_1C(void); exception_1D(void); exception_1E(void); exception_1F(void);
//{ //{ //{ //{ //{ //{ //{
prg_abort(0x19); prg_abort(0x1A); prg_abort(0x1B); prg_abort(0x1C); prg_abort(0x1D); prg_abort(0x1E); prg_abort(0x1F);
} } } } } } }
void iret0(void); void iret1(void); descriptor
gdt[8];
gate idt[] = { { (word)&exception_0, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 0 { (word)&exception_1, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 1 { (word)&exception_2, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 2 { (word)&exception_3, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 3 { (word)&exception_4, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 4 { (word)&exception_5, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 5 { (word)&exception_6, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 6 { (word)&exception_7, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 7 { (word)&exception_8, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 8 { (word)&exception_9, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 9 { (word)&exception_A, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // A { (word)&exception_B, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // B { (word)&exception_C, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // C { (word)&exception_D, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // D { (word)&exception_E, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // E { (word)&exception_F, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // F { (word)&exception_10, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 10 { (word)&exception_11, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 11 { (word)&exception_12, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 12 { (word)&exception_13, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 13 { (word)&exception_14, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 14 { (word)&exception_15, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 15 { (word)&exception_16, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 16 { (word)&exception_17, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 17 { (word)&exception_18, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 18 { (word)&exception_19, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 19 { (word)&exception_1A, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 1A { (word)&exception_1B, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 1B { (word)&exception_1C, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 1C { (word)&exception_1D, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 1D { (word)&exception_1E, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 1E { (word)&exception_1F, CODE_SELECTOR, 0, TYPE_TRAP_GATE, 0 }, // 1F { { { { { { { {
(word)&iret0, (word)&iret0, (word)&iret0, (word)&iret0, (word)&iret0, (word)&iret0, (word)&iret0, (word)&iret0,
CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR,
0, 0, 0, 0, 0, 0, 0, 0,
TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE,
0 0 0 0 0 0 0 0
}, }, }, }, }, }, }, },
// // // // // // // //
20 21 22 23 24 25 26 27
{ { { { { { {
(word)&iret1, (word)&iret1, (word)&iret1, (word)&iret1, (word)&iret1, (word)&iret1, (word)&iret1,
CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR, CODE_SELECTOR,
0, 0, 0, 0, 0, 0, 0,
TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE, TYPE_INTERRUPT_GATE,
0 0 0 0 0 0 0
}, }, }, }, }, }, },
// // // // // // //
28 29 2A 2B 2C 2D 2E
{ (word)&iret1, CODE_SELECTOR, 0, TYPE_INTERRUPT_GATE, 0 } };
// 2F
word y=0; void main(void) { textcolor(BLACK); textbackground(LIGHTGRAY); clrscr(); Init_And_Protected_Mode_Entry(); enable_interrupt(); vi_hello_msg(); y=3; vi_print(0, y++, " Вошли в защищѐнный режим", 0x7f); pause(); vi_print(0, y++, " Для возврата в реальный режим нажмите любую клавишу", 0x7f); real_mode(); getch(); textcolor(WHITE); textbackground(BLACK); clrscr(); } void init_gdt_descriptor(descriptor *descr, unsigned long base, word limit, unsigned char type) { descr->base_lo descr->base_hi descr->type_dpl descr->limit descr->reserved
= = = = =
(word)base; (unsigned char)(base >> 16); type; limit; 0;
} void Init_And_Protected_Mode_Entry(void) { union REGS r; word crt_mode; extern word gv1_; // Дескриптор, описывающий таблицу GDT init_gdt_descriptor(&gdt[1], MK_LIN_ADDR(_DS, &gdt), sizeof(gdt)-1, TYPE_DATA_DESCR | SEG_PRESENT_BIT | SEG_WRITABLE); // Дескриптор, описывающий таблицу IDT init_gdt_descriptor(&gdt[2], MK_LIN_ADDR(_DS, &idt), (unsigned long)IDT_SIZE-1, TYPE_DATA_DESCR | SEG_PRESENT_BIT | SEG_WRITABLE); // Дескриптор сегмента данных init_gdt_descriptor(&gdt[3], MK_LIN_ADDR(_DS, 0), 0xffffL, TYPE_DATA_DESCR | SEG_PRESENT_BIT | SEG_WRITABLE); // Определяем текущий видеорежим r.h.ah=15; int86(0x10,&r,&r); crt_mode = r.h.al;
// Инициализация дескриптора для видеопамяти // монохромного видеоадаптера if(crt_mode == MONO_MODE) init_gdt_descriptor(&gdt[4], MONO_VID_MEM, 3999, TYPE_DATA_DESCR | SEG_PRESENT_BIT | SEG_WRITABLE); // Инициализация дескриптора для видеопамяти // цветного видеоадаптера else if(crt_mode == BW_80_MODE || crt_mode == COLOR_80_MODE) init_gdt_descriptor(&gdt[4], COLOR_VID_MEM, 3999, TYPE_DATA_DESCR | SEG_PRESENT_BIT | SEG_WRITABLE); else { printf("\nИзвините, этот видеорежим недопустим."); exit(-1); } // Дескриптор для сегмента стека init_gdt_descriptor(&gdt[5], MK_LIN_ADDR(_DS, 0), 0xffffL, TYPE_DATA_DESCR | SEG_PRESENT_BIT | SEG_WRITABLE); // Дескриптор для сегмента кода init_gdt_descriptor(&gdt[6], MK_LIN_ADDR(_CS, 0), 0xffffL, TYPE_CODE_DESCR | SEG_PRESENT_BIT | SEG_READABLE); // Входим в защищѐнный режим // В качестве параметра передаѐм адрес подготовленной // таблицы GDT protected_mode(gdt); } void prg_abort(int err); void void void void void void void void void void void void void void void void void void void void void void void void
exception_0(void) { prg_abort(0); } exception_1(void) { prg_abort(1); } exception_2(void) { prg_abort(2); } exception_3(void) { prg_abort(3); } exception_4(void) { prg_abort(4); } exception_5(void) { prg_abort(5); } exception_6(void) { prg_abort(6); } exception_7(void) { prg_abort(7); } exception_8(void) { prg_abort(8); } exception_9(void) { prg_abort(9); } exception_A(void) { prg_abort(0xA); } exception_B(void) { prg_abort(0xB); } exception_C(void) { prg_abort(0xC); } exception_D(void) { prg_abort(0xD); } exception_E(void) { prg_abort(0xE); } exception_F(void) { prg_abort(0xF); } exception_10(void) { prg_abort(0x10); exception_11(void) { prg_abort(0x11); exception_12(void) { prg_abort(0x12); exception_13(void) { prg_abort(0x13); exception_14(void) { prg_abort(0x14); exception_15(void) { prg_abort(0x15); exception_16(void) { prg_abort(0x16); exception_17(void) { prg_abort(0x17);
} } } } } } } }
void void void void void void void void
exception_18(void) exception_19(void) exception_1A(void) exception_1B(void) exception_1C(void) exception_1D(void) exception_1E(void) exception_1F(void)
{ { { { { { { {
prg_abort(0x18); prg_abort(0x19); prg_abort(0x1A); prg_abort(0x1B); prg_abort(0x1C); prg_abort(0x1D); prg_abort(0x1E); prg_abort(0x1F);
} } } } } } } }
void prg_abort(int err) { vi_print(1,y++,"---> Произошло исключение", 0xc); real_mode(); gotoxy(1,24); cprintf("Исключение %X, нажмите любую клавишу", err); getch(); textcolor(WHITE); exit(0);
textbackground(BLACK); clrscr();
} void iret0(void) { asm { push mov out pop pop bp iret } } void iret1(void) { asm { push mov out out pop pop bp iret } }
ax al,EOI MASTER8259A,al ax
ax al,EOI MASTER8259A,al SLAVE8259A,al ax
void vi_putch(unsigned int x, unsigned int y ,char c, char attr) { register unsigned int offset; char far *vid_ptr; offset=(y*160) + (x*2); vid_ptr=MK_FP(VID_MEM_SELECTOR, offset); *vid_ptr++=c; *vid_ptr=attr; } void vi_print(unsigned int x, unsigned int y, char *s, char attr) { while(*s) vi_putch(x++, y, *s++, attr); } void vi_hello_msg(void) { vi_print(0, 0, " Protected mode monitor *TINY/OS*, "
"v.1.11 for CPU 80286 ¦ © Frolov A.V., 1992 ", 0x30); } Листинг 18. Функции для перехода в защищѐнный режим и возврата в реальный режим. Файл tossyst.asm ----------------------------------------------------------IDEAL MODEL SMALL RADIX 16 P286 DATASEG CMOS_PORT PORT_6845 COLOR_PORT MONO_PORT STATUS_PORT SHUT_DOWN INT_MASK_PORT VIRTUAL_MODE A20_PORT A20_ON A20_OFF EOI MASTER8259A SLAVE8259A KBD_PORT_A KBD_PORT_B
EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU
gdt_off gdt_seg
dw dw
real_ss real_sp real_es
dw dw dw
70 63h 03d4h 03b4h 64h 0feh 21h 0001 0d1 0df 0ddh 20 20 0a0h 60h 61h ? ? ? ? ?
CODESEG PUBLIC PUBLIC PUBLIC
_real_mode, _protected_mode _enable_interrupt _pause
PROC _protected_mode NEAR push bp mov bp,sp mov mov mov mov push mov mov mov mov pop
ax,[bp+4] dx,[bp+6] [gdt_seg], dx [gdt_off], ax ds ax,40 ds,ax [WORD 67],OFFSET shutdown_return [WORD 69],cs ds
cli in and out
al, INT_MASK_PORT al, 0ffh INT_MASK_PORT, al
mov out jmp
al,8f CMOS_PORT,al delay1
mov out
al,5 CMOS_PORT+1,al
mov mov
[real_ss],ss [real_es],es
delay1:
; Загружаем регистры ES:SI адресом GDT, полученным ; как параметр функции protected_mode() mov mov
es, [gdt_seg] si, [gdt_off]
; Подготавливаем номера прерываний IRQ0 и IRQ8 ; для перепрограммирования контроллеров прерываний. mov
bx, 2028h
; Устанавливаем защищѐнный режим работы mov int jnc
ax, 8900h 15h pok
; Если произошла ошибка, мы остались в реальном режиме, ; завершаем работу программы. mov int
ah, 4ch 21h
; Установлен защищѐнный режим работы процессора ! pok: pop ret ENDP _protected_mode PROC _real_mode
bp
NEAR mov mov out
[real_sp], sp al, SHUT_DOWN STATUS_PORT, al
hlt jmp
waitr1
waitr1:
LABEL
shutdown_return FAR mov mov
assume
ax, DGROUP ds, ax
ds:DGROUP cli mov
ss,[real_ss]
mov
sp,[real_sp]
in and out
al, INT_MASK_PORT al, 0 INT_MASK_PORT, al
mov mov mov mov
ax, ds, ss, es,
mov out sti ret
ax,000dh CMOS_PORT,al
DGROUP ax ax ax
ENDP _real_mode PROC
_pause
NEAR
push mov
cx cx,10
push xor
cx cx,cx
loop pop loop
ploop1 cx ploop0
pop ret
cx
ploop0: ploop1:
ENDP
_pause
PROC
_enable_interrupt NEAR sti in and out
ENDP
al, INT_MASK_PORT al, 0fch INT_MASK_PORT, al
ret _enable_interrupt end
6.2. И н тер ф ей с HIMEM.SYS К ак м ы уж е говор и ли , н азн ачен и е д рай вер а H IM E M .S Y S и его возм ож н ости б ы ли п од р об н о оп и сан ы во втор ой части втор ого том а "Б и б л и отеки си стем н ого п р огр ам м и ста" (гл ава 10). П оэтом у зд есь м ы н е б уд ем п од р обн о р ассм атри вать эти ф ун кц и и и говор и ть об и х и сп ол ьзов ан и и , а п ри вед ѐм тол ько кратки й п ер ечен ь: Т аб л и ц а 8. Ф ун кц и и X M S .
00h
П ол учи ть вер си ю X M S (X M S - eXtended Memory Specification - сп ец и ф и кац и я р асш и р ен н ой п ам яти ).
01h
Зап р оси ть уп р авл ен и е об л астью стар ш ей п ам ятью H M A .
02h
О своб од и ть об ласть H M A .
03h
Гл об ал ьн ое р азреш ен и е л и н и и A 20.
04h
Гл об ал ьн ое зап р ещ ен и е л и н и и A 20.
05h
Л окал ьн ое р азр еш ен и е л и н и и A 20.
06h
Л окал ьн ое зап р ещ ен и е ли н и и A 20.
07h
О п р ед ел ен и е текущ его состоян и я л и н и и A 20.
08h
О п р ед ел ен и е р азм ер а своб одн ой р асш и р ен н ой п ам яти .
09h
П ол учи ть б л ок р асш и рен н ой п ам яти E M B .
0Ah
О своб од и ть бл ок E M B .
0Bh
К оп и р ован и е б л оков р асш и р ен н ой п ам яти E M B .
0Ch
Б л оки р ован и е б л ока E M B . Д л я заб л оки р ован н ого E M B м ож н о оп р ед ели ть его ф и зи чески й ад р ес.
0Dh
Р азб л оки р ован и е E M B .
0Eh
П ол учи ть и н ф ор м ац и ю об и н дексе E M B .
0Fh
И зм ен и ть разм ер б л ока E M B .
10h
Зап р оси ть уп р авл ен и е об л астью U M B .
11h
О своб од и ть об ласть U M B .
Д л я п р овер ки н али чи я в си стем е д р ай вер а, п од д ер ж и ваю щ его сп ец и ф и кац и ю X M S , н еобход и м о загр узи ть в р еги стр A X зн ачен и е 4300h и вы звать п р ер ы ван и е IN T 2Fh . Е сл и в р еги стр е A L окаж ется зн ачен и е 80h , д р ай вер устан овл ен . В этом сл учае м ож н о п ол учи ть ад р ес уп р ав л яю щ ей п р огр ам м ы , которую н ад о вы зы вать д л я вы п олн ен и я ф ун кц и й . Е сл и загр узи ть в р еги стр A X зн ачен и е 4310h и вы звать п р ер ы ван и е IN T 2Fh , в реги стр ах E S :B X б уд ет зап и сан и ском ы й ад р ес. К ак м ож н о зам ети ть, ф ун кц и и X M S п озвол яю т уп равл ять л и н и ей A 20 и коп и р овать б л оки р асш и р ен н ой п ам яти . Н о вы н е н ай д ѐте ср ед и н и х ф ун кц и и д л я п ер еход а в защ и щ ѐн н ы й р еж и м ! И это н е случай н о. В сѐ д ел о в том , что д л я р аб оты с р асш и р ен н ой п ам ятью д р ай вер H IM E M .S Y S , р еал и зую щ и й сп ец и ф и кац и ю X M S , н е и сп ользует защ и щ ѐн н ы й р еж и м работы п р оц есор а! К ак это м ож ет б ы ть? В ед ь п р оц ессор , н аход ясь в р еал ьн ом р еж и м е н е м ож ет ад ресовать п ам ять за гр ан и ц ей п ер вого м егаб ай та. С екр ет заклю чается в том , что д л я п р оц ессор а i80 286 д р ай вер H IM E M .S Y S и сп ол ьзует н ед окум ен ти р ован н ую м аш и н н ую ком ан д у LO A D A LL. Э та ком ан д а п р едн азн ачен а д л я тести р ован и я п р оц ессор а и н е п ри вед ен а в д окум ен тац и и н а п р оц ессор i80286 (см . оп и сан и е ком ан д ы LO A D A LL в п р и л ож ен и и ). С п ом ощ ью этой ком ан д ы м ож н о вы п ол н и ть загр узку всех р еги стр ов п р оц ессор а, в том чи сл е и н екотор ы х н ед оступ н ы х п р огр ам м ам . И сп ол ьзуя н естан д ар тн ую загр узку р еги стр ов, д р ай вер H IM E M .S Y S м ож ет ад р есовать р асш и р ен н ую п ам ять, н аход ясь в р еал ьн ом реж и м е. Т акой сп особ ад ресац и и р асш и р ен н ой п ам яти зн ачи тел ьн о ускор яет п р оц есс коп и р ован и я п о ср авн ен и ю с и сп ол ьзован и ем ф ун кц и и 87h п р ер ы ван и я IN T 15h . К р ом е того, во врем я коп и р ован и я ф ун кц и ей 0B h д р ай вер а H IM E M .S Y S п р ер ы ван и я остаю тся р азр еш ѐн н ы м и . П р оц ессор i80386 тож е и м еет н ед окум ен ти р ова н н ую ком ан д у LO A D A LL, котор ая отли чается от и м ею щ ей ся в п р оц ессор е i80286 и код ом , и вы п ол н яем ы м и д ей стви ям и . О д н ако п р оц ессор i8038 6 сп особ ен ад ресовать р асш и р ен н ую п ам ять, н аходясь в р еал ьн ом р еж и м е (п р и соответствую щ ей загрузке си стем н ы х р еги стр ов, кото р ая м ож ет б ы ть вы п ол н ен а с и сп ользован и ем тол ько докум ен ти р ован н ы х ком ан д ). В том , что н а ур овн е и н тер ф ей са H IM E M .S Y S н е и сп ол ьзуется защ и щ ѐн н ы й р еж и м , заклю чен а ещ ѐ одн а п р и чи н а, п о котор ой м ы н е стали п од р об н о р ассм атр и вать этот и н терф ей с в кн и ге, п освя щ ѐн н ой защ и щ ѐн н ом у р еж и м у. И сп ол ьзован и е и н терф ей са H IM E M .S Y S оп р авд ан о в тех случаях, когд а д л я р аб оты ваш ей п р огр ам м ы тр ебуется б уф ер п ам яти б ол ьш ого разм ер а, котор ы й м ож ет бы ть р азм ещ ѐн тол ько в расш и р ен н ой п ам яти . О дн ако п р огр ам м а н е см ож ет н еп осред ствен н о ад р есовать этот б уф ер и вы н уж д ен а вы п ол н ять оп ер ац и ю коп и р ован и я д ан н ы х и з стан дар тн ой п ам яти в р асш и р ен н ую и об р атн о, что вед ѐт к н еп р ои зводи тел ьн ой п отер е вр ем ен и . В п р и л ож ен и и оп и сан а ути ли та M E M O S C O P . Э та ути л и та вы вод и т н а экр ан сп и сок устан овл ен н ы х в си стем е д р ай вер ов д оп ол н и тел ьн ой п ам яти и д оступ н ы х и н терф ей сов с защ и щ ѐн н ы м р еж и м ом . В ф ай л е xm m c.asm
н аход ятся ф ун кц и и д л я раб оты с и н терф ей сом X M S . Э тот ф ай л и сам и ф ун кц и и X M S б ы ли п од р об н о оп и сан ы во втор ом том е "Б и б ли отеки си стем н ого п р ограм м и ста".
6 .3 . И н тер ф ей с E M S /V C P I В о втор ой части втор ого том а "Б и б л и отеки си стем н ого п р огр ам м и ста" (гл ава 11) м ы р ассказы вали вам о д оп ол н и тел ьн ой п ам яти и об и сп ол ьзован и и д л я раб оты с н ей сп ец и ф и кац и и EM S - Expanded Memory Specification. Д р ай вер ы д оп ол н и тел ьн ой п ам яти п р ед оставл яю т п р огр ам м ам и н тер ф ей с п р еры ван и я IN T 67h , котор ы й м ы тогд а п одр об н о оп и сал и . М ы такж е говори л и о том , что д ля ком п ью тер ов н а б азе п р оц ессор ов i80386 и л и i8048 6 сущ ествую т д рай вер ы п ам яти , эм ул и рую щ и е д оп олн и тельн ую п ам ять с и сп ол ьзован и ем р асш и р ен н ой . С ам ы е и звестн ы е д р ай вер ы такого ти п а - E M M 386.S Y S и Q E M M .S Y S . Э ти д р ай вер ы и сп ол ьзую т защ и щ ѐн н ы й (точн ее, ви ртуал ьн ы й ) р еж и м р аб оты п р оц ессор а i80386 и стр ан и чн ую ад р есац и ю р асш и р ен н ой п ам яти . Д л я п р и кл ад н ы х п р ограм м п ред оставл яется и н тер ф ей с, котор ы й н азы вается VCPI - V irtu al P rog ram m C on trol In terface. Э тот и н тер ф ей с реал и зован как п од ф ун кц и и ф ун кц и и D E h п р ер ы ван и я INT 67h: Т аб л и ц а 9. Ф ун кц и и и н тер ф ей са V C P I. П од ф ун кц и я
В ы п ол н яем ы е д ей стви я
00
П р овери ть н ал и чи е в си стем е и н тер ф ей са V C P I.
01
П ол учи ть ад рес точки вход а дл я р аб оты с и н тер ф ей сом V C PI.
02
О п р ед ели ть м акси м ал ьн ы й ф и зи чески й адр ес п ам яти .
03
О п р ед ели ть кол и чество своб од н ы х стр ан и ц п ам яти разм ер ом 4 ки л об ай та.
04
П ол учи ть стр ан и ц у п ам яти .
05
О своб од и ть стран и ц у п ам яти .
06
П ол учи ть ф и зи чески й адр ес стр ан и ц ы п ам яти , расп ол агаю щ ей ся в п р ед ел ах п ер вого м егаб ай та, т.е. в стан д ар тн ой п ам яти .
07
П р очи тать сод ер ж и м ое си стем н ого реги стр а C R 0.
08
П р очи тать сод ер ж и м ое отл адочн ы х р еги стр ов.
09
У стан ови ть отл ад очн ы е р еги стр ы .
0A
П ол учи ть отоб р аж ен и е векторов п р ер ы ван и й , и сп ол ьзуем ы х кон тр ол л ерам и п р ер ы ван и й 8259.
0B
У стан ови ть отоб раж ен и е вектор ов п р ер ы ван и й , и сп ол ьзуем ы х кон тр ол л ер ам и п р ер ы ван и й 8259.
0C
П ер еклю чи ть п р оц ессор и з реал ьн ого в защ и щ ѐн н ы й р еж и м , а такж е и з защ и щ ѐн н ого в ви р туал ьн ы й р еж и м .
П ер ед вы зовом п рер ы ван и я IN T 67h р еги стр A H д олж ен сод ер ж ать D E h , а н ом ер тр еб уем ой п одф ун кц и и д ол ж ен б ы ть загр уж ен в р еги стр A L. К р ом е того, п р еж д е чем вы зы вать п р ер ы ван и е IN T 67h , в сам ом н ачал е р аб оты п р огр ам м ы н еоб ходи м о убед и ться в том , что в си стем е устан овлен д рай вер E M S . О том , как это сд ел ать, м ы р ассказы вал и в главе 11 втор ого том а "Б и б л и отеки си стем н ого п р огр ам м и ста". Т ам ж е п р и вед ѐн соответствую щ и й п ри м ер п р огр ам м ы . Ф ун кц и и V C P I п озвол яю т п еревести п р оц ессор в защ и щ ѐн н ы й и ли ви р туал ьн ы й р еж и м р аб оты и п ред оставл яю т п р огр ам м ам п олн оц ен н ы й д оступ к расш и р ен н ой п ам яти . П оэтом у и сп ол ьзован и е и н тер ф ей са V C P I б ол ее п р ед п очти тел ьн о, чем и н терф ей са д рай вер а H IM E M .S Y S , особ ен н о в тех сл учаях, когда тр еб уется и н тен си вн ая р аб ота с р асш и р ен н ой п ам ятью . Д р угое п ри н ц и п и ал ьн ое н овш ество и н тер ф ей са V C P I - п од д ер ж ка схем ы п р еоб разован и я ад р есов п р оц ессор ов i8038 6/i804 86, а и м ен н о стр ан и чн ой п ам яти . С п ом ощ ью V C P I п р огр ам м а м ож ет л егко п ол учать и освоб ож д ать стр ан и ц ы п ам яти , н е раб отая н еп оср ед ствен н о с си стем н ы м и р еги стр ам и п р оц ессор а. Д р ай вер ы E M M 386 и Q E M M об есп ечи ваю т д л я п р ограм м D O S и н тер ф ей с V C P I и сам и п ол ьзую тся эти м и н тер ф ей сом . В ы зн аете, что в п р ед ел ах п ер вого м егабай та ад р есн ого п р остр ан ства и м еется 640 ки л об ай т п ам яти . О стал ьн ая п ам ять и сп ол ьзуется ви д еоад ап тер ам и , П ЗУ B IO S и др угой ап п аратур ой . В ся эта п ам ять
н азы вается зарезер ви р ован н ой п ам ятью . Зар езерви р ован н ая п ам ять зад ей ствован а н е п ол н остью , в н ей есть окн а. С тр ан и ц ы п ам яти , соответствую щ и е своб одн ы м окн ам , с и сп ол ьзован и ем м ехан и зм а тр ан сл яц и и стр ан и ц отоб р аж аю тся в ад ресн ое п р остр ан ство за п р ед ел ам и п ервого м егаб ай та п ам яти , т.е. н а расш и р ен н ую п ам ять. П р и этом д л я п р ограм м D O S п оявл яется возм ож н ость восп ол ьзоваться окн ам и зар езерви р ован н ой п ам яти д л я р азм ещ ен и я там д р ай вер ов и р ези д ен тн ы х п р огр ам м . П р оц ессор п р и этом раб отает, р азум еется, н е в р еал ьн ом р еж и м е, а в ви р туал ьн ом , т.к. в р еал ьн ом реж и м е тр ан сл яц и я стр ан и ц н е и сп ол ьзуется. Р ассм отр и м ф ун кц и и и н тер ф ей са V C PI б ол ее п од р обн о.
П р о вер ка н ал и ч и я в си стем е и н тер ф ей са V C P I Регистры на входе: AX 0DE00h Регистры на выходе: AH равен 00h - если VCPI установлен, не равен 00h - если VCPI не установлен. BH Верхний (major) номер версии VCPI. BL Нижний (minor) номер версии VCPI.
П о л уч и ть ад р ес и н тер ф ей са V C P I Регистры на входе: AX 0DE01h ES:DI Адрес буфера размером в 4 килобайта для таблицы страниц. DS:SI Адрес GDT, состоящей из трѐх элементов, в первый будет записан дескриптор сегмента кода, остальные два будут использованы драйвером VCPI. Регистры на выходе: AH равен 00h - успешное выполнение функции, не равен 00h - ошибка. DI Номер первого свободного элемента в таблице страниц, которая размещена в заказанном ранее буфере. EBX Смещение в сегменте кода точки входа в защищѐнный режим.
О п р ед ел и ть м акси м ал ьн ы й ф и зи ч ески й ад р ес п ам яти Регистры на входе: AX 0DE02h Регистры на выходе: AH равен 00h - успешное выполнение функции, не равен 00h - ошибка. EDX Максимальный физический адрес страницы памяти размером 4 килобайта.
О п р ед ел и ть ко л и ч ество св о б о д н ы х стр ан и ц п ам я ти Регистры на входе: AX 0DE03h Регистры на выходе: AH равен 00h - успешное выполнение функции, не равен 00h - ошибка. EDX Количество свободных страниц памяти, доступных для всех задач в системе. Э та ф ун кц и я д оступ н а в защ и щ ѐн н ом р еж и м е чер ез вы зов д р ай вер а в его и н терф ей сн ой точке, ад р ес котор ой м ож н о п ол учи ть с п ом ощ ью ф ун кц и и 01h .
П о л уч и ть стр ан и ц у п ам я ти Регистры на входе: AX 0DE04h Регистры на выходе: AH равен 00h - успешное выполнение функции, не равен 00h - ошибка. EDX Физический адрес полученной страницы памяти. П р огр ам м а, и сп ол ьзую щ ая эту ф ун кц и ю , п ер ед завер ш ен и ем своей р аб оты д ол ж н а освоб од и ть все п ол учен н ы е стр ан и ц ы п ам яти . Э та ф ун кц и я д оступ н а в защ и щ ѐн н ом р еж и м е через вы зов д р ай вер а в его и н тер ф ей сн ой точке.
О сво б о д и ть стр ан и ц у п ам яти Регистры на входе: AX 0DE05h EDX Физический адрес освобождаемой страницы памяти. Регистры на выходе: AH равен 00h - успешное выполнение функции, не равен 00h - ошибка. Э та ф ун кц и я д оступ н а в защ и щ ѐн н ом р еж и м е через вы зов д р ай вер а в его и н тер ф ей сн ой точке.
П о л уч и ть ф и зи ч ески й ад р ес стр ан и ц ы п ам яти , р асп о л агаю щ ей ся в п р ед ел ах п ер во го м егаб ай та Регистры на входе: AX 0DE06h CX Номер страницы, равен линейному адресу страницы, сдвинутому вправо на 12 бит. Регистры на выходе: AH равен 00h - успешное выполнение функции, не равен 00h - неправильный номер страницы. EDX Физческий адрес страницы.
П р о ч и тать со д ер ж и м о е си стем н о го р еги стр а C R 0 Регистры на входе: AX 0DE07h Регистры на выходе: AH 00h EBX Значение системного регистра CR0.
П р о ч и тать со д ер ж и м о е о тл ад о ч н ы х р еги стр о в Регистры на входе: AX 0DE08h ES:DI Адрес буфера размером 8 двойных слов. Регистры на выходе: AH 00h EBX Значение системного регистра CR0. В б уф ер е р асп ол агается сод ер ж и м ое отл ед очн ы х р еги стр ов в сл ед ую щ ем п ор яд ке: D R 0, D R 1, D R 3, D R 4, D R 5, D R 6, D R 7. Р еги стр ы D R 4 и D R 5 зар езер ви р ован ы и в п р оц ессор е i80386 н е и сп ол ьзую тся.
У стан о в и ть о тл ад о ч н ы е р еги стр ы Регистры на входе: AX 0DE09h ES:DI Адрес буфера размером 8 двойных слов, содержащего новые значения для отладочных регистров. Регистры на выходе: AH 00h EBX Значение системного регистра CR0. Зн ачен и я, п од готовл ен н ы е д ля зар езер ви р ован н ы х р еги стров D R 4 и D R 5, и гн ори р ую тся.
П о л уч и ть о то б р аж ен и е векто р о в п р ер ы ван и й д л я ко н тр о л л ер о в п р ер ы ван и й 8 2 5 9 Регистры на входе: AX 0DE0Ah Регистры на выходе: AH равен 00h - успешное выполнение функции, не равен 00h - ошибка. BX Вектор прерывания, используемый для IRQ0. CX Вектор прерывания, используемый для IRQ8.
У стан о в и ть о то б р аж ен и е век то р о в п р ер ы ван и й д л я ко н тр о л л ер о в п р ер ы ван и й 8 2 5 9 Регистры на входе: AX 0DE0Bh BX Вектор прерывания, используемый для IRQ0. CX Вектор прерывания, используемый для IRQ8. Регистры на выходе: AH равен 00h - успешное выполнение функции, не равен 00h - ошибка. П осл е вы п ол н ен и я этой ф ун кц и и п р ер ы ван и я зап р ещ ен ы . П ер ед завер ш ен и ем своей р аб оты п р огр ам м а д ол ж н а устан ови ть п р еж н ее ото б р аж ен и е вектор ов д л я кон тр ол л еров п р ер ы ван и й .
П ер екл ю ч и ть п р о ц ессо р в защ и щ ѐн н ы й р еж и м Регистры на входе: AX 0DE0Ch ESI Линейный адрес массива значений для системных регистров, массив должен располагаться в первом мегабайте памяти. Регистры на выходе: Загружаются регистры GDTR, IDTR, LDTR, TR. В стеке, на который указывают регистры SS:ESP, необходимо отвести по крайней мере 16 байт для возможности обработки прерываний. С од ер ж и м ое р еги стр ов E A X , E S I, D S , E S , FS , G S п осл е вы п олн ен и я ф ун кц и и буд ет п отер ян о. П ер ед вы зовом ф ун кц и и п реры ван и я д ол ж н ы б ы ть зап р ещ ен ы . П осл е вы п олн ен и я п ер екл ю чен и я в защ и щ ѐн н ы й р еж и м п р ер ы ван и я такж е зап р ещ ен ы . П р и вед ѐм ф ор м ат об л асти д ля загрузки си стем н ы х р еги стров п ер ед п ер еход ом в защ и щ ѐн н ы й реж и м : Т аб л и ц а 10. Ф ор м ат буф ера дл я загрузки р еги стр ов и п ер еход а в защ и щ ѐн н ы й р еж и м ср ед ствам и V C P I.
С м ещ ен и е
Р азм ер и н азн ачен и е
00h
D W O R D , зн ачен и е д л я реги стр а C R 3.
04h
D W O R D , л и н ей н ы й ад р ес в п ред ел ах п ервого м егабай та д л я загр узки р еги стра G D T R .
08h
D W O R D , л и н ей н ы й ад р ес в п ред ел ах п ервого м егабай та д л я загр узки р еги стра ID T R .
0Ch
W O R D , зн ачен и е д л я р еги стра LD T R .
0Eh
W O R D , зн ачен и е д л я р еги стра T R .
10h
P W O R D , зн ачен и е ад р еса C S :E IP точки вход а в защ и щ ѐн н ы й р еж и м .
П ер екл ю ч и ть п р о ц ессо р в ви р туал ьн ы й р еж и м Э то п ер екл ю чен и е м ож н о вы п ол н и ть, есл и н аход ясь в защ и щ ѐн н ом р еж и м е вы звать точку и н терф ей са V C P I с р еги стр ам и , загр уж ен н ы м и след ую щ и м об разом :
AX DS SS:ESP
DE0Ch Селектор, полученный от функции DE01h. Стек должен быть расположен в пределах первого мегабайта памяти
П р и м ер п р о гр ам м ы П р и вед ѐм п ри м ер п р ограм м ы , оп р ед ел яю щ ей п р и сустви е в си стем е д р ай вера д оп ол н и тельн ой п ам яти X M M . Е сл и этот д р ай вер п ри сутствует, п р огр ам м а п р овер яет п од д ерж ку эти м д р ай вер ом и н терф ей са V C P I. Затем , есл и и н тер ф ей с V C PI п од д ер ж и вается, п р огр ам м а вы вод и т его вер си ю н а экран .
Листинг 19. Определение версии VCPI Файл vcpi.c ----------------------------------------------------------#include <stdio.h> #include <dos.h> void main(void) { unsigned err; char ver, ver_hi, ver_lo; clrscr(); printf("Virtual Control Program Interface Demo, © Frolov A.V., 1992\n\r" "------------------------------------------------------------\n\r\n\r"); // Проверяем наличие драйвера EMS/VCPI if(ems_init()) { printf("Драйвер EMS/VCPI не загружен."); exit(-1); } printf("Драйвер EMS/VCPI загружен"); // Выводим номер версии драйвера if((err = ems_ver(&ver)) != 0) { printf("\nОшибка %02.2X при определении версии EMM", err); exit(-1); } printf("\nВерсия EMM: %02.2X", ver);
// Определяем присутствие VCPI и его версию if(vcpi_ver(&ver_hi, &ver_lo) != 0) { printf("\nДрайвер EMM не поддерживает VCPI\n"); exit(-1); } printf("\nВерсия VCPI: %02.2X.%02.2X", ver_hi, ver_lo); } /** *.Name *.Title * *.Descr * *.Proto * *.Params * *.Return * * *.Sample **/
ems_init Функция проверяет установку драйвера EMS Эта функция проверяет наличие драйвера EMS int ems_init(void); Не используются 0 - драйвер EMS установлен; 1 - драйвер EMS не установлен. ems_test.c
int ems_init(void) { void (_interrupt _far *EMS_driver_adr)(void); char _far *EMS_driver_name; char test_name[8]; int i; EMS_driver_adr = _dos_getvect(0x67); FP_SEG(EMS_driver_name) = FP_SEG (EMS_driver_adr); FP_OFF(EMS_driver_name) = 10; for(i=0; i<8; i++) test_name[i] = EMS_driver_name[i]; if(strncmp(test_name, "EMMXXXX0", 8) == 0) return(0); else return(1); } /** *.Name *.Title * *.Descr * * *.Proto * *.Params * * *.Return * *.Sample **/
ems_ver Определение версии драйвера EMS Эта функция возвращает номер версии драйвера EMS в двоично-десятичном формате. int ems_ver(char *ver); char *ver - указатель на байт, в который будет записан номер версии. Номер версии драйвера EMS в формате BCD ems_test.c
int ems_ver(char *ver) {
union REGS reg; reg.x.ax = 0x4600; int86(0x67, ®, ®); *ver = reg.h.al; return(reg.h.ah); } int vcpi_ver(char *ver_hi, char *ver_lo) { union REGS reg; reg.x.ax = 0xDE00; int86(0x67, ®, ®); *ver_hi = reg.h.bh; *ver_lo = reg.h.bl; return(reg.h.ah);
6.4. И н тер ф ей с DPMI Д л я созд ан и я п р огр ам м , р аб отаю щ и х в защ и щ ѐн н ом реж и м е, ф и р м ы Microsoft, Intel, IBM, Lotus, Phar Lap, Rational Systems, Borland, Quarterdeck р азр аб отал и и н терф ей с с защ и щ ѐн н ы м р еж и м ом - DPMI (DOS Protected Mode Interface). П ол ьзуясь эти м и н тер ф ей сом , п р огр ам м ы , стар тую щ и е как об ы чн ы е D O S -п р огр ам м ы р еал ьн ого р еж и м а, м огут п ер екл ю чи ться в защ и щ ѐн н ы й реж и м и р аб отать с р асш и р ен н ой и ли д аж е ви ртуал ьн ой п ам ятью . И н терф ей с D P M I об есп ечи вается сп ец и ал ьн ой п р ограм м ой , н азы ваем ой сер вер ом D P M I. С ер вер ом м ож ет б ы ть отд ел ьн ая р ези д ен тн ая п р ограм м а, ли б о ср ед ства д л я п одд ер ж ки D P M I м огут вх оди ть в состав оп ер ац и он н ой си стем ы (н ап р и м ер , W IN D O W S и O S /2 вер си и 2.0 п озвол яю т р аб отаю щ и м п од и х уп р авл ен и ем D O S -п р ограм м ам и сп ол ьзовать и н терф ей с D P M I). В этом р азд ел е м ы кратко оп и ш ем ф ун кц и и D P M I, а в р азд ел е, п освящ ен н ом ви р туал ьн ой м аш и н е W IN D O W S , п р и вед ѐм п ри м ер п р огр ам м ы , р аб отаю щ ей в защ и щ ѐн н ом реж и м е с и сп ол ьзован и ем ф ун кц и й D P M I сп ец и ф и кац и и 0.9. С п ец и ф и кац и я D P M I вер си и 0.9 п од д ер ж и вается оп ерац и он н ой си стем ой W IN D O W S вер си й 3.0 и 3.1, р аб отаю щ ей в р асш и р ен н ом р еж и м е н а п р оц ессор ах i80386 и л и i80486. В се ф ун кц и и D P M I р еали зован ы в рам ках п р ер ы ван и я IN T 31h , об р аб отчи ком этого п р еры ван и я явл яется сер вер D P M I. П р еж д е чем и сп ол ьзовать ф ун кц и и D P M I, п р огр ам м а с п ом ощ ью оп и сан н ы х н и ж е ф ун кц и й п р еры ван и й INT 2Fh д ол ж н а уб ед и ться в п ри сутстви и п од д ерж ки D P M I, п ол учи ть ад р ес п р оц ед ур ы п ер екл ю чен и я в защ и щ ѐн н ы й р еж и м и вы п ол н и ть это п ерекл ю чен и е. П р огр ам м а д ол ж н а вы зы вать п р ер ы ван и е IN T 31h п осл е п ер екл ю чен и я в защ и щ ѐн н ы й р еж и м , в р еал ьн ом р еж и м е это п р еры ван и е вы зы вать н ел ьзя.
П о л уч и ть ад р ес п ер ехо д а в защ и щ ѐн н ы й р еж и м С п ом ощ ью этой ф ун кц и и п рогр ам м а м ож ет оп р ед ели ть н ал и чи е в си стем е и н тер ф ей са D P M I и п олучи ть ад р ес п р оц ед ур ы п ер еход а в защ и щ ѐн н ы й р еж и м р аб оты . Д л я вы зова этой ф ун кц и и н еоб ход и м о и сп ол ьзовать п р ер ы ван и е IN T 2Fh , загр узи в р еги стр A X сл ед ую щ и м об р азом :
Регистры на входе: AX 1687h Е сл и ф ун кц и я б ы л а усп еш н о вы п ол н ен а, в р еги стры б уд ут зап и сан ы сл ед ую щ и е зн ачен и я:
Регистры на выходе: AX 00h BX Если установлен бит 0, данная реализация DPMI поддерживает работу с 32-разрядными программами.
CL
Тип процессора: 02h = 80286 03h = 80386 04h = 80486 DH Верхний (major) номер версии используемой спецификации DPMI. DL Нижний (minor) номер версии используемой спецификации DPMI. SI Количество параграфов памяти, требуемых для личной области данных сервера DPMI. Программа должна заказать эту память у операционной системы перед переходом в защищѐнный режим. ES:DI Адрес процедуры, которую необходимо вызвать для входа в защищѐнный режим. Е сл и вы п ол н ен и е ф ун кц и и закон чи л ось с ош и б кой , сод ерж и м ое р еги стра A X н е р авн о н улю .
В хо д в защ и щ ѐн н ы й р еж и м П осл е того, как п р огр ам м а п ол учи л а ад р ес п р оц ед ур ы д л я вход а в защ и щ ѐн н ы й р еж и м , он а м ож ет вы звать эту п р оц ед ур у п р и п ом ощ и ком а н д ы C A LL. П еред вы зовом н еобход и м о загр узи ть р еги стры :
Регистры на входе: AX Разрядность программы. Если программа является 32-разрядной, в регистре AX необходимо установить бит 0 в единицу. ES В этот регистр необходимо загрузить сегментный адрес буфера, который будет использован сервером DPMI. Размер буфера должен быть определѐн при помощи предыдущей функции (регистр SI). П осл е загр узки р еги стр ов н еоб ход и м о вы п ол н и ть вы зов п роц ед ур ы с ад ресом , котор ы й б ы л п ол учен в р еги ст р ах E S :D I п осл е вы зова п р ед ы д ущ ей ф ун кц и и . Е сл и ф ун кц и я вы п ол н и л ась усп еш н о, ф лаг C A R R Y сб р ош ен и п р огр ам м а вы п олн яется в защ и щ ѐн н ом р еж и м е.
Регистры на выходе CS Селектор, которому соответствует базовый адрес сегмента кода программы и предел 64 килобайта. SS Селектор для сегмента стека, базовый адрес соответствует стеку реального режима, предел - 64 килобайта. DS Селектор, соответствующий сегменту данных реального режима, предел - 64 килобайта. ES Селектор, указывающий на PSP программы с пределом 100h байт. FS, GS 0 (если программа работает на процессоре i80386 или i80486). ESP Если программа работает в 32-разрядном режиме, старшее слово регистра ESP будет равно 0. О стал ьн ы е реги стр ы н е и зм ен яю тся. Е сл и ф ун кц и я вы п олн и л ась с ош и б кой , ф л аг C A R R Y устан авли вается в ед и н и ц у и п р огр ам м а п р од ол ж ает вы п олн ен и е в реал ьн ом р еж и м е. П осл е вход а в защ и щ ѐн н ы й р еж и м вам стан ови тся д оступ ен и н тер ф ей с D P M I чер ез ф ун кц и и п р еры ван и я INT 31h. Д л я завер ш ен и я своей раб оты п р огр ам м а, и сп ол ьзую щ ая D P M I, д ол ж н а вы д ать п р ер ы ван и е IN T 21h (ф ун кц и я 4Ch) - это обы чн ы й сп особ завер ш ен и я п р огр ам м , р аб отаю щ и х в ср ед е M S -DOS. П р и вед ѐм ф р агм ен т п р ограм м ы , и сп ол ьзую щ ей D P M I. Н а п ри м ер е этого ф р агм ен та м ы п окаж ем , как уб еди ться в том , что в си стем е и м еется и н тер ф ей с D P M I, как вой ти в защ и щ ѐн н ы й р еж и м и завер ш и ть р аб оту п р огр ам м ы .
; Получаем адрес точки входа в защищѐнный режим mov
ax, 1687h
int test jnz
2Fh ax, ax Cant_Enter_PMode ; не можем войти в защищѐнный режим
mov mov
[PMode_Entry_Seg], es [PMode_Entry_Off], di
; Заказываем память для сервера DPMI (если это требуется) test jz mov mov int jc mov
si, si Enter_PMode_Now bx, si ah, 48h 21h Cant_Enter_PMode es, ax
; Устанавливаем защищѐнный режим Enter_PMode_Now: xor ax, ax call DWORD PTR [PMode_Entry_Off] jc Cant_Enter_PMode ; Программа работает в защиѐнном режиме. ; ;
Здесь располагаются строки вашей программы.
; Завершение программы и возврат в DOS mov int
ax, 4C00h 21h
О п р ед ел ен и е текущ его р еж и м а р аб о ты Е сл и ваш а п р ограм м а м ож ет р аб отать и в р еал ьн ом р еж и м е и в защ и щ ѐн н ом , с п ом ощ ью этой ф ун кц и и вы м ож ете оп ред ел и ть текущ и й реж и м р аб оты . Д л я вы п ол н ен и я ф ун кц и и н еоб ход и м о вы звать п р ер ы ван и е IN T 2Fh , п ред вари тел ьн о загрузи в р еги стр A X :
Регистры на входе: AX 1686h Регистры на выходе: AX 0, если программа работает в защищѐнном режиме под управлением DPMI, не равно 0, если программа работает в реальном или виртуальном режиме.
С о зд ать д ескр и п то р в таб л и ц е LD T С п ом ощ ью этой ф ун кц и и п рогр ам м а м ож ет созд ать од и н и л и н ескол ько д ескри п тор ов в LD T , п р и н ад л еж ащ ей зад аче, в рам ках котор ой р аботает п р огр ам м а, т.е. д л я своей зад ачи . В ся р аб ота п о и н и ц и али зац и и п ол учен н ы х д ескр и п тор ов д ол ж н а вы п олн яться сам ой п р огр ам м ой , д л я чего в и н тер ф ей се D P M I и м ею тся соответствую щ и е ф ун кц и и .
Регистры на входе: AX 0000h CX Количество создаваемых дескрипторов. Регистры на выходе:
CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. AX Базовый селектор. Е сл и п р огр ам м а заказы вала н ескол ько сел ектор ов, A X сод ер ж и т п ервы й сел ектор и з созд ан н ого м асси ва. Д л я п ол учен и я остал ьн ы х сел ектор ов н еобход и м о восп ол ьзоваться ф ун кц и ей 00003h .
О сво б о д и ть д еск р и п то р в таб л и ц е LD T Ф ун кц и я и сп ол ьзуется д л я освоб ож д ен и я дескр и п тор ов, созд ан н ы х в LD T п р ед ы д ущ ей ф ун кц и ей .
Регистры на входе AX 0001h BX Селектор освобождаемого дескриптора. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. Д л я освоб ож д ен и я м асси ва д ескр и п тор ов ф ун кц и ю н еобход и м о вы зы вать отд ел ьн о д л я каж д ого д ескр и п тор а.
П р ео б р азо в ан и е сегм ен та в д еск р и п то р Ф ун кц и я и сп ол ьзуется д л я п реоб р азован и я сегм ен тн ой ком п он ен ты ад р еса р еал ьн ого р еж и м а в д ескр и п тор .
Регистры на входе AX 0002h BX Сегментный адрес реального режима. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. AX Селектор, соответствующий дескриптору, созданному для адресации сегмента реального режима. Д ескр и п тор , созд ан н ы й д ан н ой ф ун кц и ей , н е м ож ет б ы ть освоб ож д ѐн , п оэтом у эту ф ун кц и ю и м еет см ы сл и сп ол ьзовать д л я ад р есац и и таки х об л астей п ам яти , котор ы е б уд ут н уж н ы н а всѐм п р отяж ен и и р аб оты п р огр ам м ы (об л асть д ан н ы х B IO S , п ам ять ви д еокон тр ол л ера и т.д.).
П о л уч и ть зн ач ен и е и н кр ем ен та д л я в ы ч и сл ен и я сл ед ую щ его сел екто р а в м асси ве Е сл и вы созд ал и н ескол ько дескр и п тор ов в LD T п р и п ом ощ и ф ун кц и и 0000h , то этой ф ун кц и ей буд ет возвр ащ ѐн тол ько п ервы й сел ектор, соответствую щ и й п ер вом у д ескр и п тор у в созд ан н ом м а сси ве. Д л я вы чи сл ен и я остал ьн ы х сел ектор ов ваш а п р огр ам м а д олж н а и сп ол ьзовать ф ун кц и ю 0003h . Э та ф ун кц и я возвр ащ ает зн ачен и е, котор ое вы б уд ете п р и б авл ять к б азовом у сел ектор у д л я вы чи сл ен и я остал ьн ы х сел ектор ов в м асси ве.
Регистры на входе AX 0003h Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. AX Значение для инкремента базового селектора.
З ар езер ви р о ван н ы е ф ун кц и и Ф ун кц и и 0004h и 0005h в сп ец и ф и кац и и D P M I вер си и 0.9 зар езер ви р ован ы и н е д ол ж н ы вы зы ваться и з ваш ей п р огр ам м ы .
П о л уч и ть б азо в ы й ад р ес сегм ен та
С п ом ощ ью этой ф ун кц и и ваш а п р огр ам м а м ож ет оп редел и ть 32 -р азр яд н ы й б азовы й ад р ес сегм ен та п о его сел ектор у.
Регистры на входе AX 0006h BX Селектор сегмента, для которого требуется получить базовый адрес. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. CX:DX 32-разрядный базовый адрес сегмента.
У стан о в и ть б азо вы й ад р ес сегм ен та Э та ф ун кц и я устан авл и вает базовы й ад р ес сегм ен та в д ескр и п тор е, соответствую щ ем зад ан н ом у сел ектор у. В ы м ож ете м од и ф и ц и р овать тол ько те д ескри п тор ы , которы е созд ал а ваш а п р огр ам м а.
Регистры на входе AX 0007h BX Селектор сегмента, для которого требуется установить базовый адрес. CX:DX Устанавливаемый 32-разрядный линейный базовый адрес сегмента. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
У стан о в и ть п р ед ел сегм ен та Э та ф ун кц и я устан авли вает п р ед е л сегм ен та в д ескри п тор е, соответствую щ ем зад ан н ом у сел ектор у.
Регистры на входе AX 0008h BX Селектор сегмента, для которого требуется установить новое значение предела. CX:DX Устанавливаемое 32-разрядное значение предела сегмента. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
У стан о в и ть п о л е п р ав д о ступ а в д ескр и п то р е П р и п ом ощ и этой ф ун кц и и вы м ож ете м од и ф и ц и р оать п ол е п рав д оступ а в д ескри п тор е, созд ан н ого ваш ей п р огр ам м ой .
Регистры на входе AX 0009h BX Селектор сегмента, для которого требуется установить новые права доступа. CL Байт прав доступа. CH Расширение байта прав доступа для процессора i80386/i80486, используется только 32-разрядными реализациями DPMI. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. В р асш и р ен и и б ай та п р ав д оступ а стар ш и й би т (би т 7) - би т гр ан ул ярн ости , котор ы й оп ред ел яет и н тер п ретац и ю п ол я п р ед ел а (0 - п р ед ел в бай тах, 1 - п р ед ел в стр ан и ц ах). Б и т 6 указы вает р еж и м р аботы п р оц ессор а (0 - 16р азр яд н ы й , 1 - 32-р азр яд н ы й ). Б и т 5 и 2 -3 д ол ж н ы б ы ть р авн ы 0. Б и т 4 м ож ет сод ер ж ать л ю б ое зн ачен и е.
С о зд ан и е ал и асн о го д ескр и п то р а д л я сегм ен та ко д а
Т ак как в защ и щ ѐн н ом р еж и м е м од и ф и кац и я сегм ен та код а с и сп ол ьзован и ем сел ектор а C S н евозм ож н а, д л я р еш ен и я такой зад ачи н еобход и м о созд ать д ескри п тор сегм ен та д ан н ы х, которы й б ы указы вал н а сегм ен т код а (т.е. и м ел б ы такой ж е б азовы й ад р ес и п р ед ел). Т ако й д ескр и п тор явл яется ал и асом д ескр и п тор у сегм ен та код а и м ож ет б ы ть созд ан п ри п ом ощ и ф ун кц и и 000A h . Е сл и ал и ас б ол ьш е н е н уж ен , он м ож ет б ы ть ун и чтож ен п ри п ом ощ и ф ун кц и и 0001h .
Регистры на входе AX 000Ah BX Селектор сегмента кода, для которого требуется создать алиас. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
П о л уч и ть д ескр и п то р С п ом ощ ью этой ф ун кц и и п р огр ам м а м ож ет скоп и р овать в б уф ер р азм ер ом 8 б ай т д ескри п тор , соответствую щ и й зад ан н ом у селектору.
Регистры на входе AX 000Bh BX Селектор сегмента, для которого требуется получить дескриптор. ES:(E)DI Указатель на буфер размером 8 байт, в который будет скопирован дескриптор. Для 32-разрядных программ необходимо использовать регистр EDI. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
У стан о в и ть д еск р и п то р Ф ун кц и я вы п олн яет д ей стви я, об р атн ы е п р ед ы д ущ ей - коп и р ует сод ерж и м ое 8 -б ай тового б уф ер а в д ескр и п тор, зад ан н ы й сел ектор ом .
Регистры на входе AX 000Ch BX Селектор сегмента, для которого требуется установить дескриптор. ES:(E)DI Указатель на буфер размером 8 байт, из которого будет взята информация для установки дескриптора. Для 32-разрядных программ необходимо использовать регистр EDI. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. П р огр ам м а м ож ет м оди ф и ц и р овать тол ько д ескр и п тор ы и з своей л окал ьн ой таб л и ц ы LD T , созд ан н ы е там с п ом ощ ью ф ун кц и и 0000h .
П о л уч и ть к о н кр етн ы й д ескр и п то р в таб л и ц е LD T Ф ун кц и я п озвол яет п ол учи ть д ескр и п тор п о его сел ектор у.
Регистры на входе AX 000Dh BX Селектор сегмента, для которого требуется получить дескриптор. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
Д л я этой ф ун кц и и сер вер D P M I р езер ви р ует п ер вы е 16 д ескр и п тор ов в таб ли ц е LD T . П р ограм м а м ож ет освоб од и ть п олучен н ы е с п ом ощ ью этой ф ун кц и и д ескри п тор в п р и п ом ощ и ф ун кц и и 0001h .
П о л уч и ть б л о к п ам я ти и з п ул а св о б о д н о й п ам я ти D O S С п ом ощ ью этой ф ун кц и и п р огр ам м а м ож ет п ол учи ть от D O S б л ок п ам яти , л еж ащ и й в п р ед ел ах п ер вого м егаб ай та ад ресн ого п р остран ства. Д л я п ол учен н ого блока п ам яти ф ун кц и я созд аѐт од и н и л и н ескол ько д ескр и п тор ов (в зави си м ости от р азм ер а бл ока) и возвр ащ ает как сегм ен т б л ока д л я р еал ьн ого р еж и м а, так и б азовы й сел ектор д л я д оступ а к б л оку в защ и щ ѐн н ом р еж и м е. Е сл и р азм ер зап р ош ен н ого бл ока п р евы ш ает 64 ки л об ай та, ф ун кц и я созд аст м асси в дескр и п тор ов и возвр ати т б азовы й сел ектор . Д л я п олучен и я остал ьн ы х сел ектор ов вы см ож ете и сп ол ьзовать зн ачен и е и н кр ем ен та, п ол учен н ое п осл е вы зова ф ун кц и и 0003h . Д ескр и п тор ы , созд ан н ы е этой ф ун кц и ей , м ож н о освоб ож д ать тол ько с п ом ощ ью ф ун кц и и 0101h .
Регистры на входе AX 0100h BX Размер блока в параграфах (напомним, что размер параграфа составляет 16 байт). Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. В случае ошибки регистр AX содержит код ошибки, полученный от DOS: 07h - разрушен блок MCB; 08h - слишком большой размер заказанного блока. В последнем случае регистр BX содержит максимально возможный размер блока в параграфах. AX Сегмент реального режима полученного блока. DX Селектор для доступа к полученному блоку в защищѐнном режиме.
О сво б о д и ть б л о к п ам яти , взяты й и з п ул а D O S Ф ун кц и я п р ед н азн ачен а д л я освоб ож д ен и я п ам яти , п ол учен н ой п ри п ом ощ и п р ед ы д ущ ей ф ун кц и и .
Регистры на входе AX 0101h DX Селектор освобождаемого блока. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. В случае ошибки регистр AX содержит код ошибки, полученный от DOS: 07h - разрушен блок MCB; 09h - неправильное задание сегментного адреса освобождаемого блока памяти.
И зм ен и ть р азм ер б л о ка п ам я ти , п о л уч ен н о го и з п ул а D O S С п ом ощ ью этой ф ун кц и и п р огр ам м а м ож ет увели чи ть и л и ум ен ьш и ть разм ер б л ока п ам яти , п ол учен н ого ф ун кц и ей 0100h .
Регистры на входе AX 0102h BX Новый размер блока памяти в параграфах. DX Селектор модифицируемого блока. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
В случае ошибки регистр AX содержит код ошибки, полученный от DOS: 07h - разрушен блок MCB; 08h - слишком большой размер заказанного блока. В этом случае регистр BX содержит максимально возможный размер блока в параграфах. 09h - неправильное задание сегментного адреса модифицируемого блока памяти.
П о л уч и ть векто р п р ер ы ван и я р еал ьн о го р еж и м а Ф ун кц и я возвр ащ ает д л я зад ан н ого вектор а п рер ы ван и я адр ес его об раб отчи ка в ф ор м ате р еал ьн ого р ж и м а.
Регистры на входе AX 0200h BL Номер прерывания. Регистры на выходе: CARRY 0 CX:DX Адрес обработчика прерывания в формате <сегмент:смещение>.
У стан о в и ть векто р п р ер ы ван и я р еал ьн о го р еж и м а Ф ун кц и я п озвол яет задать д ля л ю б ого вектора п р ер ы ван и я ад р ес об р аб отчи ка в ф ор м ате р еал ьн ого р еж и м а.
Регистры на входе AX 0201h BL Номер прерывания. CX:DX Адрес обработчика прерывания в формате <сегмент:смещение>. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
П о л уч и ть ад р ес о б р аб о тч и ка и ск л ю ч ен и я с зад ан н ы м н о м ер о м Ф ун кц и я возвр ащ ает ад р ес текущ его об раб отчи ка и скл ю чен и я с зад ан н ы м н ом ер ом в ф ор м ате защ и щ ѐн н ого р еж и м а.
Регистры на входе AX 0202h BL Номер исключения (00h - 1Fh). Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. CX:(E)DX Адрес обработчика исключения в формате <селектор:смещение>.
У стан о в и ть ад р ес о б р аб о тч и к а и скл ю ч ен и я с зад ан н ы м н о м ер о м Ф ун кц и я м ож ет б ы ть и сп ол ьзован а д л я устан овки соб ствен н ого об раб отчи ка и склю чен и й .
Регистры на входе AX 0203h BL Номер исключения (00h - 1Fh). CX:(E)DX Адрес обработчика исключения в формате <селектор:смещение>. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
П о л уч и ть векто р п р ер ы ван и я защ и щ ѐн н о го р еж и м а Ф ун кц и я во звр ащ ает ад р ес обр аб отчи ка зад ан н ого п р ер ы ван и я в ф ор м ате защ и щ ѐн н ого р еж и м а.
Регистры на входе AX 0204h BL Номер прерывания. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. CX:(E)DX Адрес обработчика прерывания в формате <селектор:смещение>.
У стан о в и ть векто р п р ер ы ван и я защ и щ ѐн н о го р еж и м а С п ом ощ ью этой ф ун кц и и п р огр ам м а м ож ет устан ови ть соб ствен н ы й обр аб отчи к защ и щ ѐн н ого р еж и м а д л я л ю б ого п р ер ы ван и я.
Регистры на входе AX 0205h BL Номер прерывания. CX:(E)DX Адрес обработчика прерывания в формате <селектор:смещение>. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
Э м ул яц и я п р ер ы ван и я р еал ьн о го р еж и м а Э та ф ун кц и я п р едн азн ачен а д л я эм ул яц и и вы п ол н ен и я п р ер ы ван и я в р еал ьн ом р еж и м е. С еѐ п ом ощ ью вы см ож ете н аход ясь в защ и щ ѐн н ом р еж и м е об ращ аться к ф ун кц и ям B IO S , D O S и к д р уги м п р еры ван и ям р еал ьн ого р еж и м а.
Регистры на входе AX 0300h BL Номер прерывания. BH Байт флагов. Если установлен в единицу бит 0, выполняется сброс контроллера и линии A20. Остальные биты зарезервированы и должны быть сброшены в нуль. CX Количество слов, которые должны быть скопированы из стека защищѐнного режима в стек реального режима. ES:(E)DI Адрес управляющей структуры для вызова прерывания. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. ES:(E)DI Адрес модифицированной (в результате выполнения обработчика прерывания) управляющей структуры в формате защищѐнного режима. У п р авл яю щ ая структур а содер ж и т зн ачен и я д л я и н и ц и ал и зац и и реги стр ов п ер ед вы зовом эм ули р уем ого п р ер ы ван и я р еал ьн ого р еж и м а. О н а и м еет сл ед ую щ и й ф орм ат: Т аб л и ц а 11. Ф ор м ат уп р авл яю щ ей стр уктур ы д л я эм ул яц и и п р ер ы ван и я р еал ьн ого р еж и м а ср ед ствам и D P M I. С м ещ ен и е
Р еги стр
00h
EDI
04h
ESI
08h
EBP
0Ch
Зар езер ви р ован о
10h
EBX
14h
EDX
18h
ECX
1Ch
EAX
20h
FLAGS
22h
ES
24h
DS
26h
FS
28h
GS
2Ah
IP
2Ch
CS
2Eh
SP
30h
SS
В аш а п р огр ам м а, н аход ясь в защ и щ ѐн н ом р еж и м е, м ож ет н е тол ько вы звать п р ер ы ван и е р еал ьн ого р еж и м а, н о и п ер ед ать п ар ам етры через стек, указав в уп р авл яю щ ей структур е и х кол и чество. Н ари м ер :
push push push
Parametr1 Parametr2 Parametr3
mov mov int add
cx, 3 ax, 0301h 31h sp, 6
; Копируем три параметра ; Восстанавливаем стек
О б р аб отчи к п р ер ы ван и я р еальн ого реж и м а п ол учи т стек, п од готовл ен н ы й сл ед ую щ и м обр азом :
Parametr1 Parametr2 Parametr3 CS для возврата IP для возврата У казател ь стека р еал ьн ого р еж и м а S S :S P устан овл ен н а сл ово, сод ерж ащ ее IP д л я возврата.
В ы зо в п р о ц ед ур ы р еал ьн о го р еж и м а, закан ч и в аю щ ей ся ко м ан д о й R E T FA R Э та п р оц ед ур а п озвол яет вы п ол н и ть вы зов п р оц ед уры , п р ед н азн ачен н ой д л я раб оты в р еал ьн ом р еж и м е и возвр ащ аю щ ей уп р авл ен и е п ри п ом ощ и ком ан д ы R E T FA R .
Регистры на входе AX 0301h BH Байт флагов. Если установлен в единицу бит 0, выполняется сброс контроллера и линии A20. Остальные биты зарезервированы и должны быть сброшены в нуль. CX Количество слов, которые должны быть скопированы из стека защищѐнного режима в стек реального режима. ES:(E)DI Адрес управляющей структуры для вызова процедуры реального режима.
Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. ES:(E)DI Адрес модифицированной (в результате выполнения процедуры реального режима) управляющей структуры в формате защищѐнного режима.
В ы зо в п р о ц ед ур ы р еал ьн о го р еж и м а, закан ч и в аю щ ей ся ко м ан д о й IR E T Э та п р оц ед ур а п озвол яет вы п ол н и ть вы зов п р оц ед уры , п р ед н азн ачен н ой д л я раб оты в р еал ьн ом р еж и м е и возвр ащ аю щ ей уп р авл ен и е п ри п ом ощ и ком ан д ы IR E T .
Регистры на входе AX 0302h BH Байт флагов. Если установлен в единицу бит 0, выполняется сброс контроллера и линии A20. Остальные биты зарезервированы и должны быть сброшены в нуль. CX Количество слов, которые должны быть скопированы из стека защищѐнного режима в стек реального режима. ES:(E)DI Адрес управляющей структуры для вызова процедуры реального режима. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. ES:(E)DI Адрес модифицированной (в результате выполнения процедуры реального режима) управляющей структуры в формате защищѐнного режима.
П ер ехват п ер ед ач и уп р авл ен и я п р о гр ам м е р еал ьн о го р еж и м а Э та ф ун кц и я м ож ет бы ть и сп ол ьзован а д л я п ерехвата п ер едачи уп р авл ен и я п р оц ед ур е р еал ьн ого р еж и м а. Н ап ри м ер, д р ай вер м ы ш и вы п ол н яет вы зов п р оц ед уры р еал ьн ого р еж и м а п ри п ер ем ещ ен и и м ы ш и . П р огр ам м а м ож ет сам а зад авать ад р ес реал ьн ой п р оц ед уры , которая б уд ет п олучать уп р авл ен и е п р и п ерем ещ ен и и м ы ш и и л и п р и н аж ати и н а еѐ кн оп ки . С п ом ощ ью д ан н ой ф ун кц и и п р ограм м ы защ и щ ѐн н ого р еж и м а м огут п ер ехвати ть п ер ед ачу уп р авлен и я этой п роц ед ур ы и зам ен и ть еѐ н а д р угую п р оц ед ур у, раб отаю щ ую в защ и щ ѐн н ом р еж и м е.
Регистры на входе AX 0303h DS:(E)SI Адрес процедуры в формате защищѐнного режима, которая будет вызвана вместо перехваченной. ES:(E)DI Адрес управляющей структуры для вызова процедуры реального режима (в формате защищѐнного режима). Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. ES:(E)DI Адрес модифицированной (в результате выполнения процедуры реального режима) управляющей структуры в формате защищѐнного режима. CX:DX Адрес вызова перехватываемой программы в формате реального режима. П р оц ед ур а защ и щ ѐн н ого р еж и м а, п ер ехваты ваю щ ая уп р авл ен и е, вы зы вается с зап рещ ѐн н ы м и п р ер ы ван и ям и и п ол учает сл ед ую щ и е п ар ам етр ы : DS:(E)SI
А д р ес стека р еал ьн ого р еж и м а в ф ор м ате < сел ектор :см ещ ен и е> .
ES:(E)DI
А д р ес уп равл яю щ ей стр уктуры в ф ор м ате < сел ектор :см ещ ен и е> .
SS:(E)SP
С тек защ и щ ѐн н ого реж и м а.
О стал ьн ы е реги стр ы остаю тся в н еоп р ед ел ѐн н ом состоян и и . Д л я вы п олн ен и я возвр ата и з п р оц ед уры п ер ехвата н еоб ход и м о вы п олн и ть ком ан д у IR E T , п р ед вари тел ьн о загр узи в р еги стр ы сл ед ую щ и м об р азом :
ES:(E)DI
Адрес управляющей структуры
в формате <селектор:смещение>.
О тм ен а п ер ехвата п ер ед ач и уп р авл ен и я п р о ц ед ур е р еал ьн о го р еж и м а. Э та ф ун кц и я отм ен яет д ей стви е п р ед ы д ущ ей .
Регистры на входе AX 0304h CX:DX Адрес вызова перехватываемой программы в формате реального режима, для которой отменяется перехват. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
П о л уч и ть ад р еса п р о ц ед ур со хр ан ен и я/в о сстан о вл ен и я со сто я н и я. С п ом ощ ью этой ф ун кц и и п р огр ам м а м ож ет сохр ан ять и л и восстан авли вать состоян и е зад ачи (в том чи сл е сод ер ж и м ое всех р еги стр ов п р оц ессор а). это б ы вает н еобход и м о п ер ед и зм ен ен и ем р еал ьн ого р еж и м а раб оты н а защ и щ ѐн н ы й и об ратн о.
Регистры на входе AX 0305h Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. AX Размер буфера для сохранения состояния. BX:CX Адрес программы сохранения/восстановления для реального режима в формате <сегмент:смещение>. ES:(E)DI Адрес программы сохранения/восстановления для защищѐнного режима в формате <селектор:смещение>. П р оц ед ур а сохр ан ен и я/восстан овл ен и я состоян и я вы зы вается ком ан д ой C A LL FA R и п ол учает сл едую щ и е п ар ам етр ы :
ES:(E)DI Указатель на буфер сохранения состояния. AL 0 - для сохранения состояния, 1 - для восстановления состояния.
П о л уч и ть ад р ес п р о ц ед ур ы п ер екл ю ч ен и я р еж и м а С п ом ощ ью этой ф ун кц и и п р огр ам м а м ож ет п о лучи ть ад р еса п р оц ед ур д л я п ер екл ю чен и я и з р еал ьн ого р еж и м а в защ и щ ѐн н ы й и и з защ и щ ѐн н ого в р еал ьн ы й .
Регистры на входе AX 0306h Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. BX:CX Адрес программы переключения из реального режима в защищѐнный в формате <сегмент:смещение>.
SI:(E)DI
Адрес программы для переключения из защищѐнного режима в реальный в формате <селектор:смещение>.
П ер ед п ер екл ю чен и ем р еж и м а, котор ое вы п олн яется ком ан д ой JM P FA R , н еоб ходи м о п одготови ть р еги стр ы : AX
Н овое сод ерж и м ое реги стр а D S .
CX
Н овое сод ерж и м ое реги стр а ES
DX
Н овое сод ерж и м ое реги стр а SS
(E)BX
Н овое сод ерж и м ое реги стр а (E )S P
SI
Н овое сод ерж и м ое реги стр а C S
(E)DI
Н овое сод ерж и м ое реги стр а (E )IP
В п р оц ессе п ер еклю чен и я реж и м а сод ер ж и м ое р еги стр а (E )B P остан ется н еи зм ен н ы м , п оэтом у этот р еги стр м ож н о и сп ол ьзовать как указател ь. Д л я п р оц ессор ов i80386 и i80486 п осл е п ер екл ю чен и я р еж и м а в р егси тры FS и G S б ует зап и сан о н ул евое зн ачен и е.
П о л уч и ть вер си ю сп ец и ф и кац и и D P M I Ф ун кц и я п озвол яет п ол учи ть текущ ую вер си ю D P M I.
Регистры на входе AX 0400h Регистры на выходе: CARRY 0 AH Верхний (major) номер версии. AL Нижний (minor) номер версии. BX Байт флагов: бит 0 = 1 если программа работает под управлением DPMI для процессора i80386; бит 1 = 1 если процессор вернулся в реальный режим для обработки прерывания; бит 2 = 1 если в системе поддерживается виртуальная память; бит 3 и все остальные зарезервированы для использования в будущем. CL Тип процессора: 02 = i80286 03 = i80386 04 = i80486 DH Текущее значение номера прерывания для IRQ0. DL Текущее значение номера прерывания для IRQ8.
П о л уч и ть и н ф о р м ац и ю о сво б о д н о й п ам яти Регистры на входе AX 0500h ES:(E)DI Адрес бфера размером 30h байт в формате <селектор:смещение>. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. ES:(E)DI Адрес бфера размером 30h байт в формате <селектор:смещение>, заполненного информацией о свободной памяти. Ф ор м ат б уф ер а:
Т аб л и ц а 12. Ф ор м ат буф ера дл я и н ф ор м ац и и о своб од н ой п ам яти , п ол учаем ой ср ед ствам и D P M I. С м ещ ен и е
О п и сан и е
00h
Р азм ер н аи б ол ьш его д оступ н ого своб одн ого б л ока в б ай тах
04h
М акси м ал ьн ое коли чество д оступ н ы х н езаб л оки р ован н ы х стр ан и ц п ам яти .
08h
М акси м ал ьн ое коли чество д оступ н ы х заб л оки р ован н ы х стр ан и ц п ам яти .
0Ch
Р азм ер л и н ей н ого ад р есн ого п р остр ан ства в стр ан и ц ах.
10h
О б щ ее кол и чество н езаб л оки р ован н ы х стран и ц .
14h
К ол и чество своб од н ы х стр ан и ц .
18h
О б щ ее кол и чество ф и зи чески х стран и ц .
1Ch
Р азм ер своб одн ого ли н ей н ого ад р есн ого п р остран ства в стран и ц ах.
20h
Р азм ер стран и чн ого ф ай л а и ли разд ел а в стр ан и ц ах.
24h-2Fh
Зар езер ви р ован о.
Е сл и текущ ая р еали зац и я D PM I н е п од д ер ж и вает ви р туал ьн ую п ам ять, д ан н ая ф ун кц и я зап ол н яет тол ько п ер вое п ол е стр уктур ы . О стал ьн ы е п ол я устан авл и ваю тся в -1 (0FFFFFFFFh).
П о л уч и ть б л о к п ам я ти Э та ф ун кц и я п р ед н азн ачен а д л я п ол учен и я п р огр ам м ой участка л и н ей н ой п ам яти . Д л я п ол учен н ого б л ока п ам яти н е вы п олн яется автом ати ческого созд ан и я сел ектор а, п р огр ам м а д олж н а созд ать сел ектор сам остоятел ьн о.
Регистры на входе AX 0501h BX:CX Размер блока памяти в байтах. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. BX:CX Линейный адрес полученного блока. SI:DI Индекс полученного блока памяти, нужен для выполнения операций с блоком памяти (изменение его размера или освобождение).
О св о б о д и ть б л о к п ам яти Ф ун кц и я освоб ож д ает б л ок п ам яти , п олучен н ы й п р и п ом ощ и п р ед ы д ущ ей ф ун кц и и .
Регистры на входе AX 0502h SI:DI Индекс освобождаемого блока памяти. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
И зм ен и ть р азм ер б л о ка п ам я ти Ф ун кц и я и зм ен яет р азм ер б л ока п ам яти , п ол учен н ого п р и п ом ощ и ф ун кц и и 0501h .
Регистры на входе AX 0503h BX:CX Новый размер блока памяти в байтах. SI:DI Индекс изменяемого блока памяти. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
BX:CX SI:DI
Новый линейный адрес полученного блока. Новый индекс блока памяти.
З аф и кси р о вать л и н ей н ую о б л асть п ам яти Э та ф ун кц и я ф и кси р ует в п ам яти об л асть, зад аваем ую л и н ей н ы м а д р есом . Д л я заф и кси рован н ой об л асти п ам яти н е вы п олн яется своп и н г стр ан и ц .
Регистры на входе AX 0600h BX:CX Начальный линейный адрес фиксируемого участка памяти. SI:DI Размер фиксируемого блока памяти в байтах. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
Р асф и к си р о ван и е б л о ка п ам яти Э та ф ун кц и я д ол ж н а б ы ть и сп ол ьзован а д л я расф и кси р ован и я б л ока п ам яти , заф и кси р ован н ого п р ед ы дущ ей ф ун кц и ей .
Регистры на входе AX 0601h BX:CX Начальный линейный адрес расфиксируемого участка памяти. SI:DI Размер расфиксируемого блока памяти в байтах. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
О тм ен а ф и ксац и и стр ан и ц д л я о б л асти п ам яти ви р туал ьн о го р еж и м а О б л асть п ам яти , и сп ол ьзуем ая ви ртуал ьн ой м аш и н ой , обы чн о заф и кси р ован а и н е п од вер гается своп и н гу. С п ом ощ ью этой ф ун кц и и вы м ож ете р азреш и ть своп и н г д л я зад ан н ого участка п ам яти , п р и н ад л еж ащ ей ви р туал ьн ой м аш и н е.
Регистры на входе AX 0602h BX:CX Начальный линейный адрес расфиксируемого участка памяти. SI:DI Размер расфиксируемого блока памяти в байтах. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
Ф и ксац и я стр ан и ц д л я о б л асти п ам я ти в и р туал ьн о го р е ж и м а Ф ун кц и я п р ед н азн ачен а д л я отм ен ы д ей стви я п р ед ы дущ ей ф ун кц и и . О н а ф и кси рует участок п ам яти ви р туал ьн ой м аш и н ы , отм ен яя д л я н его своп и н г стр ан и ц .
Регистры на входе AX 0603h BX:CX Начальный линейный адрес фиксируемого участка памяти. SI:DI Размер фиксируемого блока памяти в байтах. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
П о л уч и ть р азм ер стр ан и ц ы п ам я ти
Ф ун кц и я возвр ащ ает р азм ер стр ан и ц ы п ам яти в б ай тах.
Регистры на входе AX 0604h Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. BX:CX Размер страницы памяти в байтах.
З ар езер ви р о ван н ы е ф ун кц и и Ф ун кц и и 0700h и 0701h зар езер ви р ован ы и н е д олж н ы вы зы ваться ваш ей п р ограм м ой .
О тм етка стр ан и ц ы д л я св о п и н га Ф ун кц и я и сп ол ьзуется д л я того, чтоб ы сооб щ и ть оп ер ац и он н ой си стем е о возм ож н ости вы гр узки (своп и н га) н а д и ск указан н ой стран и ц ы и л и д и ап азон а стран и ц .
Регистры на входе AX 0702h BX:CX Начальный линейный адрес отмечаемых страниц. SI:DI Размер отмечаемого блока памяти. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
О твер гн уть со д ер ж и м о е стр ан и ц Ф ун кц и я отм ечает стран и ц ы как н е сод ерж ащ и е п о лезн ой и н ф ор м ац и и . О п ер ац и он н ая си стем а м ож ет и сп ол ьзовать дан н ы е стр ан и ц ы д л я уд овл етвор ен и я зап р осов н а п ам ять.
Регистры на входе AX 0703h BX:CX Начальный линейный адрес страниц, отмечаемых как не содержащие полезной информации. SI:DI Размер отмечаемого блока памяти в байтах. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
П р ео б р азо в ан и е ф и зи ч еско го ад р еса в л и н ей н ы й Ф ун кц и я м ож ет б ы ть и сп ользован а д л я р аб оты с п ери ф ери й н ы м и устр ой ствам и , ад р есн ое п р остр ан ство ввод а/вы вод а которы х отобр аж ается в д и ап азон ф и зи чески х ад р есов.
Регистры на входе AX 0800h BX:CX Физический адрес памяти. SI:DI Размер блока памяти в байтах. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. BX:CX Линейный адрес памяти.
З ап р ети ть в и р туал ьн ы е п р ер ы ван и я Ф ун кц и я сбр асы вает ф л аг ви ртуал ьн ого п р ер ы ван и я и возвр ащ ает п р ед ы д ущ ее состоян и е этого ф лага.
Регистры на входе AX 0900h Регистры на выходе: CARRY 0 AL 0, если виртуальные прерывания были запрещены, 1, если виртуальные прерывания были разрешены.
Р азр еш и ть ви р туал ьн ы е п р ер ы ван и я. Ф ун кц и я устан авл и вает ф л аг ви ртуал ьн ы х п р ер ы ван и й , р азр еш ая ви р туал ьн ы е п рер ы ван и я, и возвр ащ ает п р ед ы д ущ ее сосотоян и е этого ф л а га.
Регистры на входе AX 0901h Регистры на выходе: CARRY 0 AL 0, если виртуальные прерывания были запрещены, 1, если виртуальные прерывания были разрешены.
П о л уч и ть со сто я н и е ф л ага в и р туал ьн ы х п р ер ы в ан и й Ф ун кц и я п озвол яет узн ать текущ ее состоя н и е ф лага ви р туал ьн ы х п рер ы ван и й .
Регистры на входе AX 0902h Регистры на выходе: CARRY 0 AL 0, если виртуальные прерывания запрещены, 1, если виртуальные прерывания разрешены.
П о л уч и ть ад р ес д л я и сп о л ьзо ван и я р асш и р ен и й D P M I DOS-экстен д ер ы м огут расш и р ять сер ви с D P M I свои м и ф ун кц и ям и . Д л я п ол учен и я д оступ а к эти м ф ун кц и ям м ож н о и сп ол ьзовать ф ун кц и ю 0A 00h . В ы зы ваю щ ая п р огр ам м а д ол ж н а зад ать в р еги страх D S :(E )S I ад р ес стр оки , закр ы той н ул ѐм . С тр ока д олж н а сод ер ж ать н азван и е п р ои звод и тел я D O S -экстен д ера и л и д р угой ун и кал ьн ы й и д ен ти ф и катор р асш и р ен и я.
Регистры на входе AX 0A00h DS:(E)SI Указатель на строку, закрытую нулѐм. Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. ES:(E)DI Точка входа для вызова расширений С од ер ж и м ое р еги стр ов D S, FS , G S , E A X , E B X , E C X , E D X , E S I, и E B P н е сохр ан яется.
У стан о в и ть то ч к у о стан о ва д л я о тл ад ки Ф ун кц и я п озвол яет устан ови ть отл ад очн ую точку остан ова п о зад ан н ом у ли н ей н ом у ад р есу.
Регистры на входе AX 0B00h BX:CX Линейный адрес точки останова. DL Размер используемого для точки останова операнда (1, 2, или 4 байта). DH Тип точки останова 0 = Выполнение 1 = Запись
2 = Чтение/запись Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. BX Индекс для доступа к отладочной точке останова
О тм ен а о тл ад о ч н о й то ч ки о стан о ва Ф ун кц и я отм ен яет точку остан ова, устан овлен н ую п ри п ом ощ и п р ед ы д ущ ей ф ун кц и и .
Регистры на входе AX 0B01h BX Индекс отладочной точки останова Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
П о л уч и ть со сто я н и е о тл ад о ч н о й то ч к и о стан о ва Ф ун кц и я возвр ащ ает состоян и е отл ад очн ой точки остан ова, оп р ед елѐн н ой п ри п ом ощ и ф ун кц и и 0B 00h .
Регистры на входе AX 0B02h BX Индекс отладочной точки останова Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка. AX Флаги: Бит 0 = 1 если произошло выполнение точки останова.
С б р о с то ч ки о стан о ва Ф ун кц и я сбр асы вает состоян и е д л я зад ан н ой отл ад очн ой точки остан ова.
Регистры на входе AX 0B03h BX Индекс отладочной точки останова Регистры на выходе: CARRY 0, если функция выполнилась без ошибки, 1, если произошла ошибка.
6.5. DOS-экстен д ер ы В ы уж е н аверн ое зам ети л и , что все п р огр ам м ы , п р и вед ѐн н ы е в этой кн и ге, н е п од д аю тся отлад ке с п ом ощ ью об ы чн ы х отл ад чи ков, таки х как B orlan d T u rb o D eb u g g er и ли M icrosoft C od e V iew . Э ти отл ад чи ки зави саю т уж е н а этап е загр узки р еги стра д ескри п тор н ой таб л и ц ы п р ер ы ван и й ID T R , д о п ер еход а в защ и щ ѐн н ы й р еж и м д ел о так и н е д оходи т. И это п он ятн о - таки е отл ад чи ки р ассчи тан ы н а об ы чн ы е п р огр ам м ы р еал ьн ого р еж и м а. Д р угая тр уд н ость связан а с тем , что п р огр ам м е, раб отаю щ ей в защ и щ ѐн н ом р еж и м е, н ед оступ н ы п р ер ы ван и я MS-D O S и B IO S . П р огр ам м а д ол ж н а р аб отать с ап п ар атур ой н а ур овн е реги стр ов и ап п аратн ы х п р ер ы ван и й . Д л я об л егчен и я р азраб отки п р огр ам м , стартую щ и х и з M S -DOS в р еал ьн ом р еж и м е и п ер еклю чаю щ и хся в защ и щ ѐн н ы й р еж и м р азр аб отан ы сп ец и ал ьн ы е ср ед ства, н азы ваем ы е D O S -экстен д ерам и и л и р асш и ри тел ям и DOS. Э ти ср ед ства п ри ком п он овы ваю т к разр аб аты ваем ой п р ограм м е сп ец и ал ьн ы й м од ул ь, реал и зую щ и й и н терф ей с с защ и щ ѐн н ы м реж и м ом . П р огр ам м а, созд ан н ая с и сп ол ьзован и ем D O S -экстен д ер а, загр уж ается сп ец и ал ьн ы м загр узчи ком в п ам ять и п ол учает уп р авл ен и е, когд а п р оц ессор уж е н аход и тся в защ и щ ѐн н ом р еж и м е. В сю р аб оту
п о п ер евод у п р оц ессор а в защ и щ ѐн н ы й р еж и м и п о об работке п р ер ы в ан и й в защ и щ ѐн н ом р еж и м е б ер ѐт н а себ я экстен д ер . К р ом е того, D O S -экстен д ер п р ед оставл яет п р огр ам м е возм ож н ость обр ащ ен и я к п р еры ван и ям M S -D O S и B IO S ! В свои х п р ограм м ах, р аб отаю щ и х в защ и щ ѐн н ом р еж и м е п од уп р авлен и ем D O S -экстен д ера вы м ож ете п ол ьзоваться п р и вы чн ы м и вам ф ун кц и ям и M S -D O S и B IO S (п р авд а, н е всем и , а тол ько д окум ен ти р ован н ы м и ). В озм ож н ости эти х ф ун кц и й возр астут. Н ап р и м ер , с п ом ощ ью ф ун кц и и D O S м ож н о б уд ет заказать д л я п р ограм м ы б уф ер р азм ер ом в н ескол ько м егаб ай т. М од ул ь D O S -экстен д ер а, п р и ком п он ован н ы й к п р огр ам м е, м ож ет и сп ол ьзовать и н терф ей сы D P M I, V C P I, X M S (д р ай вер H IM E M .S Y S ), IN T 15h , и л и м ож ет и сп ол ьзовать соб ствен н ую схем у уп равл ен и я п ам ятью в защ и щ ѐн н ом р еж и м е и соб ствен н ы е ср ед ства п ер екл ю чен и я р еж и м а п р оц ессор а и ли состоян и я ад р есн ой л и н и и A 20. В сп ец и ф и кац и и D P M I п ри вед ен ы реком ен д ац и и д л я разр аб отчи ков D O S -экстен д еров п о и сп ол ьзован и ю п ер ечи слен н ы х вы ш е и н тер ф ей сов. D O S -экстен д ер д ол ж ен п р овер ять н али чи е и н тер ф ей сов и п о возм ож н ости и сп ол ьзовать б ол ее вы сокоуровн евы й и н терф ей с. П р овер ка д ол ж н а вы п олн яться в сл едую щ ем п ор яд ке:
DPMI EMS/VCPI XMS Ф ун кц и и п р ер ы ван и я IN T 15h
К сож ал ен и ю , н е все п оставл яю щ и еся D O S -экстен д ер ы сл ед ую т эти м реком ен дац и ям . В р езул ьтате м огут возн и кн уть п р об л ем ы п р и п оп ы тке зап усти ть р азраб отан н ую с п ом ощ ью D O S -экстен д ера п р огр ам м у н а ви р туал ьн ой м аш и н е W IN D O W S в реж и м е "E n h an ced 386 M od e" и л и в M S -D O S п ри устан овлен н ы х д р ай вер ах E M M 3 86 и л и Q E M M . Н еоб ходи м ость об есп ечен и я совм ести м ости с и н тер ф ей сам и D P M I, V C P I и X M S тр еб ует тщ ател ьн ого вы б ор а D O S экстен д ер а. Т ак как в н астоящ ее врем я оп ер ац и он н ая си стем а W IN D O W S н аход и тся в состоян и и взр ы вооб р азн ого расп р остр ан ен и я ср еди п ол ьзовател ей п ер сон ал ьн ы х ком п ью тер ов, н еуд ачн ы й вы б ор D O S экстен д ер а м ож ет п р и вести к том у, что огр ом н ое кол и чество п отен ц и ал ьн ы х п о куп ателей н е см огут и сп ользовать ваш у п р огр ам м у в ср ед е W IN D O W S . Т о ж е отн оси тся и к зн ачи тел ьн ом у коли честву п ол ьзовател ей др й вер ов р асш и р ен н ой п ам яти E M M 386 и Q E M M . В д окум ен тац и и н а D O S -экстен д ер д ол ж н о сод ер ж аться п одтверж д ен и е совм ести м ости с и н терф ей сам и D P M I, V C P I и X M S . Т акой D O S -экстен д ер б уд ет совм ести м с совр ем ен н ы м и оп ер ац и он н ы м и си стем ам и и д р ай вер ам и р асш и р ен н ой п ам яти . П р и м ер ам и п р огр ам м , созд ан н ы х с и сп ол ьзован и ем н есовм ести м ы х с D P M I и н терф ей сом сл уж ат С У Б Д O R A C LE вер си и 5.1 и FO X P R O вер си и 2.0. Э ти п р ограм м н ы е п род укты н е б уд ут р аб отать н а ви р туал ьн ой м аш и н е W IN D O W S в реж и м е "E n h an ced 386 M od e". И сход н ы е тексты п р огр ам м , составл ен н ы х д л я D O S -экстен д ер ов, вн еш н е очен ь п охож и н а тексты п р ограм м р еал ьн ого р еж и м а. В н и х отсутствую т стр оки , сп ец и ф и чески е д л я п р огр ам м , р ассм отр ен н ы х н ам и р ан ее и вы п олн яю щ и е п ер екл ю чен и е в защ и щ ѐн н ы й р еж и м , л и б о п од готовку си стем н ы х таб л и ц , л и б о п ер еп р огр ам м и р ован и е кон трол л ер а п р еры ван и я. DOS-экстен д ер ы п оставл яю тся в ком п л екте с тр ан сл яторам и , р ед актор ам и связей , отлад чи кам и и би б ли отекам и стан д артн ы х ф ун кц и й (н ап ри м ер , би б ли отекам и д л я тран сл ятора язы ка С и ). П оэтом у созд ан и е и отл ад ка п р огр ам м защ и щ ѐн н ого р еж и м а, созд ан н ы х с и сп ол ьзован и ем D O S -экстен д ер ов, об ы чн о н е вы зы вает затр удн ен и й . М ы кр атко р ассм отр и м возм ож н ости д вух D O S -экстен д ер ов: 386 -D O S /E xten d er ф и р м ы P h ar Lap и ви р туал ьн ую м аш и н у оп ер ац и он н ой си стем ы W IN D O W S в р еж и м е "E n h anced 386 M od e".
Phar Lap DOS-экстен д ер В состав P h ar Lap D O S -экстен д ер а вход ят тран сл ятор д л я язы ка С и h c386.exe, ассем б л ер 3 86asm .exe, р ед актор связей 386lin k.exe, отл ад чи к m in ib u g .exe и п р огр ам м а загрузки ru n 386.exe. С п ом ощ ью тран сл ятор а язы ка С и и ли ассем б л ера п ол учаю тся об ъ ектн ы е м од ули , которы е ком п он ую тся р ед актор ом связей 386lin k.exe в загр узочн ы й м од ул ь. Э тот загр узочн ы й м од ул ь и м еет р асш и р ен и е "exp " и зап ускается п ри п ом ощ и п рогр ам м ы загрузки ru n 386.exe. П ол учен н ы й загр узочн ы й м од ул ь м ож ет р аб отать тол ько н а п р оц ессорах i80386 и л и i80486. В ер си я 2.2 P h ar Lap D O S -экстен д ер а н е п од д ер ж и вает и н тер ф ей с D P M I, п оэтом у разр аб отан н ы е с и сп ол ьзован и ем экстен д ера этой вер си и п р ограм м ы н е б уд ут раб отать н а ви ртуал ьн ой м аш и н е W IN D O W S в реж и м е "E n h an ced 386 M od e".
Phar Lap DOS-экстен д ер п ред оставл яет п р огр ам м е, котор ая п ол учает уп р авл ен и е ср азу в защ и щ ѐн н ом р еж и м е, возм ож н ость и сп ол ьзовать д окум ен ти р ован н ы е п р еры ван и я M S -D O S и B IO S . К р ом е того, в р ам ках п р ер ы ван и я INT 21h DOS-экстен д ер ом р еал и зую тся д оп олн и тел ьн ы е ф ун кц и и , связан н ы е с раб отой в защ и щ ѐн н ом р еж и м е. Д л я того, чтоб ы у вас б ы ло п р ед ставлен и е о возм ож н остях P h ar Lap D O S -экстен дер а, п ри вед ѐм таб ли ц у д оп ол н и тел ьн ы х ф ун кц и й , р еал и зован н ы х в р ам ках п р ер ы ван и я IN T 21h: Т аб л и ц а 13. Ф ун кц и и P h ar Lap D O S -экстен д ера. Р еги стр A X
В ы п ол н яем ая ф ун кц и я
2501h
У стан овка в и сходн ое состоян и е стр уктур дан н ы х D O S -экстен д ер а.
2502h
П ол учи ть вектор п р ер ы ван и я защ и щ ѐн н ого р еж и м а.
2503h
П ол учи ть вектор п р ер ы ван и я р еал ьн ого р еж и м а.
2504h
У стан ови ть вектор п р еры ван и я защ и щ ѐн н ого р еж и м а.
2505h
У стан ови ть вектор п р еры ван и я р еал ьн ого р еж и м а.
2506h
У стан ови ть р еж и м , п ри котором п р ер ы ван и е б уд ет всегд а об р абаты ваться в защ и щ ѐн н ом р еж и м е.
2507h
У стан ови ть вектор а п р ер ы ван и й р еал ьн ого и защ и щ ѐн н ого р еж и м а.
2508h
У стан ови ть ли н ей н ы й б азовы й ад рес сегм ен та.
2509h
П р еобр азовать ли н ей н ы й ад рес в ф и зи чески й
250Ah
О тоб рази ть ф и зи ческую п ам ять в кон ц е сегм ен та.
250Ch
П ол учи ть вектора ап п ар атн ы х п р ер ы ван и й .
250Dh
П ол учи ть и н ф ор м ац и ю связи с р еал ьн ы м р еж и м ом .
250Eh
В ы звать п р оц ед ур у реал ьн ого р еж и м а.
250Fh
П р еобр азовать ад р ес защ и щ ѐн н ого р еж и м а в ад р ес р еал ьн ого р еж и м а.
2510h
В ы звать п р оц ед ур у реал ьн ого р еж и м а с задан н ы м сод ер ж и м ы м р еги стр ов.
2511h
В ы звать п р ер ы ван и е р еал ьн ого р еж и м а с задан н ы м сод ерж и м ы м р еги стр ов.
2512h
Загр узи ть п р ограм м у д л я отлад ки .
2513h
С озд ать али асн ы й д ескр и п тор сегм ен та (т.е. д л я зад ан н ого д ескр и п тор а созд аѐтся ещ ѐ од и н , указы ваю щ и й н а тот ж е сегм ен т).
2514h
И зм ен и ть атри б уты сегм ен та.
2515h
П ол учи ть атри б уты сегм ен та.
2516h
О своб од и ть всю п ам ять, р асп р ед ел ѐн н ую п ри п ом ощ и LD T .
2517h
П ол учи ть и н ф ор м ац и ю о б уф ер ах дан н ы х D O S .
2518h
О п р ед ели ть д р ай вер д л я об р аб отки п ер ем ещ ен и я сегм ен та.
2519h
П ол учи ть д оп олн и тел ьн ую и н ф ор м ац и ю об ош и б ке п ам яти .
251Ah
Заф и кси р овать стр ан и ц ы в п ам яти .
251Bh
Р асф и кси р овать стр ан и ц ы .
251Ch
О своб од и ть стран и ц ы ф и зи ческой п ам яти .
251Dh
П р очи тать эл ем ен т таб ли ц ы стр ан и ц .
251Eh
Зап и сать эл ем ен т таб ли ц ы стран и ц .
251Fh
О б м ен ять эл ем ен ты таб л и ц ы стр ан и ц .
2520h
П ол учи ть стати сти ческую и н ф ор м ац и ю о п ам яти .
2521h
М акси м ал ьн ы й р азм ер д оступ н ой п р огр ам м ам р асш и р ен н ой п ам яти .
2522h
О п р ед ели ть ал ьтер н ати вн ы й д р ай вер , об р аб аты ваю щ ей си туац и ю отсутстви я стр ан и ц ы в п ам яти .
2525h
М акси м ал ьн ы й р азм ер д оступ н ой п р огр ам м ам стан д артн ой п ам яти .
25C0h
П ол учи ть б л ок стан дар тн ой п ам яти M S -DOS.
25C1h
О своб од и ть бл ок стан д ар тн ой п ам яти M S -DOS.
25C2h
И зм ен и ть разм ер б л ока стан дар тн ой п ам яти M S -DOS.
25C3h
В ы п ол н и ть п р ограм м у.
С р авн и те это с ф ун кц и ям и и н терф ей са D P M I, вы уви ди те что м еж д у эти м и и н тер ф ей сам и есть м н ого об щ его. Е сть сп ец и ал ьн ая ф ун кц и я, п ред н азн ачен н ая д л я отл ад чи ков - "Загр узи ть п р огр ам м у д л я отл ад ки ". П р огр ам м е д оступ н ы сел ектор ы , об л егчаю щ и е раб оту с н аи б олее часто и сп ол ьзуем ы м и об л астям и д ан н ы х. Н ап ри м ер, таб ли ц а LD T сод ерж и т сл ед ую щ и е сел ектор ы , готовы е д л я и сп ол ьзован и я: Т аб л и ц а 14. Т аб ли ц а LD T P h ar Lap D O S -экстен д ер а. 0008h
С егм ен т код а п р огр ам м ы .
0010h
С егм ен т д ан н ы х п р ограм м ы .
0018h
С егм ен т ви д еоп ам яти д л я р аботы в текстовом р еж и м е.
0020h
P S P п р ограм м ы .
0028h
С егм ен т стр ок ср ед ы D O S (D O S en viron m en t).
0030h
С егм ен т д ан н ы х д л я д оступ а к п ервом у м егаб ай ту п ам яти , доступ ен д л я зап и си .
0038h
С егм ен т д л я р аб оты с соп р оц ессор ом W eitek 1167. В отл и чи е от соп р оц ессор а i8028 7/i803 87 д л я об р ащ ен и я к соп р оц ессор у W eitek 1167 и сп ол ьзуется оп ред ел ѐн н ая об л асть ад р есов п ам яти .
0040h
С егм ен т ви д еоп ам яти д л я р аботы в граф и ческом реж и м е.
В д окум ен тац и и н а P h ar Lap D O S -экстен д ер п од р об н о оп и сан ы ф ор м аты таб л и ц LD T и G D T . П р огр ам м ы м огут п ол ьзоваться оп р ед ел ѐн н ы м и в эти х таб ли ц ах селекторам и д л я ад р есац и и си стем н ы х об ластей п ам яти , таки х как п ам ять ви д еоад ап тера. В качестве п р остей ш его п ри м ер а и сп ол ьзован и я P h ar Lap D O S -экстен д ера п р и вед ѐм сл едую щ ую п р огр ам м у:
Листинг 20. Использование Phar Lap DOS-экстендера Файл pharlap.asm ----------------------------------------------------------; --------------------------------------------------; Сегмент данных ; --------------------------------------------------_data
segment para public use32 'data'
hello
db
'PHAR LAP 386/DOS EXTENDER', 0dh,0ah db 'Вызов DOS в защищенном режиме', 0dh,0ah db 0dh,0ah,'© Frolov A.V., 1992',0dh, 0ah db 0dh,0ah,'Для возврата в DOS нажмите любую
клавишу','$' _data
ends
; --------------------------------------------------; Сегмент стека ; --------------------------------------------------_stack
segment byte stack use32 'stack' db
_stack
8192 dup (?)
ends
; --------------------------------------------------; Сегмент кода ; --------------------------------------------------assume
cs:_text,ds:_data
_text
segment para public use32 'code'
public _start_ proc
_start_ near
; Выводим строку lea mov int
edx,hello ah,09h 21h
mov int
ah,8h 21h
mov int
ax,04c00h 21h
_start_ endp _text
ends end _start_
Э та п р огр ам м а п р осто вы води т сооб щ ен и е н а экр ан и заверш ает свою раб оту п осле того, как вы н аж м ѐте л ю б ю кл ави ш у. О соб ен н ость п р огр ам м ы закл ю чается в том , что он а п ол учает уп р авл ен и е ср азу в защ и щ ѐн н ом р еж и м е. Зап уск п р огр ам м ы д ол ж ен вы п ол н яться сп ец и ал ьн ы м загр узчи ком , котор ы й входи т в состав P h ar Lap D O S экстен д ер а. Э тот загр узчи к н аход и тся в ф ай л е ru n 386.exe. Д л я тр ан сл яц и и п р ограм м ы и еѐ зап уска м ож н о и сп ол ьзовать сл ед ую щ и й ком ан д н ы й ф ай л :
386asm pharlap 386link pharlap run386 pharlap О б р ати те вн и м ан и е н а то, что в п р и вед ѐн н ой вы ш е п р ограм м е н е вы п ол н яется загр узка сегм ен тн ого р еги стр а D S . Т ак как п р ограм м а стартует ср азу в защ и щ ѐн н ом р еж и м е, загр узчи к ru n 386 загр уж ает сам все сегм ен тн ы е р еги стр ы . В частн ости , он загр уж ает в реги стр D S сел ектор сегм ен та д ан н ы х.
В и р туал ьн ая м аш и н а W IN D O W S О п ер ац и он н ая си стем а W IN D O W S п озвол яет р азд ел ять ресур сы п ер сон ал ьн ого ком п ью тер а м еж д у н ескол ьки м и п ар ал лел ьн о р аб отаю щ и м и п рогр ам м ам и . П ри этом в ср ед е W IN D O W S м огут вы п ол н яться тр и ти п а п р огр ам м :
П р огр ам м ы , созд ан н ы е сп ец и ал ьн о д л я р аб оты п од уп р авлен и ем W IN D O W S - п ри л ож ен и я W IN D O W S.
О н и н е м огут раб отать вн е W IN D O W S , так как д л я своей р аб оты и сп ол ьзую т м од ули , н аход ящ и еся в яд р е W IN D O W S . П ри л ож ен и я W IN D O W S всегд а н ачи н аю т своѐ вы п ол н ен и е и вы п олн яю тся в защ и щ ѐн н ом р еж и м е, и м д оступ ен и н тер ф ей с D P M I. П р огр ам м ы , созд ан н ы е д л я р аб оты в сред е M S -D O S и н и чего н е зн аю щ и е о W IN D O W S . Э то хор ош о зн аком ы е вам п р ограм м ы р еал ьн ого реж и м а. Е сл и W IN D O W S р аб отает в стан д ар тн ом реж и м е (S tan d art M od e) н а ком п ью тере с п р оц ессор ом i80286, вы п ол н ен и е эти х п р огр ам м п р ои сход и т в р еал ьн ом р еж и м е. Е сл и W IN D O W S р аб отает в р асш и рен н ом р еж и м е (E n h a n ced M od e) н а п р оц ессор ах i8038 6 и л и i80486, таки е п р огр ам м ы вы п олн яю тся в р еж и м е ви р туал ьн ого п р оц ессор а 8086. П р огр ам м ы , н ачи н аю щ и е свою р аб оту в р еж и м е ви р туал ьн ого п р оц ессор а 8086 (как об ы чн ы е п р огр ам м ы р еал ьн ого реж и м а) и п ер еклю чаю щ и еся затем в защ и щ ѐн н ы й реж и м . Э ти п р огр ам м ы и сп ол ьзую т и н терф ей с D P M I, котор ы й д оступ ен и м тол ько в том сл учае, есл и W IN D O W S раб отает в р асш и р ен н ом р еж и м е н а п р оц ессор ах i80386 и л и i80486. П р огр ам м ы п ер вого ти п а - тем а д л я отд ел ьн ой кн и ги об ъ ѐм ом в н ескол ько сотен стр ан и ц (см . сп и сок л и тератур ы ). П р ограм м ы второго ти п а - это об ы чн ы е п р ограм м ы M S -D O S , о котор ы х м ы говор и ли в п р ед ы д ущ и х том ах "Б и б ли отеки си стем н ого п р огр ам м и ста".
М ы зай м ѐм ся п р огр ам м ам и п осл ед н его ти п а. Д л я составл ен и я эти х п р огр ам м вы м ож ете и сп ол ьзовать об ы чн ую техн и ку, п ри м ен яем ую д л я п рогр ам м р еал ьн ого р еж и м а M S -D O S (за и скл ю чен и ем отл ад ки - как и все п р огр ам м ы , п р и вед ѐн н ы е в этой кн и ге, п рогр ам м ы тр етьего ти п а н е п одд аю тся отл адке стан д артн ы м и д л я р еал ьн ого р еж и м а ср ед ствам и ). Н аш а сл ед ую щ ая гл ава - о W IN D O W S и о тех возм ож н остях, котор ы е оп ер ац и он н ая си стем а W IN D O W S п р ед оставл яет п р огр ам м ам , составл ен н ы м в стар ом "сти л е" M S -DOS.
7 . О П Е Р А Ц И О Н Н А Я С И С Т Е М А M IC R O S O FT WINDOWS Н е б уд ет п реувели чен и ем сказать, что оп ер ац и он н ая си стем а W IN D O W S вер си и 3.0 откры л а н овы й этап в ж и зн и п ер сон ал ьн ого ком п ью тера IB M P C . У д обн ая, и н туи ти вн о ясн ая гр аф и ческая об ол очка, ан ал оги чн ая и сп ол ьзуем ой в ком п ью тер ах ф и р м ы A p p le, б ы стр о завоевал а п о п ул яр н ость у п ол ьзовател ей IB M P C . В н аш ей стр ан е W IN D O W S такж е п ол учи л а ш и р окое р асп р остр ан ен и е, особ ен н о п осл е того, как стал и д оступ н ы ком п ью тер ы с п ам ятью 2 м егаб ай та и б ол ее. Н овая вери си я W IN D O W S 3.1 об л ад ает ул учш ен н ы м гр аф и чески м и н тер ф ей сом и б ол ьш ей п р ои звод и тел ьн остью . О д н ако W IN D O W S - это н е тол ько гр аф и ка и п ер екр ы ваю щ и еся окн а. С точки зрен и я п р огр ам м и ста, W IN D O W S явл яется гр аф и чески ор и ен ти р ован н ой м ул ьти зад ачн ой оп ер ац и он н ой си стем ой , раб отаю щ ей в защ и щ ѐн н ом р еж и м е п р оц ессор а. С тан д артн ы е п ри л ож ен и я W IN D O W S и сп ол ьзую т как б ы "вы верн утую н аи зн ан ку" л оги ку р аб оты п р ограм м . О б ы чн о, созд авая п р огр ам м ы д л я M S -D O S , п р огр ам м и ст п ол н остью п л ан и р ует сц ен ар и й р аб оты п р огр ам м ы . О н п осл ед овател ьн о оп р ед ел яет, что и когд а п р ограм м а буд ет вы вод и ть н а экр ан , что и когда д ол ж н о б ы ть введ ен о с кл ави атур ы . Л оги ка раб оты п ри л ож ен и й W IN D O W S осн ован а н а и сп ол ьзован и и очер ед ей соб ы ти й . С об ы ти ем явл яется, н ап р и м ер, н аж ати е кл ави ш и н а кл ави атур е, п р ер ы ван и е от си стем н ого тай м ер а, н аж ати е н а кн оп ку м ы ш и и ли п ер ем ещ ен и е м ы ш и . Д л я каж д ого п р и л ож ен и я созд аѐтся своя соб ствен н ая очер ед ь, в котор ую зап и сы ваю тся код ы соб ы ти й и д оп олн и тел ьн ая и н ф орм ац и я о собы ти ях (н ап р и м ер , код н аж атой клави ш и ). П р и л ож ен и е W IN D O W S в ц и кл е оп р аш и вает состоян и е очер ед и соб ы ти й . Е сл и п р ои схо ди т какое л и б о соб ы ти е, вы зы вается соответствую щ и й м од ул ь, которы й и р еаги рует н а соб ы ти е. П ер ед обр аб откой соб ы ти е удал яется и з очер ед и . П р огр ам м а н е м ож ет зн ать п осл ед овател ьн ости соб ы ти й , п оэтом у еѐ п овед ен и е п ол н остью оп р ед ел яется соб ы ти ям и , п р ои сход я щ и м и в си стем е. Т акая л оги ка раб оты п р огр ам м н азы вается л оги кой , уп р авл яем ой соб ы ти ям и , а сам и п р огр ам м ы - п р огр ам м ам и , уп р авл яем ы м и соб ы ти ям и . К р ом е и зм ен ен и й в л оги ке раб оты п р огр ам м , W IN D O W S р еал и зует н овы й п од ход к и сп ол ьзован и ю си стем н ы х р есур сов. О п ер ац и он н ая си стем а M S -D O S н е сод ер ж и т скол ько -н и б уд ь зн ачи тел ьн ой п од д ер ж ки д и ал оговы х п р огр ам м , п оэтом у п р огр ам м и сты вы н уж д ен ы п р и б егать к и сп ол ьзован и ю сп ец и ал ьн ы х б и б ли отек, сод ер ж ащ и х п р огр ам м ы м ен ю , уп р авл ен и я окн ам и , м од ули д л я р аб оты с м ы ш ью и гр аф и кой . В се н еоб ходи м ы е м од ул и п р и ком п он овы вали сь к осн овн ой п р огр ам м е, си л ьн о увели чи вая р азм ер загр узочн ого м од ул я. О п ер ац и он н ая си стем а W IN D O W S в своѐм яд р е сод ер ж и т все м од ул и , н еобходи м ы е д л я ор ган и зац и и вы сококачествен н ого гр аф и ческого д и ал ога с п ользо вател ем . П ри чѐм н ет н еоб ходи м ости в и х ком п он овке с осн овн ы м м од ул ем - весь сер ви с W IN D O W S р еен тер аб ел ьн ы й , од н и и те ж е м од ул и и сп ол ьзую тся всем и од н овр ем ен н о р аб отаю щ и м и п р и л ож ен и ям и . Н овы й п од ход в созд ан и и п рогр ам м , п р ед л ож ен н ы й в W IN D O W S , сп особ ствуе т созд ан и ю уд об н ы х п р ограм м с д р уж ествен н ы м д и ал огом , и сп ол ьзую щ и х все д оступ н ы е р есур сы ком п ью тер а. О дн ако W IN D O W S ед ва л и п ол учи ла бы такое ш и р окое р асп р остр ан ен и е, есл и б ы он а н е п озвол ял а од н оврем ен н о с п р и л ож ен и ям и W IN D O W S и сп ол ьзовать р азр аб отан н ы е р ан ее п р огр ам м ы , ор и ен ти р ован н ы е н а M S -DOS (DOS-п р ограм м ы ). В зави си м ости от ти п а п р оц ессор а и р еж и м а, в котор ом раб отает W IN D O W S (стан д артн ы й и ли р асш и р ен н ы й ) вы п олн ен и е D O S -п р огр ам м орган и зуется п о -разн ом у. В стан д ар тн ом р еж и м е и п ри и сп ол ьзован и и п р оц е ссор а i80286 D O S -п р огр ам м ы вы п ол н яю тся в р еал ьн ом р еж и м е п р оц ессор а. В лю б ой м ом ен т вр ем ен и м ож ет вы п ол н яться тол ько одн а D O S -п р ограм м а, остал ьн ы е зап ущ ен н ы е DOS-п р ограм м ы н аход ятся в "зам ор ож ен н ом " состоян и и .
Р асш и р ен н ы й р еж и м тр еб ует н ал и чи я п р оц ессор а i80386 и л и i80486. О н ор ган и зует п арал л ел ьн ую р аб оту всех зап ущ ен н ы х п ри л ож ен и й W IN D O W S и D O S -п р огр ам м , вы д ел яя в р асп ор яж ен и е каж д ом у п р и л ож ен и ю и п р огр ам м е так н азы ваем ую ви ртуал ьн ую м аш и н у. В и ртуал ьн ую м аш и н у, н а котор ой вы п ол н яется D O S п р огр ам м а, м ы б уд ем н азы вать ви р туал ьн ой D O S -м аш и н ой . Ч то такое ви р туал ьн ая м аш и н а, хор ош о зн аю т те, кто раб отал н а Е С Э В М в оп ер ац и он н ой си стем е V M (и звестн а такж е п од н азван и ем "С В М " - си стем а ви ртуал ьн ы х м аш и н ). В се р есур сы ком п ью тер а р азд ел яю тся м еж д у зап ущ ен н ы м и п р о гр ам м ам и . В р асп ор яж ен и е каж д ой п р огр ам м ы п ред оставл яется собствен н ы й ви р туал ьн ы й п р оц ессор , ви р туал ьн ая п ам ять, ви р туал ьн ая си стем а п р ер ы ван и й . Д и сп лей , клави атура и м ы ш ь и сп ол ьзую тся совм естн о и р асп ред ел яю тся той п р огр ам м е, которая в д ан н ы й м ом ен т р аб отает с оп ер атор ом (п р о такую п р огр ам м у р азр аб отчи ки п р и лож ен и й W IN D O W S говор ят, что он а и м еет "ф окус ввод а" - input focus). К огд а W IN D O W S р аб отает в р асш и р ен н ом р еж и м е, п р оц ессор м ож ет н аход и ться л и б о в защ и щ ѐн н ом , л и б о в ви р туал ьн ом р еж и м е. D O S -п рогр ам м а п ол учает уп р авл ен и е, когд а п р оц ессор н аходи тся в ви р туал ьн ом р еж и м е. П р и этом , и сп ол ьзуя м ехан и зм тран сл яц и и стр ан и ц , W IN D O W S отоб р аж ает участок р асш и р ен н ой п ам яти в об л асть м л ад ш и х ад р есов зад ачи , в р ам ках котор ой раб отает D O S -п р огр ам м а. Т аки м об р азом д л я DOSп р огр ам м ы орган и зуется ви р туал ьн ое ад р есн ое п р остр ан ство, котор ая п р ограм м а н е м ож ет отли чи ть от р еал ьн ой п ам яти , р асп ол ож ен н ой в п р ед елах п ервого м егабай та. Д оп ол н и тел ьн о в р асп ор яж ен и е D O S -п р огр ам м ы м ож ет б ы ть п ред оставл ен а р асш и р ен н ая и ли д оп олн и тел ьн ая п ам ять (и н терф ей сы E M S и X M S ). Р азм ер этой п ам яти м ож н о задать в p if-ф ай л е (см . руковод ство п о W IN D O W S ). Е сл и D O S -п р ограм м а вы д аѐт ком ан д у п р огр ам м н ого п р ер ы ван и я, п р оц ессор п ер еход и т в защ и щ ѐн н ы й р еж и м и уп р авл ен и е п еред аѐтся яд р у W IN D O W S . W IN D O W S эм ул и рует д л я D O S -п р ограм м ы все п р ер ы ван и я D O S и B IO S , ан ал оги чн о том у, как это д елаю т D O S -экстен д ер ы . П оэтом у ви р туал ьн ую D O S -м аш и н у, н а котор ой вы п олн яется DOS-п р ограм м а, м ож н о счи тать D O S -экстен д ер ом . Д л я п р и л ож ен и й W IN D O W S и ви ртуал ьн ой D O S -м аш и н ы до ступ ен и н тер ф ей с D P M I. Э то, в частн ости , озн ачает, что ви ртуал ьн ая D O S -м аш и н а н е п р осто д оп ускает вы п ол н ен и е D O S -п р огр ам м , н о и п р ед оставл яет и м д оп ол н и тел ьн ы е возм ож н ости , которы е он и н е и м ели б ы , есл и бы р аб отал и п од уп р авлен и ем "н астоящ ей " M S DOS. О п и сан и ю эти х д оп олн и тел ьн ы х возм ож н остей и п освящ ен а д ан н ая гл ава кн и ги .
7 .1 . И сп о л ьзо ван и е ф ун кц и й D P M I П р и вед ѐн н ая н и ж е п р ограм м а д ем он стр и рует и сп ол ьзован и е ф ун кц и й и н терф ей са D P M I, оп и сан н ого в п р ед ы д ущ ей гл аве. Э та п р ограм м а м ож ет р аб отать тол ько п од уп р авл ен и ем W IN D O W S вер си й 3.0, 3.1 и тол ько в р асш и р ен н ом р еж и м е н а п роц ессор ах i8038 6 и л и i804 86 . Т акое огр ан и чен и е связан о с тем , что тол ько в р асш и р ен н ом р еж и м е сущ ествует п он яти е ви р туал ьн ой D O S -м аш и н ы , и тол ько в этом р еж и м е D O S -п р ограм м а м ож ет восп ол ьзоваться сер ви сом D P M I. В ы м ож ете такж е п оп р об овать зап усти ть эту п р ограм м у п од уп р авл ен и ем D O S -экстен д ер а, вход ящ его в состав и н тегр и р ован н ой си стем ы р азр аб отки п р огр ам м B orla n d C + + 3.1. Зап усти те п р огр ам м у D P M IR E S .E X E , вход ящ ую в состав B orlan d C + + 3.1, и затем - п р огр ам м у, п р и вед ѐн н ую н и ж е. (D O S -экстен д ер ы , вход ящ и е в состав B orlan d C + + 2.0 и л и 3.0, н е вп олн е совм ести м ы с D P M I, п оэтом у н аш п ри м ер с эти м и си стем ам и р аб отать н е б удет). П р огр ам м а н ачи н ает свою р аб оту с п р овер ки д оступ н ости сер вер а D P M I, п ри этом н е д ел ается н и каки х п р ед п ол ож ен и й отн оси тел ьн о ср ед ств, об есп ечи ваю щ и х п р и сутстви е D P M I. Э то озн ачает, что вы м ож ете п р овери ть р аб отосп особн ость этой п р огр ам м ы в разл и чн ы х сред ах, п ред оставл яю щ и х и н терф ей с D P M I, н ап р и м ер н а ви ртуал ьн ой D O S -м аш и н е оп ер ац и он н ой си стем ы O S/2 вер си и 2.0. П р огр ам м а д ем он стри р ует возм ож н ость вы зова в защ и щ ѐн н ом р еж и м е п р ер ы ван и й р еальн ого р еж и м а. В п ервой части п р огр ам м ы вы вод н а экр ан и ввод с клави атур ы вы п ол н яется в защ и щ ѐн н ом реж и м е, н о с и сп ол ьзован и ем п р и вы чн ы х вам п р ер ы ван и й реал ьн ого р еж и м а. В о втор ой части п р ограм м ы дем он стри р уется н еп оср ед ствен н ая зап и сь в ви д еоп ам ять. П р и этом д л я адр есац и и ви д еоп ам яти п р ограм м а заказы вает сел ектор в таб л и ц е LD T с п ом ощ ью сп ец и ал ьн о п р ед н азн ачен н ы х д л я этого ф ун кц и й D P M I.
Листинг 21. Использование интерфейса DPMI Файл dpmi.c ----------------------------------------------------------#include #include #include #include #include
<stdio.h> <stdlib.h> <dos.h> <stdarg.h>
typedef struct { unsigned long edi, esi, ebp, reserved, ebx, edx, ecx, eax; unsigned flags, es, ds, fs, gs, ip, cs, sp, ss; } RM_INT_CALL; #define MONO_MODE #define BW_80_MODE #define COLOR_80_MODE
0x07 0x02 0x03
// Макро для вычисления линейного адреса исходя из // логического адреса реального режима #define ABSADDR(seg, ofs) \ ((((unsigned long) seg) << 4) + ((ofs) & 0xFFFF)) typedef struct { доступа unsigned unsigned unsigned unsigned unsigned unsigned unsigned } ACCESS;
// байт accessed read_write conf_exp code xsystem dpl present
typedef struct { unsigned unsigned unsigned char ACCESS unsigned } DESCRIPTOR;
: : : : : : :
1; 1; 1; 1; 1; 2; 1;
// дескриптор limit; addr_lo; addr_hi; access; reserved;
// Структура для записи информации о памяти typedef struct { unsigned long avail_block; unsigned long max_page; unsigned long max_locked; unsigned long linadr_space; unsigned long total_unlocked; unsigned long free_pages; unsigned long tot_phys_pages; unsigned long free_linspace; unsigned long size_fp; char reserved[12]; } PMI; void dos_exit(unsigned); void dpmi_init(void);
void set_pmode(void); void cdecl pm_printf(const char *, ...); void pm_puts(char *); void pm_putch(int); int rm_int(unsigned, unsigned , RM_INT_CALL far *); int mi_show(void); unsigned get_sel(void); int set_descriptor(unsigned pm_sel, DESCRIPTOR far *desc); void vi_print(unsigned int x, unsigned int y, char *s, char attr); void vi_hello_msg(void);
void main() { clrscr(); printf("DOS Protected Mode Interface Demo, © Frolov A.V., 1992\n\r" "-------------------------------------------------------\n\r\n\r"); // Определяем текущий видеорежим и // сегментный адрес видеобуфера video_init(); // Инициализируем защищѐнный режим dpmi_init(); printf("\n\r\n\r\n\rДля входа в защищѐнный режим нажмите любую клавишу..."); getch(); // Входим в защищѐнный режим set_pmode(); // Стираем экран и выводим сообщение, находясь в // защищѐнном режиме. Пользуемся выводом через // эмулируемое прерывание реального режима DOS textcolor(BLACK); textbackground(LIGHTGRAY); clrscr(); pm_printf(" Установлен защищѐнный режим работы процессора!\n\r" " ---------------------------------------------\n\r\n\r"); // Выводим текущую информацию о распределении памяти mi_show(); pm_printf("\n\r\n\r\n\r Для продолжения нажмите любую клавишу..."); getch(); clrscr(); // Получаем селектор для непосредственного доступа к видеопамяти alloc_videosel(); pm_printf("\n\r\n\r\n\r Для продолжения нажмите любую клавишу..."); getch(); clrscr();
// Выводим сообщения, пользуясь непосредственным доступом // к видеопамяти vi_hello_msg(); vi_print(0, 3, " Для возврата в реальный режим нажмите любую клавишу", 0x7f); getch(); // Освобождаем полученный селектор free_videosel(); textcolor(LIGHTGRAY);
textbackground(BLACK);
clrscr();
// Завершаем работу программы выходом в DOS dos_exit(0); } // ------------------------------------------------// Процедура для завершения работы программы // ------------------------------------------------void dos_exit(unsigned err) { asm mov ax, err asm mov ah, 04ch asm int 21h } // ------------------------------------------------// Инициализация для работы с DPMI // ------------------------------------------------union REGS inregs, outregs; struct SREGS segregs; void (far *pm_entry)(); unsigned hostdata_seg, hostdata_size, dpmi_flags; void dpmi_init(void) { // Проверяем доступность и параметры сервера DPMI inregs.x.ax = 0x1687; int86x(0x2F, &inregs, &outregs, &segregs); if(outregs.x.ax != 0) { printf("Сервер DPMI не активен."); exit(-1); } // Определяем версию сервера DPMI printf("Версия сервера DPMI: \t\t\t%d.%d\n", outregs.h.dh, outregs.h.dl); // Определяем тип процессора printf("Тип процессора:\t\t\t\t"); if(outregs.h.cl == 2) printf("80286"); else if(outregs.h.cl == 3) printf("80386"); else if(outregs.h.cl == 4) printf("80486"); // Определяем возможность работы с 32-разрядными // программами
dpmi_flags = outregs.x.bx; printf("\nПоддержка 32-разрядных программ:\t"); if(dpmi_flags && 1) printf("ПРИСУТСТВУЕТ"); else printf("ОТСУТСТВУЕТ"); // Определяем размер области памяти для сервера DPMI hostdata_size = outregs.x.si; printf("\nРазмер памяти для сервера DPMI:\t\t%d байт", hostdata_size * 16); // Определяем адрес точки входа в защищѐнный режим FP_SEG(pm_entry) = segregs.es; FP_OFF(pm_entry) = outregs.x.di; printf("\nАдрес точки входа в защищѐнный режим: \t%Fp\n", pm_entry); // Заказываем память для сервера DPMI if(hostdata_size) { if(_dos_allocmem(hostdata_size, &hostdata_seg) != 0) { printf("Мало стандартной памяти"); exit(-1); } } } // -----------------------------------------------// Процедура для установки защищѐнного режима // -----------------------------------------------void set_pmode() { // Входим в защищѐнный режим asm { mov ax, hostdata_seg mov es, ax mov ax, dpmi_flags } (*pm_entry)(); } // // // //
------------------------------------------Процедура вывода символа на экран в защищѐнном режиме -------------------------------------------
void pm_putch(int chr) { // Структура для вызова прерывания должна // быть определена как статическая static RM_INT_CALL regs; static RM_INT_CALL far *pregs = (void far *) 0; // В первый раз инициализируем структуру // и указатель на неѐ if (!pregs) {
pregs = ®s; memset(pregs, 0, sizeof(RM_INT_CALL)); regs.eax = 0x0200; } regs.edx = chr; // Вызываем прерывание DOS для вывода символа rm_int(0x21, 0, pregs); } // // // //
------------------------------------------Процедура вывода строки на экран в защищѐнном режиме -------------------------------------------
void pm_puts(char *str_ptr) { while (*str_ptr) { pm_putch(*str_ptr); str_ptr++; } } // // // //
------------------------------------------Процедура вывода строки на экран в защищѐнном режиме, аналог функции printf() -------------------------------------------
void cdecl pm_printf(const char *fmt, ...) { char buffer[512], *sptr=buffer; va_list marker; va_start(marker, fmt); vsprintf(buffer, fmt, marker); va_end(marker); while (*sptr) pm_putch(*sptr++); } // -------------------------------------------// Процедура вызова прерывания реального режима // -------------------------------------------int rm_int(unsigned int_number, // номер прерывания unsigned params, параметров,
// количество слов //
передаваемых через стек RM_INT_CALL far *rm_call) // адрес структуры // для вызова прерывания { asm { push di push bx push cx mov ax, mov bx, mov cx, les di,
0300h // функция вызова прерывания int_number params; rm_call // запись в ES:DI адреса
структуры int 31h // вызов сервера DPMI jc error mov ax, 0 // нормальное завершение jmp short rm_int_end error:
} asm mov ax, 0
// завершение с ошибкой
rm_int_end:
asm pop cx asm pop bx asm pop di
} // ----------------------------------------------------// Процедура отображает текущее состояние памяти // ----------------------------------------------------int mi_show(void) { PMI minfo, far *minfoptr = &minfo; unsigned long psize, far *psizeptr=&psize; unsigned sel; void far *fp; get_mi(minfoptr); pm_printf(" Информация об использовании памяти\n\r" " ----------------------------------\n\r" "\r\n Размер максимального доступного блока:\t\t%ld байт" "\r\n Доступно незафиксированных страниц:\t\t%ld", minfo.avail_block, minfo.max_page); pm_printf("\r\n Доступно зафиксированных страниц:\t\t%ld" "\r\n Размер линейного адресного пространства:\t%ld страниц" "\r\n Всего имеется незафиксированных страниц:\t%ld", minfo.max_locked, minfo.linadr_space, minfo.total_unlocked); pm_printf("\r\n Количество свободных страниц:\t\t\t%ld" "\r\n Общее количество физических страниц:\t\t%ld", minfo.free_pages, minfo.tot_phys_pages); pm_printf("\r\n Свободное линейное адресное пространство:\t%ld страниц" "\r\n Размер файла/раздела для страничного обмена:\t%ld страниц", minfo.free_linspace, minfo.size_fp); get_page_size(psizeptr); pm_printf("\r\n Размер страницы:\t\t\t\t%ld байт\r\n", psize); // Выводим текущие значения регистров CS и DS asm mov sel,cs pm_printf("\n\r CS = %04.4X, asm mov sel,ds pm_printf("DS = %04.4X",sel);
",sel);
// Выводим значение текущего приоритетного кольца fp = (void far *) main; sel = FP_SEG(fp) & 3; pm_printf("\n\r Номер приоритетного кольца = %d\n\r",sel); } // -----------------------------------------------
// Процедура для получения информации об // использовании памяти // ----------------------------------------------int get_mi(PMI far *minfo) { asm { mov ax, 0500h les di, minfo // ES:DI = адрес структуры DMI int 31h jc error mov ax, 0 jmp short get_mi_end } error: asm mov ax, 1 get_mi_end: } // -----------------------------------------------// Процедура для получения размера страницы памяти // -----------------------------------------------int get_page_size(long far *page_size) { asm { mov ax, 0604h int 31h jc error les di, page_size // ES:DI = адрес page_size mov es:[di], cx mov es:[di+2], bx mov ax, 0 jmp short gps_end } error: asm mov ax, 1 gps_end: } // -------------------------------------------------// Определение сегментного адреса видеопамяти // -------------------------------------------------unsigned crt_mode, crt_seg; int video_init(void) { union REGS r; // Определяем текущий видеорежим r.h.ah=15; int86(0x10,&r,&r); crt_mode = r.h.al; if(crt_mode == MONO_MODE) crt_seg = 0xb000; else if(crt_mode == BW_80_MODE || crt_mode == COLOR_80_MODE) crt_seg = 0xb800; else { printf("\nИзвините, этот видеорежим недопустим."); exit(-1); } }
// --------------------------------------------------// Получение селектора для адресации видеопамяти // --------------------------------------------------char far *vid_ptr; DESCRIPTOR d; unsigned ldtsel; int alloc_videosel(void) { void far *fp; unsigned long addr; FP_SEG(vid_ptr) = crt_seg; FP_OFF(vid_ptr) = 0; pm_printf(" Адрес видеопамяти реального режима:\t %Fp\r\n", vid_ptr); // Получаем свободный LDT-селектор if (! (ldtsel = get_sel())) { pm_printf(" Ошибка при получении селектора"); dos_exit(-1); } pm_printf(" Получен селектор:\t\t\t%04.4X\n\r", ldtsel); // Подготавливаем дескриптор для полученного селектора d.limit = 0x2000; addr = ABSADDR(crt_seg, 0); d.addr_lo = addr & 0xFFFF; d.addr_hi = addr >> 16; d.access.accessed = 0; d.access.read_write = 1; d.access.conf_exp = 0; d.access.code = 0; d.access.xsystem = 1; d.access.dpl = 3; d.access.present = 1; d.reserved = 0;
// // // // //
не использовался разрешены чтение/запись не стек это сегмент данных не системный дескриптор // приоритетное кольцо 3 // сегмент присутствует в памяти
// Устанавливаем дескриптор if (!set_descriptor(ldtsel, &d)) { pm_printf(" Ошибка при установке дескриптора"); getch(); dos_exit(-1); } // Выводим на экран адрес видеопамяти FP_SEG(vid_ptr) = ldtsel; FP_OFF(vid_ptr) = 0; pm_printf(" Адрес видеопамяти защищѐнного режима:\t%Fp\r\n", vid_ptr); } // -------------------------------------------------// Освобождение селектора видеопамяти // -------------------------------------------------int free_videosel(void) { if (!sel_free(ldtsel)) {
pm_printf(" Ошибка при освобождении селектора"); dos_exit(-1); } } // ---------------------------------------------// Получить один селектор в LDT // ---------------------------------------------unsigned get_sel(void) { asm { mov ax, 0 // mov cx, 1 // int 31h jc error jmp short gs_end // } error: asm mov ax, 0 // произошла gs_end: }
получить селектор нужен один селектор AX содержит новый LDT-селектор ошибка
// -------------------------------------------------// Установить дескриптор для LDT-селектора // -------------------------------------------------int set_descriptor(unsigned pm_sel, DESCRIPTOR far *desc) { asm { push di push bx mov ax, 000Ch mov bx, pm_sel les di, desc int 31h jc error mov ax, 1 jmp short sd_end } error: asm mov ax, 0 sd_end: asm pop bx asm pop di } // -------------------------------------------------// Освободить LDT-селектор // -------------------------------------------------int sel_free(unsigned pmodesel) { asm { mov ax, 0001h mov bx, pmodesel int 31h jc error mov ax, 1 jmp short done } error: asm mov ax, 0 done: } // ------------------------------------------------------// Вывод символа непосредственной записью в видеопамять // -------------------------------------------------------
void vi_putch(unsigned int x, unsigned int y ,char c, char attr) { register unsigned int offset; char far *vid_ptr; offset=(y*160) + (x*2); vid_ptr=MK_FP(ldtsel, offset); *vid_ptr++=c; *vid_ptr=attr; } // ------------------------------------------------------// Вывод строки непосредственной записью в видеопамять // ------------------------------------------------------void vi_print(unsigned int x, unsigned int y, char *s, char attr) { while(*s) vi_putch(x++, y, *s++, attr); } // ------------------------------------------------------// Вывод сообщения непосредственной записью в видеопамять // ------------------------------------------------------void vi_hello_msg(void) { vi_print(0, 0, " Демонстрация работы с интерфейсом " "DPMI ¦ © Frolov A.V., 1992 ", 0x30); }
7 .2 . Д р ай вер ы , р ези д ен тн ы е п р о гр ам м ы и WINDOWS В этом р азд ел е, как и в сл ед ую щ ем , м ы н е б уд ем н и чего говор и ть о защ и щ ѐн н ом р еж и м е р аб оты п р оц ессор а. М ы р ассм отр и м зд есь н екотор ы е особ ен н ости , котор ы е н еоб ход и м о учи ты вать п р и разр аб отке р ези д ен тн ы х п р огр ам м и д р ай вер ов, р аб отаю щ и х совм естн о с W IN D O W S. О чен ь часто р ези д ен тн ы е п р огр ам м ы и ли д р ай вер ы п ер ехваты ваю т ап п аратн ое п рер ы ван и е кл ави атур ы и отсл еж и ваю т код ы н аж и м аем ы х кл ави ш , вы п ол н яя те и л и и н ы е д ей стви я п р и н аж ати и зад ан н ы х ком би н ац и й . Н ап ри м ер, д р ай вер "секр етн ого" д и ска N orton D IS K R E E T м ож ет п ри н аж ати и зад ан н ой ком б и н ац и и кл ави ш б л оки р овать д оступ к "секр етн ом у" ди ску, экран у и кл ави атур е. Т ак как W IN D O W S в р асш и р ен н ом р еж и м е и сп ол ьзует соб ствен н ую си стем у кл ави атур н ого ввод а/вы вода, осн ован н ую н а очер ед ях сооб щ ен и й , а такж е р еали зует кон ц еп ц и ю ви р туал ьн ы х м аш и н , н аж ати е акти ви зи р ую щ и х р ези д ен тн ую п р огр ам м у ком би н ац и й клави ш в н еп од ход ящ и й м ом ен т м ож ет н е п ри вести к ж ел аем ом у р езул ьтату и д аж е стать п р и чи н ой "зави сан и я" си стем ы . Е сть д ва возм ож н ы х р еш ен и я этой п р об лем ы . В о -п ер вы х, м ож н о зап рети ть зап уск W IN D O W S , есл и акти вн а р ези д ен тн ая п р огр ам м а и ли др ай вер , н е сп особн ы е р аб отать совм естн о с W IN D O W S . В о -втор ы х, н а вр ем я р аб оты W IN D O W S м ож н о зап р ети ть вы п ол н ен и е р ези д ен тн ой п р огр ам м ой и л и д р ай вер ом сп ец и ф и чески х ф ун кц и й , н есовм ести м ы х с W IN D O W S (н ап ри м ер, зап р ети ть акти ви зац и ю рези д ен тн ой п рогр ам м ы п ри н аж ати и ком б и н ац и и кл ави ш ). П ер ед зап уском W IN D O W S и п ер ед еѐ завер ш ен и ем вы зы ваю тся ф ун кц и и п р ер ы ван и я IN T 2Fh 1605h и 1606 h соответствен н о. В аш а р ези д ен тн ая п р огр ам м а и л и д рай вер м огут п од готови ть соб ствен н ы е об р аб отчи ки д л я эти х п р ер ы ван и й и отсл еж и вать м ом ен ты зап уска W IN D O W S и завер ш ен и я еѐ р аб оты . Ф ун кц и я 1605h вы зы вается п ри зап уске W IN D O W S : Р еги стр ы п ри вы зове п рер ы ван и я:
AX
1605h
ES:BX DS:SI CX DX Бит
0000h:0000h 0000h:0000h 0000h Флаги: 0 = 0, если выполняется инициализация WINDOWS в расширенном режиме; Бит 0 = 1, если выполняется инициализация DOS-экстендера "Microsoft 286 DOS extender" (используется в стандартном режиме работы WINDOWS); Биты 1-15 зарезервированы, их содержимое неопределено.
Р еги стр ы п ер ед возвр атом и з п р ер ы ван и я:
CX 0000h, если WINDOWS может продолжать инициализацию; CX <> 0, если запуск WINDOWS недопустим. Ф ун кц и я 1606h вы зы вается п ри завер ш ен и и W IN D O W S р асш и р ен н ом и ли стан д ар тн ом р еж и м е: Р еги стр ы п ри вы зове п рер ы ван и я:
AX DX
1606h Флаги: Бит 0 = 0, если выполняется завершение WINDOWS, работавшей в расширенном режиме; Бит 0 = 1, если выполняется завершение DOS-экстендера "Microsoft 286 DOS extender"; Биты 1-15 зарезервированы, их содержимое не определено.
О б р аб отчи к ф ун кц и и 1605h м ож ет вы п олн и ть н еоб ход и м ы е д ей стви я, связан н ы е с м од и ф и кац и ей ал гори тм а р аб оты р ези д ен тн ой п р ограм м ы и ли д р ай вер а, а такж е п р и п ом ощ и соответствую щ ей устан овки р еги стра C X м ож ет р азр еш и ть и л и зап р ети ть зап уск W IN D O W S. О б р аб отчи к ф ун кц и и 1606h п ол учает уп р авл ен и е п ри завер ш ен и и р аб о ты W IN D O W S и м ож ет восстан ови ть п р еж н и й ал гори тм р аб оты кри ти чн ой к W IN D O W S р ези д ен тн ой п р огр ам м ы и ли д рай вер а. П р и вед ѐн н ая н и ж е р ези д ен тн ая п р ограм м а п ер ехваты вает п р ер ы ван и е IN T 2Fh и отсл еж и вает ф ун ц и и 1605h и 1606h , вы завая сооб щ ен и е и ож и д ая н аж ати я н а л ю б ую клави ш у п р и зап уске и завер ш ен и и раб оты W IN D O W S :
Листинг 22. Контроль запуска WINDOWS Файл wintsr.asm ----------------------------------------------------------.MODEL tiny .CODE .STARTUP jmp begin old_int2Fh_off old_int2Fh_seg
dw 0 dw 0
; Адрес старого обработчика ; прерывания 2Fh
; Сообщение, которое будет выдано на экран ; при запуске WINDOWS msg_win db 'WINDOWS Started. Press any key...$' msg_win_off dw offset msg_win
; Сообщение, которое будет выдано на экран ; при завершении WINDOWS msg_win1 db 'WINDOWS Ended. Press any key...$' msg_winend_off dw offset msg_win1 ; ; ; ;
Новый обработчик прерывания 2Fh нужен для проверки наличия программы в памяти при ее запуске для предохранения от повторного запуска
new_int2Fh
winstart:
proc
far cmp ax,0FF00h jz installed cmp jz
ax,1605h winstart
cmp jz jmp
ax,1606h winend dword ptr cs:old_int2Fh_off
; запуск WINDOWS push push push push push mov mov push pop int
dx,cs:msg_win_off ah,9 cs ds 21h
mov int
ax,0 16h
pop pop pop pop pop
ds dx cx bx ax
jmp winend:
ax bx cx dx ds
dword ptr cs:old_int2Fh_off
; завершение WINDOWS push push push push push
ax bx cx dx ds
mov mov push pop int
dx,cs:msg_winend_off ah,9 cs ds 21h
mov int
ax,0 16h
pop pop pop pop pop
ds dx cx bx ax
jmp
dword ptr cs:old_int2Fh_off
; Если код функции 0FF00h, то возвращаем ; в регистре AX значение 00FFh. Это признак ; того, что программа уже загружена в память installed: mov iret new_int2Fh
ax,00FFh
endp
;============================== ; Точка входа в программу ; В этом месте начинается выполнение программы begin proc ; Проверяем, не загружена ли уже программа ; в память mov int
ax,0FF00h 2Fh
cmp jne
ax,00FFh first_start
mov mov int
dx,offset msg_load1 ah,9 21h
.EXIT ; Первоначальный запуск программы first_start: ; Запоминаем адрес старого обработчика прерывания 2Fh mov int mov mov
ax,352Fh 21h cs:old_int2Fh_off,bx cs:old_int2Fh_seg,es
push pop
cs ds
; Выводим сообщение mov mov int
dx,offset msg_load ah,9 21h
mov mov int
dx,OFFSET new_int2Fh ax,252Fh 21h
; Завершаем программу и оставляем резидентно ; в памяти часть программы, содержащую новые ; обработчики прерываний mov int
dx,OFFSET begin 27h
begin endp msg_load msg_load1
db 'Резидентная программа WINTSR загружена$' db 'Резидентная программа WINTSR уже загружена$' end
С л ед ую щ ая р ези д ен тн ая п р огр ам м а р аб отает ан ал оги чн о, н о он а зап рещ ает зап уск W IN D O W S . П оп р об уй те, зап усти в п ред вари тел ьн о п р огр ам м у N O W IN T S R , зап усти ть W IN D O W S и п осм отри те, что и з этого п ол учи тся.
Листинг 23. Запрет запуска WINDOWS Файл nowintsr.asm ----------------------------------------------------------.MODEL tiny .CODE .STARTUP jmp begin old_int2Fh_off old_int2Fh_seg
dw 0 dw 0
; Адрес старого обработчика ; прерывания 2Fh
; Сообщение, которое выдаѐтся при запуске WINDOWS msg_win db 'NOWINTSR несовместима с WINDOWS. Нажмите любую клавишу...$' msg_win_off dw offset msg_win ; Сообщение, которое выдаѐтся при завершении WINDOWS msg_win1 db 10,13,'WINDOWS Ended. Press any key...$' msg_winend_off dw offset msg_win1 ; ; ; ;
Новый обработчик прерывания 2Fh нужен для проверки наличия программы в памяти при ее запуске для предохранения от повторного запуска
new_int2Fh
proc
far cmp ax,0FF00h jz installed cmp jz
ax,1605h winstart
cmp jz jmp
ax,1606h winend dword ptr cs:old_int2Fh_off
winstart: push push push push push
ax bx cx dx ds
mov mov push pop int
dx,cs:msg_win_off ah,9 cs ds 21h
mov int
ax,0 16h
pop pop pop pop pop
ds dx cx bx ax
mov jmp
cx,0ffh dword ptr cs:old_int2Fh_off
push push push push push
ax bx cx dx ds
winend:
mov mov push pop int
dx,cs:msg_winend_off ah,9 cs ds 21h
mov int
ax,0 16h
pop pop pop pop pop
ds dx cx bx ax
jmp
dword ptr cs:old_int2Fh_off
; Если код функции 0FF00h, то возвращаем ; в регистре AX значение 00FFh. Это признак ; того, что программа уже загружена в память installed: mov iret
ax,00FFh
new_int2Fh
endp
;============================== ; Точка входа в программу begin proc ; Проверяем, не загружена ли уже программа ; в память mov int
ax,0FF00h 2Fh
cmp jne
ax,00FFh first_start
mov mov int
dx,offset msg_load1 ah,9 21h
.EXIT ; Первоначальный запуск программы first_start: ; Запоминаем адрес старого обработчика прерывания 2Fh mov int mov mov
ax,352Fh 21h cs:old_int2Fh_off,bx cs:old_int2Fh_seg,es
push pop
cs ds
; Выводим сообщение mov mov int
dx,offset msg_load ah,9 21h
mov mov int
dx,OFFSET new_int2Fh ax,252Fh 21h
; Завершаем программу и оставляем резидентно ; в памяти часть программы, содержащую новые ; обработчики прерываний mov int
dx,OFFSET begin 27h
begin endp msg_load msg_load1
db 'Резидентная программа NOWINTSR загружена$' db 'Резидентная программа NOWINTSR уже загружена$' end
7 .3 . С вя зь с W IN D O W S C LIP B O A R D О п ер ац и он н ая си стем а M icrosoft W IN D O W S и м еет чр езвы чай н о уд об н ое ср ед ство об м ен а и н ф ор м ац и ей м еж д у п р огр ам м ам и - C LIP B O A R D . Э то ср ед ство п р едн азн ачен о д л я об м ен а как текстовой , так и гр аф и ческой и н ф ор м ац и ей . Ч то и м еется в ви д у п од об м ен ом и н ф ор м ац и ей ? Н ап ри м ер, вы п од готавл и ваете р еклам н ы й п р осп ект п ри п ом ощ и текстового ред актор а M icrosoft W ord for W IN D O W S . В п р осп ект н еобход и м о п ом ести ть ф отогр аф и ю р екл ам и р уем ого и зд ел и я. И сп ол ьзуя скан ер , вы счи ты ваете ф отогр аф и ю и зап и сы ваете и зоб р аж ен и е в ф ай л . Д ал ее п ол учен н ое и зоб р аж ен и е м ож ет б ы ть отр ед акти р ован о л ю бы м граф и чески м р ед актор ом . В ы д ели в в гр аф и ческом р ед актор е п р ям оугол ьн ы й участок и зоб раж ен и я, вы м ож ете скоп и р овать его в C LIB B O A R D (как во вр ем ен н ую п ам ять). Затем , п ер екл ю чи вш и сь н а текстовы й р ед актор , вы м ож ете встави ть в л ю б ое м есто текста и зоб раж ен и е, взятое и з C LIP B O A R D . В ы м ож ете такж е вы д ели ть часть текста и скоп и р овать еѐ в C LIP B O A R D . Затем этот текст м ож ет б ы ть вставл ен в д р угое м есто того ж е текста и л и вооб щ е в др угой текст, р едакти р уем ы й д руги м р ед актор ом . Е сл и W IN D O W S р аб отает в р асш и р ен н ом р еж и м е, зап усти в об ы чн ую D O S -п р огр ам м у в окн е, вы м ож ете вы д ели ть л ю б ую часть экран а и скоп и р овать еѐ в C LIP B O A R D . Затем сод ер ж и м ое C LIP B O A R D м ож н о встави ть в д р угую DOS-п р ограм м у, есл и он а ож и д ает ввод а с кл ави атур ы . Т аки м обр азом ор ган и зуется п ер ен ос текстовой и н ф ор м ац и и и з од н ой D O S -п рогр ам м ы в д р угую D O S -п р ограм м у. Зам етьте, что об е эти п р огр ам м ы м огут н е зн ать о том , что он и раб отаю т в ср ед е W IN D O W S. О д н ако D O S -п р огр ам м а, р аботаю щ ая в ср ед е W IN D O W S, м ож ет и сам а р аб отать с C LIP B O A R D . П р и этом возм ож ен об м ен и н ф ор м ац и ей (текстовой и ли гр аф и ческой ) м еж д у D O S -п р огр ам м ам и и п р и л ож ен и ям и WINDOWS. Зн ая и н терф ей с D O S -п р огр ам м ы с W IN D O W S C LIP B O A R D , вы л егко см ож ете создавать D O S -п р ограм м ы , об м ен и ваю щ и еся и н ф о р м ац и ей с п р и л ож ен и ям и W IN D O W S . Р асскаж ем о н екотор ы х, н аи б ол ее п ол езн ы х ф ун кц и ях, котор ы е м огут бы ть и сп ол ьзован ы д л я р аб оты с W IN D O W S C LIP B O A R D .
П о л уч и ть вер си ю W in O ld A p О п ер ац и он н ая си стем а W IN D O W S сод ер ж и т сп ец и ал ьн ы е ср ед ства, п р едн азн ачен н ы е д л я р аб оты п од еѐ уп р авл ен и ем D O S -п р огр ам м . В тер м и н ол оги и W IN D O W S D O S -п р огр ам м ы отн осятся к так н азы ваем ы м стар ы м п р и л ож ен и ям W IN D O W S (W IN D O W S O ld A pp lication ). В ер си ю д рай вер а W IN D O W S , п одд ер ж и ваю щ его р аб оту с п р и л ож ен и ям и W in O ld A p , м ож н о узн ать с п ом ощ ью ф ун кц и и 1700h п р ер ы ван и я IN T 2Fh:
Регистры на входе AX 1700h Регистры на выходе: AX 1700h, если данная версия WinOldAp не поддерживает работу с CLIPBOARD. Если AX не равно 1700h, то: AL = верхнее значение весрии (major version); AH = нижнее значение версии (minor version).
О ткр ы ть C LIP B O A R D П ер ед вы п олн ен и ем л ю б ой оп ер ац и и с C LIP B O A R D н еобход и м о откры ть C LIP B O A R D (п о ан ал оги и с обы чн ы м ф ай л ом ):
Регистры на входе AX 1701h Регистры на выходе: AX 0, если CLIPBOARD уже открыт; не равно 0, если операция успешно выполнена.
О ч и сти ть C LIP B O A R D
С п ом ощ ью этой ф ун кц и и м ож н о уд али ть д ан н ы е и з C LIP B O A R D :
Регистры на входе AX 1702h Регистры на выходе: AX 0, если при выполнении операции произошла ошибка; не равно 0, если операция успешно выполнена.
З ап и сать д ан н ы е в C LIP B O A R D С п ом ощ ью этой ф ун кц и и D O S -п р огр ам м а м ож ет вы п ол н и ть зап и сь д ан н ы х в W IN D O W S C LIP B O A R D .
Регистры на входе AX 1703h DX Формат данных, записываемых в CLIPBOARD: 01h текст; 02h графика в формате bitmap; 03h графика в формате metafile picture; 04h SYLK; 05h DIF; 06h графика в формате TIFF; 07h текст в кодировке OEM. ES:BX Указатель на записываемые данные SI:CX Длина записываемых данных Регистры на выходе: AX 0, если при выполнении операции произошла ошибка; не равно 0, если операция успешно выполнена. С п ом ощ ью этой ф ун кц и и м ож н о зап и сы вать как текстовы е, так и гр аф и чески е д ан н ы е. О п ер ац и он н ая си стем а W IN D O W S и сп ол ьзует отл и чн ую о т п ри н ятой в D O S коди р овку си м вол ов. К од и р овка W IN D O W S н азы вается A N S I-код и р овкой , код и р овка D O S - OEM-код и р овкой . Е сл и п ри зап и си текстовы х д ан н ы х в C LIP B O A R D вы зад ади те код и р овку O E M (зап и сав в р еги стр D X зн ачен и е 7), одн овр ем ен н о с зап и сью д ан н ы х б уд ет автом ати чески вы п олн яться п ер екод и р овка и з O E M в A N S I. П ол ьзуясь сл ед ую щ ей таб ли ц ей , вы м ож ете зап и сы вать в C LIP B O A R D гр аф и чески е дан н ы е в ф ор м ате b itm ap : Т аб л и ц а 15. Ф ор м ат C LIP B O A R D д л я B IT M A P -ф ай л ов. С м ещ ен и е, р азм ер
О п и сан и е
00h (2)
ти п (0000h )
02h (2)
ш и р и н а b itm ap в п и ксел ах
04h (2)
вы сота b itm ap в п и ксел ах
06h (2)
кол и чество бай т н а стр оку
08h (1)
кол и чество ц ветовы х п л ан ов
09h (1)
кол и чество ц ветовы х би тов в п и ксел е
0Ah (4)
указател ь н а н ачал о д ан н ы х
0Eh (2)
ш и р и н а в 0.1 m m
10h (2)
вы сота в 0.1 m m
12h
гр аф и чески е д ан н ы е
И счер п ы ваю щ ую и н ф ор м ац и ю о ф ор м атах граф и чески х ф ай л ов W IN D O W S вы м ож ете п олучи ть и з д окум ен тац и и , п оставл яем ой M icrosoft д л я р азр аб отчи ков п р и л ож ен и й .
П о л уч и ть р азм ер C LIP B O A R D
Р азм ер д ан н ы х, зап и сан н ы х в C LIP B O A R D , м ож н о узн ать с п ом ощ ью сл ед ую щ ей ф ун кц и и :
Регистры на входе AX 1704h DX Формат данных: 01h текст; 02h графика в формате bitmap; 03h графика в формате metafile picture; 04h SYLK; 05h DIF; 06h графика в формате TIFF; 07h текст в кодировке OEM. Регистры на выходе: DX:AX 0, если CLIPBOARD не содержит данных в указанном формате; размер записанных данных, включая заголовки.
П р о ч и тать д ан н ы е и з C LIP B O A R D Регистры на входе AX 1705h DX Формат данных, читаемых из CLIPBOARD: 01h текст; 02h графика в формате bitmap; 03h графика в формате metafile picture; 04h SYLK; 05h DIF; 06h графика в формате TIFF; 07h текст в кодировке OEM. ES:BX Указатель на буфер для читаемых данных Регистры на выходе: AX 0, если при выполнении операции произошла ошибка; не равно 0, если операция успешно выполнена.
З акр ы ть C LIP B O A R D П осл е вы п олн ен и я зап и си н еоб ход и м о закр ы ть C LIP B O A R D (точн о такж е, как вы закры ваете ф ай л ). Д л я того, чтоб ы закры ть C LIP B O A R D , вы м ож ете и сп ол ьзовать сл ед ую щ ую ф ун кц и ю :
Регистры на входе AX 1708h Регистры на выходе: AX 0, если произошла ошибка; не равно 0, если операция успешно выполнена.
У стан о в и ть р азм ер д ан н ы х, зап и сан н ы х в C LIP B O A R D П осл е зап и си д ан н ы х в C LIP B O A R D п р ограм м и ст м ож ет огран и чи ть р азм ер C LIP B O A R D :
Регистры на входе AX 1709h SI:CX Размер данных в байтах Регистры на выходе: DX:AX Размер максимального доступного участка памяти
К р и ти ч еск ая сек ц и я
DOS-п р ограм м а, р аб отаю щ ая н а ви ртуал ьн ой м аш и н е W IN D O W S , м ож ет вр е м ен н о зап р ети ть п ер екл ю чен и е зад ач, захвати в п р оц ессор в м он оп ол ьн ое п ол ьзован и е. Д л я этого он а д олж н а вы звать ф ун кц и ю 1681h п р ер ы ван и я IN T 2Fh. П ар ам етр ы зад авать н е н ад о. П р о п р ограм м у, захвати вш ую п р оц ессор , говор ят, что он а вош л а в кри ти ческую секц и ю . Д л я вы ход а и з кр и ти ческой секц и и и возоб н овл ен и я р аботы д и сп етчер а задач W IN D O W S п р огр ам м а д ол ж н а вы звать ф ун кц и ю 1682h п р еры ван и я IN T 2Fh.
П р и м ер п р о гр ам м ы д л я р аб о ты с C LIP B O A R D П р и вед ѐн н ая н и ж е п р огр ам м а д ем он стри р ует зап и сь в C LIP B O A R D кр и ти ческую секц и ю и вы ход и з н еѐ.
и з D O S -п р огр ам м ы , а такж е вход в
В н ачал е п р огр ам м а уб еж д ается в том , что он а зап ущ ен а п од уп р авл ен и ем W IN D O W S , р аб отаю щ ем р асш и р ен н ом р еж и м е. Т ол ько в этом случае д оступ н ы ф ун кц и и д л я р аб оты с C LIP B O A R D .
в
Д ал ее п р ограм м а д ем он стр и рует б л оки р овку м ехан и зм а п ер екл ю чен и я зад ач п р и вход е в кр и ти ческую секц и ю . П осл е этого п р овер яется д оступ н ость C LIP B O A R D . Е сл и C LIP B O A R D д оступ ен , п рогр ам м а п р овер яет, есть л и в н ѐм текстовы е дан н ы е. Е сл и текстовы е д ан н ы е есть, он и чи таю тся и з C LIP B O A R D и вы вод ятся н а экран . Затем C LIP B O A R D очи щ ается и в н его зап и сы вается тестовая стр ока, состоящ ая и з л ати н ски х б укв и си м вол ов ки ри л л и ц ы (д л я п р овер ки вы п олн ен и я п ер екоди р овки и з O E M в ANSI). П осл е зап и си стр оки п р огр ам м а устан авл и вает р азм ер C LIP B O A R D и закр ы вает его. Д алее вы м ож ете зап усти ть п р и л ож ен и е W IN D O W S "C lip b oard " и п осм отр еть р езул ьтат!
Листинг 24. Работа с WINDOWS CLIPBOARD и критической секцией Файл windos.c ----------------------------------------------------------#include <dos.h> #include <stdio.h> #include <malloc.h> char buf[2048], far *fptr = buf; char msg[] = "String for storing(для записи) to WINDOWS clipboard\n\n\n"; void main(void) { union REGS inregs, outregs; struct SREGS segregs; unsigned long clipbrd_size, i; printf("\n\nРабота с WINDOWS CLIPBOARD и критической секцией\n" "© Frolov A. 1992\n\n"); // Проверяем, работает ли программа под управлением // WINDOWS в расширенном режиме. inregs.x.ax = 0x1600; int86( 0x2f, &inregs, &outregs); if (outregs.h.al == 0) { printf("\nТребуется расширенный режим WINDOWS!\n"); exit(-1); } // Выводим на экран версию WINDOWS
printf("Версия WINDOWS - %d.%d\n", outregs.h.al, outregs.h.ah); // Определяем и выводим на экран идентификатор // виртуальной машины, на которой работает // данная программа. inregs.x.ax = 0x1683; int86( 0x2f, &inregs, &outregs); printf("Виртуальная машина - VM%d\n", outregs.x.bx); // Входим в критическую секцию. До выхода из нее // переключение задач в WINDOWS блокировано. inregs.x.ax = 0x1681; int86( 0x2f, &inregs, &outregs); printf("\n\nВошли в критическую секцию.\n" "Попробуйте переключить задачу клавишами ,\n" "затем нажмите любую другую клавишу для выхода\n" "из критической секции\n"); // После нажатия на любую клавишу выходим // из критической секции getch(); inregs.x.ax = 0x1682; int86( 0x2f, &inregs, &outregs); printf("Вышли из критической секции\n"); // Проверяем доступность CLIPBOARD. Если доступен, // выводим версию драйвера WINDOWS, использующегося // для поддержки DOS-программ - WINOLDAP. inregs.x.ax = 0x1700; int86( 0x2f, &inregs, &outregs); if(outregs.x.ax == 0x1700) { printf("\nClipboard недоступна"); exit(-1); } else printf("\nВерсия WINOLDAP - %d.%d", outregs.h.al, outregs.h.ah); // Открываем CLIPBOARD inregs.x.ax = 0x1701; int86( 0x2f, &inregs, &outregs); if(outregs.x.ax == 0x0000) { printf("\nОшибка при открытии Clipboard"); exit(-1); } // Получаем объем данных, находящихся в CLIPBOARD. // Регистр DX равен 1, следовательно, мы будем работать с // текстовыми данными. inregs.x.ax = 0x1704; inregs.x.dx = 0x01; int86( 0x2f, &inregs, &outregs);
// Вычисляем объем данных clipbrd_size = outregs.x.dx << 16l; clipbrd_size += outregs.x.ax; if(clipbrd_size == 0L) printf("\nClipboard пуст"); else printf("\nОбъем данных в Clipboard: %lu\n", clipbrd_size); // // // // // //
Получаем данные из CLIPBOARD. В регистре DX задаем значение 7, что соответствует тексту в кодировке OEM. При этом в процессе передачи данных выполняется перекодировка из представления ANSI (используется в WINDOWS) в представление OEM (используется в DOS) inregs.x.ax inregs.x.dx segregs.es inregs.x.bx
= = = =
0x1705; 0x07; FP_SEG(fptr); FP_OFF(fptr);
int86x( 0x2f, &inregs, &outregs, &segregs); // Выводим содержимое CLIPBOARD, если // там что-нибудь есть. if(outregs.x.ax == 0) printf("\nВ Clipboard ничего нет!"); else { printf("Содержимое Clipborad:\n"); for(i=0l; i < clipbrd_size; i++) { putch(buf[i]); } } // Очищаем CLIPBOARD inregs.x.ax = 0x1702; int86( 0x2f, &inregs, &outregs); // Записываем в CLIPBOARD текстовые данные // в кодировке OEM inregs.x.ax inregs.x.dx inregs.x.si inregs.x.cx
= = = =
0x1703; 0x07; 0x00; strlen(msg);
fptr = msg; segregs.es = FP_SEG(fptr); inregs.x.bx = FP_OFF(fptr); int86x( 0x2f, &inregs, &outregs, &segregs); if(outregs.x.ax == 0) { printf("\nОшибка при записи в Clipboard"); exit(-1); } // Устанавливаем размер CLIPBOARD, равный // длине записанной в него строки inregs.x.ax = 0x1709;
inregs.x.si = 0x00; inregs.x.cx = strlen(msg); int86( 0x2f, &inregs, &outregs); // Закрываем CLIPBOARD inregs.x.ax = 0x1708; int86( 0x2f, &inregs, &outregs); exit(0); }
8. О Б З О Р Л И Т Е Р А Т У Р Ы Архитектура микропроцессора 80286 С.П. Морс, Д.Д. Алберт М.: Радио и связь, 1990 ББК 32.97 М 80 УДК 681.325.5-181.4 К н и га м ож ет и сп ол ьзоваться как сп р авочн и к п о п р оц ессор у i80286 и соп р оц ессор у i80287. П р и вед ен ы все н еобход и м ы е теор ети чески е свед ен и я об ар хи тектуре п р оц ессор а, в том чи сл е свед ен и я о возм ож н остях п р оц ессор а п ри раб оте в защ и щ ѐн н ом р еж и м е. О б р ащ аем ваш е вн и м ан и е н а ош и б ку, д оп ущ ен н ую в д ан н ом и здан и и кн и ги в р азд ел е, п освящ ѐн н ом м ул ьти зад ачн ости . Н а р и сун ке 5.16 -б (стр . 199) р асп ол ож ен и е би та зан ятости B п оказан о н еп р ави л ьн о - этот би т н аход и тся н е в н ул евом разр яд е, а в п ервом .
Микропроцессор 80386 П. Брамм, Д. Брамм М.: Мир, 1990 ББК 32.973-01 Б 87 УДК 681.3 В кн и ге р ассм отр ен ы п р ограм м н ы е и ап п ар атн ы е ср едства п р оц ессор а i80836. П р и вед ен ы свед ен и я об ар хи тектур е п р оц ессор а i808 36, оп и сан ы возм ож н ости п роц ессор а п р и р аб оте в защ и щ ѐн н ом р еж и м е. В этой кн и ге вы см ож ете н ай ти п од р об н ое оп и сан и е ком ан д п р оц ессор а, ф ор м атов си стем н ы х об л астей д ан н ы х и си стем н ы х реги стр ов. П ри ведѐн п р и м ер п р огр ам м ы , составл ен н ой н а язы ке ассем бл ер а, п ер евод ящ ей п р оц ессор в ви р туал ьн ы й р еж и м р аб оты .
Логическое проектирование операционных систем. А. Шоу М: Мир, 1981 ББК 32.973 Ш 81 УДК 681.142.2 К н и га п освящ ен а п р оекти р ован и ю оп ер ац и он н ы х си стем . В н ей д остаточн о п олн о рассм отр ен ы теор ети чески е п р об л ем ы п р оекти р ован и я разл и чн ы х п од си стем , вход ящ и х в оп ерац и он н ы е си стем ы . О соб ен н ы й и н тер ес п р ед ставл яет м атери ал , связан н ы й с м ул ьти зад ачн остью и ор ган и зац и ей взаи м од ей стви я п р оц ессов.
Проектирование операционных систем для малых ЭВМ С. Кейслер М: Мир, 1986 ББК 32.973 К 33 УДК 681.142.2
С од ер ж и м ое кн и ги ан ал оги чн о п р ед ы д ущ ей . П ри вед ен ы алгор и тм ы р аб оты р азли чн ы х п од си стем м ул ьти зад ачн ы х оп ер ац и он н ы х си стем . К ак и п р ед ы д ущ ая кн и га, м ож ет сл уж и ть теор ети чески м введ ен и ем в п р оекти р ован и е оп ерац и он н ы х си стем .
Программирование в Microsoft WINDOWS С.А. Гладков, Г.В. Фролов М.: "ДИАЛОГ-МИФИ", 1992, в двух частях ББК 32.973.1 Г 52 УДК 681.3 К н и га п освящ ен а созд ан и ю п рогр ам м , п р едн азн ачен н ы х д л я вы п ол н ен и я в ср ед е оп ерац и он н ой си стем ы M icrosoft W IN D O W S . В кн и ге п р и вод ятся все свед ен и я, н еоб ходи м ы е вам д л я того чтоб ы п р и ступ и ть к р азр аб отке п р и л ож ен и й W IN D O W S . В се п р и м ер ы п р ограм м зап и сан ы н а д и скете, котор ую м ож н о п ри об р ести вм есте с кн и гой . Т ол ько п р ограм м и р ован и е в ср ед е W IN D O W S д аст вам и сп ол ьзован и я защ и щ ѐн н ого р еж и м а р аб оты п р оц ессор ов.
возм ож н ость п очувствовать все п р еи м ущ ества
Библиотека системного программиста Том 1. Операционная система MS-DOS А.В. Фролов, Г.В. Фролов М.: "ДИАЛОГ-МИФИ", 1991, в трѐх книгах (книги 1-2 и книга 3) ББК 32.973.1 Ф 91 УДК 681.322 П ер вы й том "Б и бл и отеки си стем н ого п р огр ам м и ста" сод ер ж и т свед ен и я о вн утр ен н ей стр уктур е M S -D O S , об и сп ол ьзован и и д окум ен ти р ован н ы х и н екотор ы х н ед окум ен ти р ован н ы х возм ож н остей этой оп ер ац и он н ой си стем ы в п р ограм м ах р еал ьн ого реж и м а р аб оты п р оц ессор а. Б ол ьш ое вн и м ан и е уд ел ен о р ези д ен тн ы м п р огр ам м ам и др ай вер ам . К н и га сод ер ж и т б ол ьш ое чи сло п р огр ам м , котор ы е зап и сан ы н а д и скете, п р од аю щ ей ся вм есте с кн и гой .
Библиотека системного программиста Том 2. Аппаратное обеспечение IBM PC А.В. Фролов, Г.В. Фролов М.: "ДИАЛОГ-МИФИ", 1992, в двух книгах ББК 32.973.1 Ф 91 В о втор ом том е "Б и б л и отеки си стем н ого п р огр ам м и ста" оп и сан о п р акти чески всѐ об оруд ован и е п ер сон ал ьн ого ком п ью тер а IB M P C и его п рогр ам м и р ован и е (кр ом е ви д еоад ап тер ов, котор ы е оп и сан ы в 3 том е "Б и б л и отеки си стем н ого п р огр ам м и ста"). С вед ен и я об ап п аратн ом о б есп ечен и и и его п р огр ам м и р ован и и н а ур овн е п ортов м огут п отр еб оваться вам п р и р азр аб отке соб ствен н ы х д р ай вер ов, р аб отаю щ и х как в реальн ом , так и в защ и щ ѐн н ом р еж и м е. В се п р ограм м ы , п ри вед ѐн н ы е в кн и ге, д оступ н ы н а ди скете, которую м ож н о куп и ть вм есте с к н и гой .
Библиотека системного программиста Том 3. Программирование видеоадаптеров CGA, EGA, VGA. А.В. Фролов, Г.В. Фролов М.: "ДИАЛОГ-МИФИ", 1992 В тр етьем том е "Б и б л и отеки си стем н ого п р огр ам м и ста" оп и сан ы ви д еоад ап теры C G A , E G A , V G A . Д л я каж д ого ти п а ви д еоад ап тера п р и вед ен а и н ф ор м ац и я, н еоб ход и м ая дл я р азраб отки др ай вер ов, в частн ости , р аб отаю щ и х в защ и щ ѐн н ом р еж и м е. П од р об н о оп и сан ы архи тектур а, схем а ор ган и зац и и ви д еоп ам яти , и сп ол ьзован и е р еги стр ов, п р огр ам м и р ован и е н а ур овн е B IO S и D O S . Р ассм отр ен ы осн овн ы е возм ож н ости п о п р ограм м и р ован и ю ви д еоад ап тер ов, п р ед оставл яем ы е би б ли отекам и M icrosoft Q u ick C .
В м есте с кн и гой п р од аѐтся ди скета, сод ер ж ащ ая и сходн ы е тексты всех п р огр ам м .
32-Bit Microprocessors Editor: H.J. Mitchell ISBN 0-00-383067-5 К н и га явл яется сб ор н и ком статей о 32 -р азр яд н ы х м и кроп р оц ессор ах. О п и сан ы ар хи тектур а и особ ен н ости м и кр оп р оц ессор ов с R IS C -архи тектур ой , п р оц ессор W E 32100, тр ан сп ью теры ф и р м ы In m os, м и кр оп р оц ессор i8038 6, M otorola 68020 и Z ilog Z 80000.
80386. Programmer's Reference Manual, INTEL Corp., USA, 1988. Э та и сл едую щ ая кн и ги - ф и р м ен н ы е р уковод ства п о п р оц ессор ам . он и н еоб ход и м ы тем , кто соби р ается р азр аб аты вать ком м ер ческое п р огр ам м н ое об есп ечен и е, р аб отаю щ ее в защ и щ ѐн н ом р еж и м е и и сп ол ьзую щ ее возм ож н ости п осл едн и х м од ел ей п р оц ессор ов ф и р м ы In tel.
INTEL i80486 Microprocessor. Hardware Reference Manual, INTEL Corp., USA, 1990. С п р авочн ое руковод ство п о п р оц ессор у i80486.
Undocumented DOS Andrew Schulman, Raymond J. Michels, Jim Kyle, Tim Paterson, David Maxey, Ralf Braun, 1991. ISBN 0-201-57064-5 К н и га п освящ ен а н ед окум ен ти р ован н ы м возм ож н остям M S -D O S . В п л ан е и сп ол ьзован и я защ и щ ѐн н ого р еж и м а п р ед ставл яет и н тер ес гл ава, п освящ ѐн н ая ви р туал ьн ой D O S -м аш и н е оп ерац и он н ой си стем е W IN D O W S . В н ей р ассказы вается о сп особе вы зова н ед окум ен ти р ован н ы х п р ер ы ван и й M S -D O S и з п р огр ам м ы , р аб отаю щ ей н а ви р туал ьн ой D O S -м аш и н е в защ и щ ѐн н ом р еж и м е. П р огр ам м а п ол ьзуется ф ун кц и ям и D P M I.
9 .1 . Р еги стр E FLA G S В этой таб ли ц е оп и сан ф ор м ат р еги стр а ф л агов д л я п р оц ессор ов i80386 и i804 86 (р еги стр ф л агов п р оц ессора i8028 6 н азы вается FLA G S и п ред ставл яет соб ой м лад ш ее 16 -р азр яд н ое сл ово р еги стр а E FLA G S ): Н ом ер б и та
Н азн ачен и е
0 - CF
Ф л аг п ер ен оса
1-1
Зар езер ви р ован о и р авн о 1
2 - PF
Ф л аг чѐтн ости
3-0
Зар езер ви р ован о и р авн о 0
4 - AF
Ф л аг всп ом огател ьн ого п ер ен оса
5-0
Зар езер ви р ован о и р авн о 0
6 - ZF
Ф л аг н ул я
7 - SF
Ф л аг зн ака
8 - TF
Ф л аг л овуш ки
9 - IF
Ф л аг разр еш ен и я п р ер ы ван и й
10 - DF
Ф л аг н ап р авлен и я
11 - OF
Ф л аг п ер еп ол н ен и я
12-13 - IOPL
У р овен ь п ри ви леги й ввод а/вы вод а
14 - NT
Ф л аг вл ож ен н ой зад ачи
15 - 0
Зар езер ви р ован о и р авн о 0
16 - RF
Ф л аг возобн овл ен и я (тол ько i80386 и i80486)
17 - VM
Ф л аг реж и м а ви ртуал ьн ого п роц ессор а 8086 (тол ько i80386 и i80486)
18 - AC
Ф л аг п р овер ки вы р авн и ван и я (тол ько i80486)
19-31 - 0
Зар езер ви р ован о и р авн о 0
9 .2 . У п р авл я ю щ и е р еги стр ы п р о ц ессо р а i8 0 3 8 6 Р еги стр
Н азн ачен и е
CR0
Р еги стр состоян и я п р оц ессор а
CR1
Зар езер ви р ован
CR2
Л и н ей н ы й ад р ес отказа стр ан и ц ы
CR3
Б азовы й ад р ес катал ога стр ан и ц ы
9 .3 . Ф о р м ат р еги стр а C R 0 п р о ц ессо р а i8 0 3 8 6 Н ом ер б и та
Н азн ачен и е
0 - PE
В кл ю чен и е защ и щ ѐн н ого р еж и м а р аб оты п р оц ессор а.
1 - MP
П р и сутстви е соп р оц ессор а.
2 - EM
Э м ул яц и я соп р оц ессор а.
3 - TS
П ер еклю чен и е зад ачи .
4 - ET
Т и п соп р оц ессор а - i80287 и ли i80387.
5-14
Зар езер ви р ован о
15 - PG
В кл ю чен и е м ехан и зм а тран сляц и и стр ан и ц
9 .4 . Ф о р м ат р еги стр а C R 0 п р о ц ессо р а i8 0 4 8 6 Н ом ер б и та
Н азн ачен и е
0 - PE
В кл ю чен и е защ и щ ѐн н ого р еж и м а р аб оты п р оц ессор а.
1 - MP
П р и сутстви е соп р оц ессор а.
2 - EM
Э м ул яц и я соп р оц ессор а.
3 - TS
П ер еклю чен и е зад ачи .
4 - ET
Т и п соп р оц ессор а - i80287 и ли i80387.
5 - NE
Ч и сл овая ош и б ка. Разр еш ает об р аб отку ош и б ок п ри оп ер ац и ях с п лаваю щ ей точкой .
6-15
Зар езер ви р ован о
16 - WP
Защ и та зап и си . П р и устан овке этого би та стран и ц ы п ол ьзовател я защ и щ ен ы от зап и си в р еж и м е суп ер ви зор а.
17
Зар езер ви р ован о
18 - AM
Б и т м аски вы р авн и ван и я. Э тот би т р азр еш ает и л и зап р ещ ает кон тр ол ь вы р авн и ван и я оп ер ан д ов ком ан д в п ам яти . К он тр ол ь вы равн и ван и я разр еш ѐн тол ько д л я п р огр ам м , р аб отаю щ и х в тр етьем кол ьц е, п р и усл ови и что устан овл ен б и т A M .
19-28
Зар езер ви р ован о
29 - NW
Р азр еш ен и е сквозн ой зап и си . И сп ол ьзуется в м ехан и зм е уп р авл ен и я кэш и р ован и ем .
30 - CD
Зап р ещ ен и е кэш и р ован и я. Е сл и этот би т устан овл ен , вн утрен н ее кэш и р ован и е зап р ещ ен о.
31 - PG
В кл ю чен и е м ехан и зм а тран сляц и и стр ан и ц
9 .5 . Ф о р м ат р еги стр а C R 3 п р о ц ессо р а i8 0 4 8 6 Н ом ер б и та
Н азн ачен и е
0-2
Зар езер ви р ован о
3 - PWT
П р озр ачн ость зап и си н а ур овн е стр ан и ц . И сп ол ьзуется д л я уп р авлен и я зап и сью во вн еш н и й кэш .
4 - PCD
Зап р ещ ен и е кэш и р ован и я н а ур овн е стран и ц . И сп ол ьзуется д л я уп р авл ен и я р аб отой вн еш н его кэш а.
5-31 - PBDR
Б азовы й р еги стр катал ога стран и ц
9 .6 . С и стем н ы е ко м ан д ы п р о ц ессо р о в i80286/i80386/i80486 С и стем н ы е ком ан д ы п р едн азн ачен ы д л я и сп ол ьзован и я, гл авн ы м об р азом , в м од ул ях оп ер ац и он н ы х си стем (в м од ул ях яд р а оп ер ац и он н ой си стем ы , в д р ай вер ах и т.д .). Н екоторы е и з п ер ечи сл ен н ы х н и ж е ком ан д п ол езн ы и п р и р азр аб отке п р и клад н ы х п р огр ам м , раб отаю щ и х в защ и щ ѐн н ом р еж и м е. М ы п ри вед ѐм тол ько кратки й п ер ечен ь осн овн ы х си стем н ы х ком ан д , п од р обн ости вы м ож ете узн ать и з сп р авочн ы х р уковод ств п о п р оц ессор ам (см . сп и сок л и тер атур ы ). К ак п р ави л о, си стем н ы е ком ан д ы м огут и сп ол ьзовать только те п р огр ам м ы , которы е в ы п олн яю тся в н ул евом п р и ви л еги р ован н ом кольц е.
A R P L К о р р екц и я п о л я п р и ви л еги й и н и ц и ато р а зап р о са в сел екто р е Э та ком ан д а и сп ол ьзуется си стем н ы м и м од ул ям и д л я п р овер ки ур овн я зап р аш и ваем ы х п ри ви л еги й в п ер ед аваем ы х и м в качестве п ар ам етр ов сел ектор ов. П р и кл адн ая п р огр ам м а н е д ол ж н а зап р аш и вать п р и ви л еги и , п р евы ш аю щ и е еѐ соб ствен н ы е. П ер вы й оп еран д ком ан д ы - 16-р азр яд н ы й р еги стр и л и сл ово п ам яти , сод ер ж ащ и е зн ачен и е п р овер яем ого сел ектор а. В тор ой оп ер ан д - реги стр, в котор ы й зап и сан о сод ер ж и м ое C S п р и кл ад н ой п р огр ам м ы . Е сл и ком ан д а н е и зм ен ял а ур овен ь п ри ви л еги й , в р еги стр е FLA G S (E FLA G S д л я п р оц ессор ов i80386 и i804 86) устан авл и вается ф лаг н ул я. В п р оти вн ом сл учае этот ф лаг сб р асы вается. П р и м ер и сп ол ьзован и я ком ан д ы :
mov mov arpl
dx, cs ax, TESTED_SELECTOR dx, ax
C LT S С б р о с ф л ага T S п ер екл ю ч ен и я зад ач и в р еги стр е C R 0 К аж д ы й р аз п ри п ер екл ю чен и и зад ачи ф л аг T S устан авли вается в 1. К ом ан да C LT S п озвол яет сб р оси ть этот ф л аг.
LA R З агр узка б ай та п р ав д о ступ а Д л я п р оц ессор а i80286 ком ан д а LA R загруж ает в п ервы й оп ер ан д (реги стр ) б ай т д оступ а д ескри п тор а, вы б и р аем ого вторы м оп ер ан д ом . В тор ой оп ер ан д является сел ектор ом , указы ваю щ и м н а и сп ол ьзуем ы й д ескр и п тор . В п р оц ессор ах i80386 и i8 04 86 ком ан д а LA R и сп ол ьзует в качестве п ервого оп еран д а 32 -р азр яд н ы й реги стр . К р ом е б ай та п р ав д оступ а в этот р еги стр зан осятся б и ты ти п а сегм ен та (9 -11), D P L (14), би т п р и сутстви я (15), б и т д р обн ости (23).
LG D T З агр узка р еги стр а G D T R
К ом ан д а вы п ол н яет и н и ц и ал и зац и ю р еги стра G D T R , указы ваю щ его р асп ол ож ен и е в п ам яти и р азм ер гл об ал ьн ой таб ли ц ы д ескр и п тор ов.
LID T З агр узка р еги стр а ID T R К ом ан д а вы п ол н яет и н и ц и ал и зац и ю д ескр и п тор н ой таб л и ц ы п реры ван и й .
р еги стр а
ID T R , указы ваю щ его
расп ол ож ен и е
в
п ам яти
и
разм ер
LLD T З агр узка р еги стр а LDTR К ом ан д а вы п олн яет и н и ц и ал и зац и ю р еги стра LD T R , указы ваю щ его р асп ол ож ен и е в п ам яти и р азм ер л окал ьн ой таб ли ц ы д ескр и п тор ов.
LM S W З агр узка сл о ва со сто ян и я п р о ц ессо р а С п ом ощ ью этой ком ан д ы м ож н о вы п олн и ть загр узку м лад ш его сл ова р еги стра C R 0 и з р еги стр а - оп ер ан д а ком ан д ы . Э та ком ан д а м ож ет и сп ользоваться д л я п ер екл ю чен и я п р оц ессор а в защ и щ ѐн н ы й п ер еклю чен и я эта ком ан д а н е об есп ечи вает (д аж е д л я п р оц ессор ов i80386 и i80486).
р еж и м . О бр атн ого
LS L З агр узка п р ед ел а сегм ен та К ом ан д а и м еет д ва оп ер ан д а. Гра н и ц а сегм ен та, сел ектор котор ого и сп ол ьзуется в качестве втор ого оп еран д а (зад аѐтся в р еги стре), загр уж ается в р еги стр , указан н ы й в качестве п ер вого оп еран д а.
LT R З агр узка р еги стр а зад ач и К ом ан д а п р едн азн ачен а д л я загр узки р еги стра T R - р еги стр а зад ачи . Загрузка этого реги стра н е п р и вод и т к п ер еклю чен и ю зад ачи .
M O V З агр узка си стем н ы х р еги стр о в Д л я п р оц ессор ов i803 86 и i8 0486 в качестве оп ер ан д ов об ы чн ой ком ан д ы M O V д оп усти м о (н а н ул евом ур овн е п р и ви л еги й ) указы вать си стем н ы е р еги стры - CR0, CR2, CR3, DR0, D R 1, D R 2, D R 3, D R 6, D R 7, T R 6, T R 7. К ом ан да M O V м ож ет б ы ть и сп ол ьзован а п р оц ессор ам и i80386 и i8048 6 д л я возвр ата п р оц ессор а и з защ и щ ѐн н ого р еж и м а в р еал ьн ы й .
S G D T З ап и сь в п ам я ть со д ер ж и м о го р еги стр а G D T R К ом ан д а п озвол яет узн ать текущ ее сод ерж и м ое р еги стр а гл об ал ьн ой д ескри п торн ой табл и ц ы G D T R , обы чн ое еѐ и сп ол ьзую т в си стем н ы х отл ад чи ках.
S ID T З ап и сать в п ам я ть со д ер ж и м о е р еги стр а ID T R К ом ан д а п озвол яет узн ать текущ ее сод ер ж и м ое р еги стра гл об ал ьн ой д ескр и п тор н ой табл и ц ы п р ер ы ван и й ID T R , и сп ол ьзуется в си стем н ы х отлад чи ках.
S LD T З ап и сать в п ам я ть со д ер ж и м о е р еги стр а LD T R К ом ан д а п озволяет узн ать текущ ее сод ер ж и м ое р еги стр а локал ьн ой д ескр и п торн ой табли ц ы LD T R , и сп ол ьзуется в си стем н ы х отл ад чи ках.
S M S W З ап и сать сл о ва со сто ян и я п р о ц ессо р а
К ом ан д а зап и сы вает в п ам ять и л и 16 -б и товы й р еги стр м лад ш ее сл ово р еги стра C R 0 и м ож ет б ы ть и сп ол ьзован а в си стем н ы х отл ад чи ках.
S T R З ап и сь р еги стр а зад ач и К ом ан д а зап и сы вает текущ ее сод ер ж и м ое р еги стр а зад ачи T R в 16 -р азр яд н ую ячей ку п ам яти и ли 16 -р азр яд н ы й р еги стр . М ож ет и сп ол ьзоваться в си стем н ы х отлад чи ках.
V E R R П р о вер и ть сегм ен т н а во зм о ж н о сть ч тен и я V E R W П р о вер и ть сегм ен т н а в о зм о ж н о сть зап и си С п ом ощ ью эти х д вух ком ан д м ож н о п р овери ть д оступ н ость вы б ран н ого сел ектор ом сегм ен та н а чтен и е и зап и сь, соответствен н о. Е сл и оп ер ац и я чтен и я и л и зап и си д оступ н а, ф л аг н ул я Z F устан авл и вается в ед и н и ц у, в п р оти вн ом сл учае он сбр асы вается в н ол ь.
О сн ов н ое н азн ач ен и е этой к ом ан ды - п р едотв р ати ть в озн и к н ов ен и е и ск л ю ч ен и я п о защ и те п ам я ти п р и п оп ы тк е обр ащ ен и я к сегм ен ту. П р еж де ч ем в ы п ол н я ть обр ащ ен и е, п р огр ам м а м ож ет п р ов ер и ть доступ н ость сегм ен та и сдел ать соотв етств ую щ и е в ы в оды . 9 .7 . Н ед о кум ен ти р о в ан н ая ко м ан д а LO A D A LL О казы вается, д л я п р оц ессор а i80286 сущ ествует сп особ п ол учен и я д оступ а к расш и р ен н ой п ам яти , н е п ер еклю чаясь в защ и щ ѐн н ы й р еж и м . Д л я этого м ож ет б ы ть и сп ол ьзован а н ед окум ен ти р ован н ая ком ан д а LO A D A LL, и м ею щ ая код 0F05h (ком ан д а н е и м еет оп еран д ов). Э та ком ан да н е оп и сан а в сп р авочн и ках п о п р оц ессор у i80286, и н ф ор м ац и я о н ей п оставл яется ф и р м ой In tel п о зап р осу. Т е свед ен и я о ком ан д е LO A D A LL, котор ы е п ри вед ен ы в н аш ей кн и ге, п ол учен ы п о эл ектр он н ой п очте и з B B S и м огут б ы ть и сп ол ьзован ы тол ько д л я р асш и р ен и я ваш его кр угозор а и д л я оц ен ки п ол езн ости этой ком ан д ы в ваш и х р азработках. К ом ан д а LO A D A LL п ер вон ачальн о б ы л а зад ум ан а ф и р м ой Intel как тестовая. О д н ако оказал ось, что он а п р и год н а и д л я об р ащ ен и я к р асш и р ен н ой п ам яти в р еал ьн ом р еж и м е. Ш и р око и звестн ы й д рай вер р асш и р ен н ой п ам яти H IM E M .S Y S об р ащ ается в об ласть ад р есов вы ш е п ер вого м егаб ай та и м ен н о с п ом ощ ью ком ан д ы LO A D A LL (а н е п ер еклю чаясь в защ и щ ѐн н ы й р еж и м и возвр ащ аясь обр атн о, как это м ож н о б ы л о б ы п р едп ол ож и ть). К ом ан д а LO A D A LL сокращ ает вр ем я, тр еб уем ое д р ай вер у H IM E M .S Y S н а д оступ к р асш и р ен н ой п ам яти , так как вр ем я н а п ер еклю чен и е в защ и щ ѐн н ы й р еж и м и об р атн ое п ер екл ю чен и е д остаточн о вел и ко п о ср авн ен и ю с вр ем ен ем , н еоб ход и м ы м н а коп и р ован и е дан н ы х и з осн овн ой п ам яти в расш и р ен н ую и л и об р атн о. Д р угое п р и м ен ен и е ком ан д ы - д р ай вер эл ектр он н ого д и ска M icrosoft R A M D R IV E .S Y S и б л ок совм ести м ости оп ер ац и он н ой си стем ы M icrosoft O S /2 вер си и 1.x. С екр ет ком ан д ы LO A D A LL закл ю чается в том , что он а загр уж ает В С Е р еги стр ы п р оц ессора, и м ож ет вы п олн яться в р еал ьн ом р еж и м е. И зм ен яя п ол е б азы р еги стр а кэш а д ескр и п тор а (вн утр ен н и й си стем н ы й р еги стр п р оц ессор а) п р огр ам м а м ож ет обр ати ться к сегм ен ту, л еж ащ ем у за п р едел ам и п ервого м егаб ай та ад ресн ого п р остран ства. К ак м ы уж е говори л и , ком ан да LO A D A LL н е и м еет оп ер ан дов. Р еги стр ы загр уж аю тся и з б уф ера, котор ы й и м еет д л и н у 102 б ай та и д ол ж ен б ы ть п од готовл ен в об л асти п ам яти с ф и зи чески м ад р есом 00800h . Ф ор м ат б уф ер а п р ед ставл ен в сл ед ую щ ей таб ли ц е: Т аб л и ц а 16. Ф ор м ат буф ера дл я ком ан д ы LO A D A LL.
А д р ес
Р еги стр ы п р оц ессор а
800h-805h
Н е и сп ол ьзуется
806h-807h
С л ово состоян и я п р оц ессор а M S W (M ach in e S tatu s W ord)
808h-815h
Н е и сп ол ьзуется
816h-817h
Р еги стр зад ачи T R (T ask R eg ister)
818h-819h
Р еги стр ф л агов
81Ah-81Bh
Р еги стр IP (In stru ction P oin ter)
81Ch-81Dh
С ел ектор LDT (Local Descriptor Table)
81Eh-81Fh
Р еги стр DS (Data Segment Selector)
820h-821h
Р еги стр SS (Stack Segment Selector)
822h-823h
Р еги стр CS (Code Segment Selector)
824h-825h
Р еги стр ES (Extra Segment Selector)
826h-827h
Р еги стр D I (D estin ation In d ex)
818h-829h
Р еги стр S I (S ou rce In d ex)
82Ah-82Bh
Р еги стр B P (B ase P oin ter)
82Ch-82Dh
Р еги стр SP (S tack P oin ter)
82Eh-82Fh
Р еги стр BX (Data Register BX)
830h-831h
Р еги стр DX (Data Register DX)
832h-833h
Р еги стр CX (Data Register CX)
834h-835h
Р еги стр A X (A ccu m u lator)
836h-83Bh
К эш д ескр и п тора E S
83Ch-841h
К эш д ескр и п тора C S
842h-847h
К эш д ескр и п тора S S
848h-84Dh
К еш д ескр и п тора D S
84Eh-853h
Р еги стр GDTR (Global Descriptor Table Register)
854h-859h
К эш д ескр и п тора LD T
85Ah-85Fh
Р еги стр ID T R (In terrup t D escrip tor T ab le R eg ister)
860h-865h
К эш д ескр и п тора TSS (Task State Segment)
Д л я ускор ен и я д оступ а к сод ер ж и м ом у д ескри п тор н ы х табл и ц в п р оц ессор е и м ею тся так н азы ваем ы е тен евы е р еги стр ы и ли р еги стры кэш а д ескр и п тор ов. К огд а п р оц ессор загр уж ает сел ектор в сегм ен тн ы й р еги стр, автом ати чески вы п ол н яется загр узка соответствую щ его р еги стр а кэш а д ескр и п тор а. Н е сущ ествует какого -ли б о и н ого сп особ а загр узи ть кэш д ескр и п тор а явн о и з п р огр ам м ы с п ом ощ ью обы чн ы х ком ан д . О д н ако вы м ож ете восп ол ьзоваться д л я этого ком ан д ой LO A D A LL, п од готови в в оп и сан н ом вы ш е б уф ер е н еоб ход и м ы е зн ачен и я. Ф ор м ат кэш а д ескри п тор а п ри вед ѐн в сл ед ую щ ей таб ли ц е: Т аб л и ц а 17. Ф ор м ат кэш а д ескр и п тор а. С м ещ ен и е п ол я
Н азн ачен и е п ол я
0-2
24-б и товы й б азовы й ад р ес сегм ен та
3
Б ай т д оступ а, его ф ор м ат п олн остью ан ал оги чен ф ор м ату бай та д оступ а д ескр и п тор а, за и склю чен и ем б и та п р и сутстви я. Н а м есте этого би та н аход и тся б и т V A LID . Е сл и этот б и т сб р ош ен в 0, п р и п оп ы тке и сп ол ьзовать д ескр и п тор д л я ад р есац и и п ам яти п р ои зой д ѐт и скл ю чен и е 13 с код ом ош и бки 0.
4-5
16-б и товы й п р ед ел сегм ен та
М ож н о п р ед л ож и ть сл ед ую щ и й алгор и тм и сп ол ьзован и я ком ан д ы LO A D A LL:
Зап р ети ти те п р ер ы ван и я. С охр ан и те гд е-н и буд ь в б уф ер е п р огр ам м ы об л асть п ам яти , н ачи н аю щ ую ся с ад р еса 00800h и и м ею щ ую д л и н у 102 б ай та. Зап ол н и те б уф ер д л я ком ан ды LO A D A LL н еобход и м ы м и зн ачен и ям и д л я всех загр уж аем ы х р еги стр ов. Б азовы й ад р ес в об л асти кэш а д ескр и п тора сегм ен та д ан н ы х д ол ж ен указы вать н а н еобход и м ы й вам участок р асш и рен н ой п ам яти . В ы п ол н и те ком ан ду LO A D A LL. С егм ен т д ан н ы х теп ер ь б уд ет указы вать н а об ласть р асш и рен н ой п ам яти . В ы п ол н и те зап и сь и л и чтен и е об л асти р асш и р ен н ой п ам яти . В осстан ови те б азовы й ад р ес сегм ен та д ан н ы х в кэш е д ескри п тор а дан н ы х в б уф р е, р асп ол ож ен н ом п о ад р есу 00800h . В ы п ол н и те ком ан ду LO A D A LL ещ ѐ раз. В осстан ови те сод ерж и м ое сохр ан ѐн н ого р ан ее б уф ер а. Р азр еш и те п р ер ы ван и я.
П р и вы п ол н ен и и ком ан ды LO A D A LL н е д ел ается н и каки х п р овер ок. В ам н еобход и м о сам и м п озаб оти ться о том , чтоб ы загр уж аем ы е в р еги стры п р оц ессор а зн ачен и я и м ели какой -н и б уд ь см ы сл . В п р оти вн ом случае состоян и е п р оц ессор а окаж ется н еп р ед сказуем ы м . К ом ан д а LO A D A LL м ож ет вы п ол н яться в защ и щ ѐн н ом р еж и м е в н улевом п р и ори тетн ом кол ьц е. Н о, к сож ал ен и ю , эту ком ан д у н ел ьзя и сп ол ьзовать д л я п ер екл ю чен и я п р оц ессор а и з защ и щ ѐн н ого в р еал ьн ы й р еж и м . П р оц ессор i80387 такж е и м еет ком ан д у LO A D A LL, н о еѐ код и вы п ол н яем ы е ф ун кц и и д р уги е.
9 .8 . У ти л и та M E M O S C O P
Д л я оп р ед ел ен и я акти вн ы х и н терф ей сов с защ и щ ѐн н ы м реж и м ом м ож н о и сп ол ьзовать п р ед л агаем ую ути л и ту M E M O S C O P . Э та ути л и та п р овер яет п р и сутстви е всех ур овн ей п од д ерж ки п р огр ам м , р аботаю щ и х в защ и щ ѐн н ом р еж и м е и л и с расш и р ен н ой п ам ятью - от B IO S д о D P M I.
*MEMOSCOP*, © Frolov A.V., 1992 -------------------------------------------------------Файл memoscop.c #include <stdio.h> #include <stdlib.h> #include <dos.h> void main(void) { extern int getcpu(void); unsigned cpu_type, ver; unsigned err; char ver_hi, ver_lo, verems; unsigned hostdata_seg, hostdata_size, dpmi_flags; void (far *pm_entry)(); union REGS regs; struct SREGS segregs; printf("\n*MemoScop* v 1.0, © Frolov A.V., 1992\n" "---------------------------------------\n"); // // // //
Определяем тип центрального процессора. Если программа работает на процессоре i8086, завершаем выполнение, так как в этом случае интерфейсы с защищенным режимом недоступны.
printf("Тип процессора: 80%d\n", (cpu_type = getcpu())); if(cpu_type == 86) { printf("\nНа этом процессоре нам работать не интересно..."); exit(0); } // Определяем размер доступной через прерывание INT 15h // расширенной памяти. printf("\n------------------------ Уровень BIOS ------------------------\n"); regs.h.ah = 0x88; int86(0x15, ®s, ®s); printf("Размер расширенной памяти, доступной через INT 15:" " \t%d Кбайт\n", regs.x.ax); // Проверяем, установлен ли драйвер HIMEM.SYS, // если установлен, выводим его версию. printf("\n------------------------ Уровень XMM -------------------------\n"); if (XMM_Installed()) { printf("Установлен драйвер HIMEM.SYS"); ver = XMM_Version(); printf(", версия: %4X, изменения: %4X\n", (short)ver, (short)(ver >> 16));
printf("Размер свободной расширенной памяти, доступной через XMM:" " %ld Кбайт\n", (long)XMM_QueryLargestFree()); printf("Общий размер расширенной памяти, доступной через XMM:" " \t %ld Кбайт\n", (long)XMM_QueryTotalFree()); } else printf("\nДрайвер HIMEM.SYS не установлен."); printf("\n------------------------ Уровень EMS/VCPI ---------------------\n"); // Проверяем наличие драйвера EMS/VCPI if(ems_init()) printf("Драйвер EMS/VCPI не загружен\n"); else { printf("Драйвер EMS/VCPI загружен, "); // Выводим номер версии драйвера if((err = ems_ver(&verems)) != 0) { printf("\nОшибка %02.2X при определении версии EMM", err); exit(-1); } printf("версия EMM: %02.2X", verems); // Определяем присутствие VCPI и его версию if(vcpi_ver(&ver_hi, &ver_lo) != 0) { printf("\nДрайвер EMM не поддерживает VCPI\n"); exit(-1); } printf("\nВерсия VCPI: %02.2X.%02.2X\n", ver_hi, ver_lo); } printf("\n------------------------ Уровень DPMI -------------------------"); // Проверяем доступность и параметры сервера DPMI regs.x.ax = 0x1687; int86x(0x2F, ®s, ®s, &segregs); if(regs.x.ax != 0) { printf("\nСервер DPMI не активен"); exit(-1); } // Определяем версию сервера DPMI printf("\nВерсия сервера DPMI: \t\t\t%d.%d\n", regs.h.dh, regs.h.dl); // Определяем тип процессора printf("Тип процессора:\t\t\t\t"); if(regs.h.cl == 2) printf("80286"); else if(regs.h.cl == 3) printf("80386");
else if(regs.h.cl == 4) printf("80486"); // Определяем возможность работы с 32-разрядными // программами dpmi_flags = regs.x.bx; printf("\nПоддержка 32-разрядных программ:\t"); if(dpmi_flags && 1) printf("ПРИСУТСТВУЕТ"); else printf("ОТСУТСТВУЕТ"); // Определяем размер области памяти для сервера DPMI hostdata_size = regs.x.si; printf("\nРазмер памяти для сервера DPMI:\t\t%d байт", hostdata_size * 16); // Определяем адрес точки входа в защищѐнный режим FP_SEG(pm_entry) = segregs.es; FP_OFF(pm_entry) = regs.x.di; printf("\nАдрес точки входа в защищѐнный режим: \t%Fp\n", pm_entry); getch(); } /** *.Name *.Title * *.Descr * *.Proto * *.Params * *.Return * * *.Sample **/
ems_init Функция проверяет установку драйвера EMS Эта функция проверяет наличие драйвера EMS int ems_init(void); Не используются 0 - драйвер EMS установлен; 1 - драйвер EMS не установлен. ems_test.c
int ems_init(void) { void (_interrupt _far *EMS_driver_adr)(void); char _far *EMS_driver_name; char test_name[8]; int i; EMS_driver_adr = _dos_getvect(0x67); FP_SEG(EMS_driver_name) = FP_SEG (EMS_driver_adr); FP_OFF(EMS_driver_name) = 10; for(i=0; i<8; i++) test_name[i] = EMS_driver_name[i]; if(strncmp(test_name, "EMMXXXX0", 8) == 0) return(0); else return(1); } /**
*.Name *.Title * *.Descr * * *.Proto * *.Params * * *.Return * *.Sample **/
ems_ver Определение версии драйвера EMS Эта функция возвращает номер версии драйвера EMS в двоично-десятичном формате. int ems_ver(char *ver); char *ver - указатель на байт, в который будет записан номер версии. Номер версии драйвера EMS в формате BCD ems_test.c
int ems_ver(char *ver) { union REGS reg; reg.x.ax = 0x4600; int86(0x67, ®, ®); *ver = reg.h.al; return(reg.h.ah); } int vcpi_ver(char *ver_hi, char *ver_lo) { union REGS reg; reg.x.ax = 0xDE00; int86(0x67, ®, ®); *ver_hi = reg.h.bh; *ver_lo = reg.h.bl; return(reg.h.ah); }
И сход н ы е тексты ф ун кц и й , вы зы ваем ы х ути ли той M E M O S C O P п р и вед ен ы н и ж е:
*MEMOSCOP*, © Frolov A.V., 1992 -------------------------------------------------------Файл cpu.asm DEAL MODEL SMALL P386 PUBLIC
_getcpu
CODESEG PROC
_getcpu
NEAR
; ; ; ; ;
-------------------------------------------------------Пытаемся установить старшую тетраду регистра флагов в 0. Если программа работает на процессоре 8086, в этом байте все биты будут установлены в 1 -------------------------------------------------------mov pushf pop and push popf pushf pop and cmp je
; ; ; ; ; ;
; ; ; ; ; ; ;
dx, 86
; Тип процессора - 8086
bx bh,0Fh bx ax ah,0F0h ah,0F0h cpu_end
-------------------------------------------------------Для теста на процессор 80286 пытаемся установить старшую тетраду регистра флагов в единицы. Если программа выполняется на процессоре 80286, эти биты останутся равными нулю -------------------------------------------------------mov
dx, 286
or push popf pushf pop test jz
bh,0F0h bx
; Тип процессора - 80286
ax ah,0F0h cpu_end
-------------------------------------------------------Для того, чтобы отличить процессор 80386 от процессора 80486, используем бит 18 регистра флагов EFLAGS. Если программа может изменить состояние этого бита, она выполняется на процессоре 80486. В противном случае используется процессор 80386. --------------------------------------------------------
; Созраняем указатель стека mov
edx,esp
; Выравниваем указатель стека для предотвращения ; исключения при установке флага AC and
esp,not 3
; Копируем регистр EFLAGS в регистр EAX pushfd pop
eax
; Сохраняем начальное значение регистра EFLAGS mov
ecx,eax
; Переключаем флаг AC
xor
eax,40000H
; Пытаемся записать измененное значение обратно в регистр ; EFLAGS push popfd
eax
; Копируем регистр EFLAGS в регисрр EAX pushfd pop
eax
; Сравниваем старое и новое значения бита AC xor shr and push
eax,ecx eax,18 eax,1 ecx
; Восстанавливаем регситр EFLAGS popfd ; Восстанавливаем указатель стека mov
esp,edx
; Теперь если программа выполняется на процессоре 80386, ; регистр AX содержит значение 0, а если на процессоре ; 80486 - значение 1. mov
dx,386
test jz
ax,ax cpu_end
mov
ax,486
; Тип процессора - 80386
; Тип процессора - 80486
cpu_end: ENDP
mov ax, dx ret _getcpu
END
Д л я р аб оты с ф ун кц и ям и д рай вер а H IM E M .S Y S и сп ол ьзуется и н терф ей с, оп и сан н ы й н ам и в том е 2 "Б и б л и отеки си стем н ого п р огр ам м си та":
*MEMOSCOP*, © Frolov A.V., 1992 -------------------------------------------------------Файл xmmc.asm ; Это интерфейсный модуль для вызова функций ; XMS из Си. Текст программы рассчитан на ; модель памяти Small.
.model small,c .DATA ; В этом месте будет храниться адрес ; управляющей функции XMM XMM_Control
dd
?
.CODE ; Макроопределения для выполнения соглашения об ; использовании регистров в процедурах Си c_begin macro push mov push push
bp bp,sp si di
pop pop mov pop ret
di si sp,bp bp
endm c_end
macro
endm ; Все процедуры должны быть public public public public public public public public public public public public public public public public public public public public public public ;** ;.Name ;.Title ; ;.Descr ; ; ; ;.Proto ;
XMM_Installed XMM_Version XMM_RequestHMA XMM_ReleaseHMA XMM_GlobalEnableA20 XMM_GlobalDisableA20 XMM_EnableA20 XMM_DisableA20 XMM_QueryA20 XMM_QueryLargestFree XMM_QueryTotalFree XMM_AllocateExtended XMM_FreeExtended XMM_MoveExtended XMM_LockExtended XMM_UnLockExtended XMM_GetHandleLength XMM_GetHandleInfo XMM_ReallocateExtended XMM_RequestUMB XMM_ReleaseUMB XMM_Installed Получение адреса управляющей функции Эта функция проверяет наличие драйвера HIMEM.SYS и в случае его присуствия запоминает адрес управляющей функции. unsigned XMM_Installed(void);
;.Params ; ;.Return ; ; ;.Sample ;**
Не используются 0 - драйвер HIMEM.SYS не установлен; 1 - драйвер HIMEM.SYS установлен. xms_test.c
XMM_Installed proc near c_begin int cmp
int mov mov
mov
ax, 4300h
jne
NotInstalled
2fh al, 80h mov ax, 4310h 2fh word ptr [XMM_Control], bx word ptr [XMM_Control+2], es mov ax,1 jmp Installed
NotInstalled: mov
ax, 0
Installed: c_end XMM_Installed endp ;** ;.Name ;.Title ; ;.Descr ; ; ;.Proto ; ;.Params ; ;.Return ; ; ; ;.Sample ;**
XMM_Version Определение версии драйвера HIMEM.SYS Эта функция определяет версию драйвера HIMEM.SYS long
XMM_Version(void);
Не используются Номер версии в младших 16 битах, номер изменений - в старших 16 битах возвращаемого значения xms_test.c
XMM_Version proc near push si push xor call mov
di ah,ah [XMM_Control] dx, bx
pop di pop si ret XMM_Version endp ;** ;.Name ;.Title ; ;.Descr
XMM_RequestHMA Запросить область HMA Эта функция пытается зарезервировать для
; ; ;.Proto ; ;.Params ; ; ; ;.Return ; ; ; ;.Sample ;**
программы область HMA long
XMM_RequestHMA(unsigned space);
space - размер требуемой области для TSR-программы или драйвера, 0xffff для прикладной программы; < 0 - область HMA не назначена программе, код ошибки находится в старшем байте. 0L - область HMA назначена программе. xms_test.c
XMM_RequestHMA proc near c_begin mov ah, 1 mov dx, [bp+4] call [XMM_Control] xor dx, dx dec ax jz @success mov dh, bl @success: c_end XMM_RequestHMA endp ;** ;.Name ;.Title ; ;.Descr ; ; ;.Proto ; ;.Params ; ;.Return ; ; ; ;.Sample ;**
XMM_ReleaseHMA Освободить область HMA Эта функция пытается освободить область HMA long
XMM_ReleaseHMA(void);
Не используются < 0 - область HMA не освобождена, код ошибки находится в старшем байте. 0L - область HMA освобождена. xms_test.c
XMM_ReleaseHMA proc near mov call xor dec mov @success1:
c_begin ah, 2 [XMM_Control] dx, dx ax jz @success1 dh, bl c_end
XMM_ReleaseHMA endp ;** ;.Name ;.Title ;
XMM_GlobalEnableA20 Глобальное разрешение линии A20
;.Descr ; ; ;.Proto ; ;.Params ; ;.Return ; ; ; ;.Sample ;**
Эта функция разрешает программе, получившей доступ к области HMA использовать линию A20 long
XMM_GlobalEnableA20(void);
Не используются < 0 - линия A20 не включена, код ошибки находится в старшем байте. 0L - линия A20 включена. xms_test.c
XMM_GlobalEnableA20 proc near c_begin mov ah, 3 call [XMM_Control] xor dx, dx dec ax jz @success2 mov dh, bl @success2: c_end XMM_GlobalEnableA20 endp ;** ;.Name ;.Title ; ;.Descr ; ; ;.Proto ; ;.Params ; ;.Return ; ; ; ;.Sample ;**
XMM_GlobalDisableA20 Глобальное запрещение линии A20 Эта функция запрещает программе, получившей доступ к области HMA использовать линию A20 long
XMM_GlobalDisableA20(void);
Не используются < 0 - линия A20 не выключена, код ошибки находится в старшем байте. 0L - линия A20 выключена. xms_test.c
XMM_GlobalDisableA20 proc near c_begin mov ah, 4 call [XMM_Control] xor dx, dx dec ax jz @success3 mov dh, bl @success3: c_end XMM_GlobalDisableA20 endp ;** ;.Name ;.Title ; ;.Descr ; ;
XMM_EnableA20 Локальное разрешение линии A20 Эта функция разрешает программе управлять областью расширенной памяти.
;.Proto ; ;.Params ; ;.Return ; ; ; ;.Sample ;**
long
XMM_EnableA20(void);
Не используются < 0 - линия A20 не включена, код ошибки находится в старшем байте. 0L - линия A20 включена. xms_test.c
XMM_EnableA20 proc near mov call xor dec mov @success4:
c_begin ah, 5 [XMM_Control] dx, dx ax jz @success4 dh, bl c_end
XMM_EnableA20 endp ;** ;.Name ;.Title ; ;.Descr ; ; ;.Proto ; ;.Params ; ;.Return ; ; ; ;.Sample ;**
XMM_DisableA20 Локальное запрещение линии A20 Эта функция запрещает программе управлять областью расширенной памяти. long
XMM_DisableA20(void);
Не используются < 0 - линия A20 не выключена, код ошибки находится в старшем байте. 0L - линия A20 выключена. xms_test.c
XMM_DisableA20 proc near mov call xor dec mov @success5:
c_begin ah, 6 [XMM_Control] dx, dx ax jz @success5 dh, bl c_end
XMM_DisableA20 endp ;** ;.Name ;.Title ; ;.Descr ; ; ;.Proto ; ;.Params
XMM_QueryA20 Проверить состояние линии A20 Эта функция проверяет доступность линии A20 long
XMM_QueryA20(void);
Не используются
; ;.Return ; ; ; ; ;.Sample ;**
< 0 - ошибка, код ошибки находится в старшем байте. 0L - линия A20 выключена, 1L - линия A20 включена. xms_test.c
XMM_QueryA20 proc near mov call xor or mov @success6:
c_begin ah, 7 [XMM_Control] dx, dx ax, ax jnz @success6 dh, bl c_end
XMM_QueryA20 endp ;** ;.Name ;.Title ; ;.Descr ; ; ; ;.Proto ; ;.Params ; ;.Return ; ; ; ;.Sample ;**
XMM_QueryLargestFree Определить максимальный размер блока Эта функция возвращает размер максимального непрерывного блока расширенной памяти, который доступен программе. long
XMM_QueryLargestFree(void);
Не используются < 0 - ошибка, код ошибки находится в старшем байте. >= 0 - размер блока. xms_test.c
XMM_QueryLargestFree proc near c_begin mov ah, 8 call [XMM_Control] xor dx, dx or ax, ax jnz @success7 mov dh, bl @success7: c_end XMM_QueryLargestFree endp ;** ;.Name ;.Title ; ;.Descr ; ; ;.Proto ; ;.Params ;
XMM_QueryTotalFree Определить размер расширенной памяти Эта функция возвращает размер всей имеющейся расширенной памяти. long
XMM_QueryTotalFree(void);
Не используются
;.Return ; ; ; ;.Sample ;**
< 0 - ошибка, код ошибки находится в старшем байте. >= 0 - размер расширенной памяти. xms_test.c
XMM_QueryTotalFree proc near c_begin mov ah, 8 call [XMM_Control] or ax, ax mov ax, dx mov dx, 0 jnz @success8 mov dh, bl @success8: c_end XMM_QueryTotalFree endp ;** ;.Name ;.Title ; ;.Descr ; ; ; ;.Proto ; ;.Params ; ; ;.Return ; ; ; ; ;.Sample ;**
XMM_AllocateExtended Запросить блок расширенной памяти Эта функция выделяет программе блок расширенной памяти, в случае успеха возвращает индекс полученного блока. long XMM_AllocateExtended(unsigned space); space - размер требуемого блока памяти в килобайтах; < 0 - блок не распределен, код ошибки находится в старшем байте. > 0L - младший байт содержит индекс полученного блока памяти. xms_test.c
XMM_AllocateExtended proc near c_begin mov ah, 9 mov dx, [bp+4] call [XMM_Control] or ax, ax mov ax, dx mov dx, 0 jnz @success9 mov dh, bl @success9: c_end XMM_AllocateExtended endp ;** ;.Name ;.Title ; ;.Descr ; ;
XMM_FreeExtended Освободить блок расширенной памяти Эта функция освобождает блок расширенной памяти, полученный функцией XMM_AllocateExtended().
; ;.Proto ; ;.Params ; ;.Return ; ; ; ;.Sample ;**
long XMM_FreeExtended(unsigned handle); handle - индекс освобождаемого блока памяти; < 0 - блок не распределен, код ошибки находится в старшем байте. 0L - блок освобожден. xms_test.c
XMM_FreeExtended proc near c_begin mov ah, 0Ah mov dx, [bp+4] call [XMM_Control] xor dx, dx dec ax jz @successA mov dh, bl @successA: c_end XMM_FreeExtended endp ;** ;.Name ;.Title ; ;.Descr ; ; ; ; ; ; ; ; ; ; ; ;.Proto ; ; ;.Params ; ; ; ;.Return ; ; ; ;.Sample ;**
XMM_MoveExtended Копировать блок расширенной памяти Эта функция копирует блок расширенной памяти, используя структуру struct XMM_Move: struct XMM_Move unsigned long unsigned short unsigned long unsigned short unsigned long }; long
{ Length; SourceHandle; SourceOffset; DestHandle; DestOffset;
XMM_MoveExtended(struct XMM_Move *move_descr);
struct XMM_Move *move_descr указатель на структуру, описывающую что, откуда и куда надо копировать. < 0 - ошибка при копировании, код ошибки находится в старшем байте. 0L - блок скопирован успешно. xms_test.c
XMM_MoveExtended proc near c_begin mov ah, 0Bh mov si, [bp+4]; call [XMM_Control] xor dx, dx dec ax jz @successB
mov @successB:
dh, bl c_end
XMM_MoveExtended endp ;** ;.Name ;.Title ; ;.Descr ; ; ; ;.Proto ; ;.Params ; ;.Return ; ; ; ; ; ;.Sample ;**
XMM_LockExtended Заблокировать блок расширенной памяти Эта функция блокирует блок расширенной памяти и возвращает 31 разряд его физического адреса. long XMM_LockExtended(unsigned handle); handle - индекс блокируемого блока памяти; < 0 - блок не заблокирован, код ошибки находится в старшем байте. > 0L - блок заблокирован, функция возвращает физический адрес блока памяти. xms_test.c
XMM_LockExtended proc near c_begin mov ah, 0Ch mov dx, [bp+4] call [XMM_Control] xchg ax, bx dec bx jz XMML_Success mov dh, al XMML_Success: c_end XMM_LockExtended endp ;** ;.Name ;.Title ; ;.Descr ; ; ;.Proto ; ;.Params ; ;.Return ; ; ; ;.Sample ;**
XMM_UnLockExtended Разблокировать блок расширенной памяти Эта функция разблокирует блок расширенной памяти. long XMM_UnLockExtended(unsigned handle); handle - индекс блока памяти; < 0 - блок не разблокирован, код ошибки находится в старшем байте. 0L - блок разблокирован. xms_test.c
XMM_UnLockExtended proc near c_begin mov ah, 0Dh mov dx, [bp+4] call [XMM_Control] xor dx, dx
dec
ax jz
mov @successC:
@successC
dh, bl c_end
XMM_UnLockExtended endp ;** ;.Name ;.Title ; ;.Descr ; ; ;.Proto ; ;.Params ; ;.Return ; ; ; ;.Sample ;**
XMM_GetHandleLength Получить длину блока расширенной памяти Эта функция возвращает длину блока расширенной памяти по его индексу. long XMM_GetHandleLength(unsigned handle); handle - индекс блока памяти; < 0 - произошла ошибка, код ошибки находится в старшем байте. > 0L - длина блока в килобайтах. xms_test.c
XMM_GetHandleLength proc near c_begin mov ah, 0Eh mov dx, [bp+4] call [XMM_Control] or ax, ax mov ax, dx mov dx, 0 jnz @successD mov dh, bl @successD: c_end XMM_GetHandleLength endp ;** ;.Name ;.Title ; ;.Descr ; ; ; ; ;.Proto ; ;.Params ; ;.Return ; ; ; ; ; ;.Sample ;**
XMM_GetHandleInfo Получить информацию о блоке расширенной памяти Эта функция возвращает общее количество индексов в системе и содержимое счетчика блокирования для заданного индекса. long XMM_GetHandleInfo(unsigned handle); handle - индекс блока памяти; < 0 - произошла ошибка, код ошибки находится в старшем байте. > 0L - младший байт - общее количество индексов в системе; старший байт - счетчик блокирования. xms_test.c
XMM_GetHandleInfo proc near c_begin
mov call mov or mov mov @successE:
ah, 0Eh mov [XMM_Control] dx, bx ax, ax ax, dx mov jnz dh, bl
dx, [bp+4]
dx, 0 @successE
c_end XMM_GetHandleInfo endp ;** ;.Name ;.Title ; ;.Descr ; ; ;.Proto ; ; ;.Params ; ; ; ;.Return ; ; ; ; ;.Sample ;**
XMM_ReallocateExtended Изменить размер блока расширенной памяти Эта функция изменяет размер выделенного блока расширенной памяти. long XMM_ReallocateExtended(unsigned handle, unsigned new_size); handle - индекс блока памяти; new_size - новый размер блока памяти в килобайтах; < 0 - блок не распределен, код ошибки находится в старшем байте. > 0L - младший байт содержит индекс полученного блока памяти. xms_test.c
XMM_ReallocateExtended proc near c_begin mov ah, 0Fh mov dx, [bp+4] mov bx, [bp+6] call [XMM_Control] xor dx, dx dec ax jz @successF mov dh, bl @successF: c_end XMM_ReallocateExtended endp ;** ;.Name ;.Title ; ;.Descr ; ; ;.Proto ; ;.Params ; ; ;.Return ;
XMM_RequestUMB Запросить область UMB Эта функция пытается зарезервировать для программы область UMB long
XMM_RequestUMB(unsigned space);
space - размер требуемой области в параграфах; < 0 - область UMB не назначена программе, код ошибки находится в старшем байте;
; ; ; ; ; ; ; ;.Sample ;**
> 0L
максимальный размер доступного блока в младшем слове (16 разрядов); - область UMB назначена программе, младшее слово содержит сегмент блока UMB, старший - размер выделенного блока UMB.
xms_test.c
XMM_RequestUMB proc near c_begin mov
ah, 10h
mov dx, call [XMM_Control] xchg bx, dec bx jz RUMB_Success xchg ax, mov dh, RUMB_Success: c_end XMM_RequestUMB endp ;** ;.Name ;.Title ; ;.Descr ; ; ;.Proto ; ;.Params ; ;.Return ; ; ; ;.Sample ;**
[bp+4] ax dx dl
XMM_ReleaseUMB Освободить область UMB Эта функция пытается освободить область UMB long
XMM_ReleaseUMB(unsigned segment);
segment - сегмент освобождаемого блока UMB* < 0 - область UMB не освобождена, код ошибки находится в старшем байте. 0L - область UMB освобождена. xms_test.c
XMM_ReleaseUMB proc near c_begin mov
ah, 11h
mov dx, [bp+4] call [XMM_Control] xor dx, dx dec ax jz @success10 mov dh, bl @success10: c_end XMM_ReleaseUMB endp END
9 .9 . З ащ и та п р о гр ам м о т о тл ад ки Е сл и вы р азр абаты ваете п р огр ам м н ое об есп ечен и е, защ и щ ѐн н ое от н есан кц и он и р ован н ого коп и р ован и я, вам н еобход и м о п озаб оти ться о том , чтобы п отен ц и ал ьн ы е взлом щ и ки ("кр акер ы " и "хакер ы ") н е см огли вы п ол н и ть
п р огр ам м у и н стал л яц и и п од уп р авл ен и ем отл ад чи ка. Е сли взл ом щ и к см ож ет "п од гл яд еть" за р аб отой ваш ей п р огр ам м ы , он р ан о и ли п оздн о р азгад ает ваш зам ы сел и свед ѐт н а н ет все ваш и уси л и я п о защ и те п р ограм м ы от коп и р ован и я. В тр етьей кн и ге п ервого том а "Б и б ли отеки си стем н ого п ро гр ам м и ста" м ы и зл агал и н екотор ы е сообр аж ен и я п о ор ган и зац и и защ и ты п р огр ам м от н есан кц и он и р ован н ого коп и р ован и я. М ы , в частн ости , р ассказал и о н екотор ы х м етод ах защ и ты п р огр ам м от отлад ки - и сп ол ьзован и е тай м ер а, вн утр ен н ей очер еди ком ан д п р оц ессор а и д р уги е. Защ и щ ѐн н ы й р еж и м р аб оты п р оц ессор а откр ы вает п ер ед вам и н овую возм ож н ость. В озьм и те л ю б ую п р огр ам м у, п р и вед ѐн н ую в этой кн и ге и п оп ы тай тесь зап усти ть еѐ п од уп р авл ен и ем какого -л и бо отл ад чи ка (н ап ри м ер , п оп р об уй те T u rb o D eb u g g er и л и C od e V iew ). В сѐ б уд ет хорош о д о тех п ор , п ока ваш а п р огр ам м а н е п оп ы тается загр узи ть р еги стр ID T R п р и п ом ощ и ком ан д ы LID T . П осл е вы п ол н ен и я этой ком ан д ы отл ад чи к зави сает и ед и н ствен н ое ср ед ство вн овь ож и ви ть ком п ью тер - н аж ать н а кн оп ку сб р оса, расп ол ож ен н ую н а си стем н ом б л оке. П р и чи н а очеви дн а - и зм ен и ли сь р асп ол ож ен и е и ф ор м ат д ескр и п тор н ой таб ли ц ы п р ер ы ван и й . О н а п од готовлен а д л я р аб оты в защ и щ ѐн н ом р еж и м е, н о отлад чи к р аб отает в р еал ьн ом р еж и м е. П оэтом у об р аб отка всех п р ер ы ван и й , в том чи сл е и от кл ави атуры , н евозм ож н а. И д ея и сп ол ьзован и я защ и щ ѐн н ого р еж и м а р аб оты п р оц ессор а п р и созд ан и и п р огр ам м , защ и щ ѐн н ы х от н есан кц и он и р ован н ого коп и рован и я, очеви д н а. И сп ол ьзуя п р и м ер ы п р огр ам м , п р и вед ѐн н ы е в кн и ге, вы см ож ете во вр ем я р аб оты п р огр ам м ы и н стал л яц и и п ер евести п р оц ессор в защ и щ ѐн н ы й р еж и м и вы п олн и ть часть р аб оты п о и н стал л яц и и в защ и щ ѐн н ом р еж и м е. Н ап ри м ер, п ер ед п ер екл ю чен и ем в защ и щ ѐн н ы й р еж и м вы м ож ете п од готови ть в п ам яти м асси в кон тр ол ьн ой и н ф ор м ац и и . Р асш и ф р овка и п р овер ка этого м асси ва, а такж е зап и сь дан н ы х в н естан д артн ы е сектора и н стал л яц и он н ой д и скеты м огут вы п ол н яться в защ и щ ѐн н ом р еж и м е. П р и этом , п ол ьзуясь об ы чн ы м и отл ад чи кам и , н евозм ож н о оп р ед ел и ть д ей стви я, вы п олн яем ы е в защ и щ ѐн н ом р еж и м е. О соб ен н о, есл и участок п р огр ам м ы , р аб отаю щ и й в защ и щ ѐн н ом р еж и м е, заш и ф р ован . Д ал ее п р оц ессор м ож н о верн уть в р еал ьн ы й р еж и м и п р од ол ж и ть п р оц есс и н стал л яц и и . Н аход ясь в защ и щ ѐн н ом р еж и м е, вы м ож ете чи тать и п и сать сектор а д и скеты тол ько и сп ол ьзуя ур овен ь п ор тов ввод а/вы вод а кон тр ол л ер а ф л оп п и -д и ска. П р ограм м и р ован и е кон тр олл ер а ф л оп п и -д и ска оп и сан о в тр етьей кн и ге п ервого том а "Б и б л и отеки си стем н ого п р огр ам м и ста". О б р аб аты вать п рер ы ван и я в защ и щ ѐн н ом р еж и м е вы уж е ум еете. О чеви д н ы й н ед остаток п р и м ен ен и я защ и щ ѐн н ого р еж и м а п р и ор ган и зац и и защ и ты от коп и р ован и я закл ю ча ется в н еобход и м ости и сп ол ьзован и я п р оц ессор ов i80286, i80 386 и л и i8048 6. Э то озн ачает, что указан н ы й м етод н еп ри год ен д л я ком п ью тер ов IB M P C /X T , и сп ользую щ и х п р оц ессор i8086 и л и i8088. О д н ако в п осл ед н ее вр ем я бол ьш и н ство п р огр ам м н ы х ком п л ексов тр ебует н ал и чи я в ком п ью тер е п о кр ай н ей м ер е п р оц ессор а i80286, п оэтом у указан н ы м н ед остатком м ож н о п рен еб р ечь. К том у ж е сл ед ует учесть р езкое увел и чен и е стой кости и н сталл ятор а, р аб отаю щ его в защ и щ ѐн н ом р еж и м е, к п оп ы ткам взл ом а.