З ащ и щ ен н ы й р еж и м п р о ц ессо р о в In tel 80286/80386/80486 © А л ексан д р Ф р ол ов, Гри гор и й Т ом 6, М ...
26 downloads
408 Views
2MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
З ащ и щ ен н ы й р еж и м п р о ц ессо р о в 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 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)) 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 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
idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc idt_struc
; --------------- Вентили аппаратных прерываний --------------; 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)) <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
; Область памяти для инициализации 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)) <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 .
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) > 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