Mis on kaitstud režiim ja millega see kaasas on? Inteli protsessorite lülitamine kaitstud režiimile Lülitumine komplekteerija kaitstud režiimi

rPUME OEDEMSHOPZP RETETSCHB CHOPCHSH NPZH PVTBDPCHBFSH CHBU OPCHSHCHN CHSHCHRKHULPN UCHPEK TBUUSCHMLY.

YFBL, LBL CHSH RPNOIFE, CH TEBMSHOPN TETSYNE TBVPFSCH RTPGEUUPTB OBN DPUFHREO CHUEZP MYYSH 1 NEZBVBKF BDTEUOPZP RTPUFTBOUFCHB (Yъ LPPPTSCHI PVSHYUUD Kf). fBL LFP Y VSHMP PE CHTENEOB RETCHSCHI RTPGEUUPTPCH CHTPDE 8086, OP RPUFEREOOOP PVIENB PRETBFYCHOPK RBNSFY UFBMP OE ICHBFBFSH. h FP CE CHTENS FTEVPCHBMPUSH UPITBOIFSH RPMOHA PVTBFOKHA UPCHNEUFYNPUFSH, YUFPVSHCH 16-TBTSDOSH PRETBGYPOOSCH UYUFENSCH CHTPDE DOS UNPZMY OPTNBMSHOP TBVPFBFSH. rПФПНХ VSHHM CHCHEDIO OPCHSHCHK TETSYN TBVPFSCH RTPGEUUPTB – ЪBEYEEЈOOOSCHK TETSYN. rPUME RETEIPDB CH OEZP DMS BDTEUBGYY YURPMSH'HEFUS OE 16, B 32 YMY DBCE 64 VYFB, B UEZNEOFSHCH UFBTPN RPOINBOY YUYUEBAF. fBLCE DPVBCHMSAFUS ЪBEIFOSCH NEIBOINSHCH (YNEOOOP RPFPNH ЪBEEYEYOOOSCHK TETSYN), YuFPVSH SDTP pu VShchMP YЪPMYTPCHBOOP PF RTYMPTSEOYK Y NPZMP YNY UCHPVPDOP HRTBCHMSFSH. lFP OEPVIPDYNP MAVPK RPMOPGEOOOPK NOPZPBBDBUOPK UYUFEN.

TEAVE FPZP-st, UFP DPVBCHMSEFUS CH TEBMSHOPN TETSYNE TEAVE RTPGEUUPTBBI, LPFPTSHCHE RPDDETSYCHBAF 32-VYFOSCHK BDTEU (i386 Y CHCHYE) kohta - DPVBCHMSAFUS OPCHSHHE TEZYBTUFTSCHEEX, TEBHECBTAFUSSCHHE, TEZYEBTOFTSHEEX, EDX, ESP, EBP, EIP, ESI, EDI, LIPUD. lBL NPTsOP DPZBDBFSHUS, LFP 32-VYFOSCH CHETUY PVSHYUOSCHI TEZYUFTPCH TEBMSHOPZP TETSINB (LYNEOY TEZYUFTB DPVBCHMSEFUS RTYUFBCHLB "E"). Chue 32-ine-in-chief Tezyufts LTPNE EIP DPUFHROSHSHEN TBMShopn TETCNEN, OP FLPN UMHUB VHDHF KOBNBFSh umbes 1 VBKF VPMSHYY (L ON DPVBCHMSEFUS UREGYBMSHSHSHKOK). TEAVE RTPGEUUPTE NMPPTSE 286 FY LPNBODSCH VHDHF OELPTTELFOSCH KOHTA. nsch nptsen, obrtynet, obryubfsh mov eax, 0x12345678 y rpume bfpzp h ax vhdef 0x5678, rpfpnh yufp on lbl vsh schmsefus "h nmbdikha yubufsh -embtbsh (bobsh (bob). TEZYUFTB-PFPVTBTSEOYS UFBTYEK YUBUFY 32-VYFOSCHI TEZYUFTPC OE UHEEUFCHHEF – NPTsOP EI YYCHMEYUSH FPMSHLP U RPNPESH BTYZHNEFYLY (OBRTYNET, UDCHOHFSH EAX EXP 16 h, 6 tundi FPZDB CH AX VHDEF UFBTYBS RPMPCHYOB, OP UPDETTSYNPE NMBDYI VYF VHDEF KHFETSOP). YuFP IBTBLFETOP, CH ЪBEEYEOOOPN TETSYNE OBPVPTPF, LPNBODSCH TBVPFSCH U 16-VYFOSHNY TEZYUFTBNY (OP OE 8-VYFOSHCHNY) FTEVHAF RTEZHYLU, CHSHSHSHCHFPNH OUNPFTS DFT. ЪBEEYEЈOOPN TETSYNE VSCHUFTEE CHSHRPMOSAFUS Y ЪBOINBAF NEOSHIE NEUFB YNEOOOP LPNBODSCH 32 - VYFOPK BTYZHNEFILY.

fBLCE, FERTSH KH OBU O 2 UEZNEOFOSCHI TEZYUFTB VPMSHYE – GS Y FS. tBVPFB U OYNY RPMOPUFSHHA BOBMPZYUOB DS Y ES Y CHSH NPTSEFE YI UCHPVPDOP YURPMSHЪPCHBFSH CH TEBMSHOPN TETSINE. PFMYUYE FPMSHLP CH FPN, YuFP OILBLYE LPNBODSCH YI SCHOPE RPDTBHNECHBAF (DS YURPMSH'HEFUS RP KHNPMYUBOYA RTBLFYUEULY CHUENY LPNBBODBNY Y OELPFPTSHNY UFTPLPCCHNY PR UFTPLPCCHNY PR OTBELGYSNY KHLBYSCHBFSH, YUFP CHSH IPFYFE PVTBEBFSHUS YUETE OYI. oBRTYNET, mov ax, .

rPNYNP bFPZP TBUYYTEOYS TEZYUFTPC, DPVBCHMSAFUS OPCHCHCHE HRTBCHMSAEYE TEZYUFTSH (TBOSHYE CHMYSM ABOUT TETSYN TBVPFSH RTPGEUUPTB FPMSHLP FLAGS) – CR0, CR2, CR3 JA CR4. eUFSH Y DTHZYE (OBRTYNET, PFMBDPUOSCH TEZYUFTSHCH), OP SING OBU UEKUB OE YOFETEUHAF. yNEOOOP U RPNPESHA LFYI TEZYUFTPC RTPYCHPDYFUS RETELMAYUEOYE RTPGEUUPTB CH ЪBEEYEЈOOOSCHK TETSYN Y OBUFTPKLB OPCHSHHI ZHKHOLGYK CHTPDE UFTBOYUOPK BDTEUBGYY. laula DPUFHROSCH CH TEBMSHOPN TETSINE.

h ЪBEEYEЈOOPN TETSYNE RPOSFYE UEZNEOFB YЪNEOSEFUS. FERETSH LFP OE RTPUFP VBPCHSHCHK BDTEU, B OPNET BMENEOFB (DEULTYRFPTB UEZNEOFB) CH UREGYBMSHOPK FBVMYGE. fBVMYGB DEULTYRFPTPCH UEZNEOFPCH UPЪDBЈFUS PRETBGYPOOPK UYUFENPK Y NPTSEF UPDETSBFSH OEPVIPDYNPE LPMYUEUFCHP PRYUBOIK UEZNEOFPCH ЪBEEYEЈOOPZP TETSINB. LBTSDSCHK BMENEOF FBVMYGSH ЪBOYNBEF 8 VBKF Y CH UREGYBMSHOPN ZHTNBFE PRYUSCHCHBEF VBPCHSHCHK BDTEU UEZNEOFB, TBNET, RTBCHB DPUFHRB Y F. D.

UEZNEOFSH ЪBEEYEOOPZP TETSYNB DEMSFUS TEAVE DCHB FIRB kohta - UEZNEOFSH LPDB Y UEZNEOFSH DBOOSCHI (TEABELE UBNPN DEM EUFSH EE CHUSLYE TSS Y LDT, OP RPLB POY OBNOE CHBTSOSH FPCE). h cs nptsop ътхцтхцтхц fп fп op opnetb deulthrfptch, pryubooschi lbl uezneof lpdb, h pufbmshoshe uezneofoshe tezyuftsh nptsop ъbztTsbfsh MAVSHCHE UEZNEOFSH - LB. chBTSOBS TBJOYGB CH FPN, YuFP UEZNEOF LPDB NPTsOP FPMSHLP YUYFBFSH Y YURPMOSFSH, B UEZNEOF DBOOSHI FPMSHLP YUYFBFSH Y RYUBFSH. l UYUBUFSHA, UEZNEOFSH NPZKhF RETELTSHCHBFSHUS CH RBNSFY, RPFPNH NPTsOP UPJDBFSH DCHB DEULTYRFPTB, UUSCHMBAEYEUS TEAVE PDYO Y FPF TSE DEZYPOSHYPO RBNSFY, UEZNEOFSH NPZKhF RETELTSHCHBFSHUS RBNSFY, OP PDEMBYOTHSHROCHPUN RBNSFY N DMS ЪBRYUY.

oEUNPFTS KOHTA RPDDETSLH UEZNEOFBGYY, POB UYFBEFUS KHUFBTECHYEK. OH Windows, OH Linux OE YURPMSHJHAF EЈ CH RPMOPC NETE, B ABOUT PFMYUOSCHI PF x86 BTIYFELFHTSCH (OBRTYNET, ARM) POB CHCHUE PFUHFUFCHHEF. dMS TBZTBOYUEOYS DPUFKHRB L RBNSFY YURPMSH'HEFUS ZPTBJDP VPMEE ZYVLYK NEIBOYN UFTBOYUOPK BDTEUBGYY, LPFPTSCHK NSCH TBUUNPFTYN DBMEE. YUFPVSH YъVBCHYFSHUS PF UEZNEOFBGYY PU RTPUFP PRYUSCHCHBEF FBVMYGH y Yne). h FBLPN UMKHYUBE ZPCHPTSF, YuFP NSCH CHLMAYUYUMY TETSYN MYOEKOSCHI BDTEUPCH – UNEEOOYE UPPFCHEFUFCHHEF ZHJYYUEULPNH BDTEUKH. lFP PYUEOSH HDPVOP Y S RPKDH RP FPNH TSE RKhFY. OE UMEDHEF RSCHFBFSHUS YURPMSHЪPCHBFSH UEZNEOFBGYA CH UPEC PRETBGYPOOPK UYUFENE – LFP UYMSHOP HUMPTSOSEF LPD SDTB, SJSCHLY CHSHUPLPZP KhTPCHOS (OBRTYNET, u YMY TCHUNEFFECHFBGYA u YMY EUFFPEZFGYA++) PTSEFE RPMOPGEOOOP RTPZTBNNNYTPCHBFSH FPMSHLP TEAVE Assembleri kohta) Y, OBLPOEG, CHCH OE UNPTSEFE RETEOUFY UYUFENKH TEAVE DTHZHA BTIIFELFHTH, RPFPNKH YuFP x86 EDYOUFCHEOOBS, LPFPTBS KHNEEF LFPF NEIBOYN kohta (Y FP, CH 64-VYFOPN TETSYNE RPMS VBPCHPZP BDTEUB Y TBNETB P TBNETB UEZNEOF AFPTMBUSH YZOPTYOFTYNBUSTH YZOPTYOFTYNBUSH CHBI DPUFHRB).

lBL S HCE ULBBM, FBVMYGB DEULTYRFPTPCH UEZNEOFPCH ZHTNYTHHEFUS UBNPK PRETBGYPOOPK UYUFENPK. YuFPVSH KHLBBBFSH RTPGEUUPTH, ZDE POB OBIPDFUS YURPMSH'HEFUS UREGYBMSHOBS LPNBODB - lgdt (Load Global Descriptor Table). pOB RTOYNBEF 6-VBKFPCHHA RETENEOOKHA CH RBNSFY. RETCCHHE EЈ 16 VYF UPDETSBF TBNET FBVMYGSHCH VBKFBI (FBLYN PVTBBPN, NBLUINBMSHOPE LPMYUUEUFCHP DEULTYRFPTPCH - 65536 / 8 = 8192), RPUMEDHAEYE VЧMYGSHCH VBKFBI BDTEU CH RBNSFY UBNPK FBVMYGSHCH (FP EUFSH VEЪ HYuЈFB CHUEI UEZNEOFPCH). yNEEF UNSHUM CHSTTBCHOSFSH OBYUBMP FBVMYGSHCH Umbes 16 VBKF, RPFPNKH YuFP LFP KHMKHYUYBEF ULPTPUFSH DPUFHRB L E Ј MENEOFBN. RETCHSHCHK BMENEOF FBVMYGSHCHUEZDB DPMTSEO VSCHFSH TBCHEO OKHMA Y MAVPE YURPMSHЪPCHBOIE OHMECHPZP UEMELFPTB(HLBBBFEMSH ABOUT BMENEOF FBVMYGSH DEULTYRFPTPCH CH UEZNEOFOPN TEZYUFTE OBSCCHBEFUS FBL) RTYCHPDYF L PYYVLE. ъOBYUIF VPMEE-NEOOEE TBVPFPURPUPVOBS FBVMYGB DEULTYRFPTPCH DPMTSOB UPDETSBFSH IPFS VSC FTY DEULTYRFPTB – RHUFPK, DEULTYRFPT LPDB, DEULTYRFPT DBOSCHI.

OH YFP EEЈ UFPYF TBUULBЪBFSH, RTETSDE, YUEN NSCH RPRTPVKHEN RETEKFY CH ЪBEEYEЈOOOSCHK TETSYN? rPTsBMKHK, EEЈ UFPYF KHRPNSOKhFSH RTP KhTPCHOY DPUFKHRB. LPD SDTB UYUFENSH Y LPD RTYMPTSEOYK PFDEMEOSCH DTHZ PF DTHZB U FPK GEMSHA, YuFPVSH SDTP NPZMP RPMOPUFSHA KHRTBCHMSFSH RTPGEUUPTPN, B RTYMPTSEOYS OE NPZMY CHNEYBVPFSHED CHZBUTB ). lPD YURPMOSEFUS U PRTEDEMOOOSCHN KHTPCHOEN RTYCHYMEZYK. h x86 YI GEMSHCHI 4 YFHLY - PF 0 DP 3. oKHMECHPK HTPCHEOSH UBNSCHK RTYCHYMEZYTPCHBOOSCHK (NPTSEF CHSHPRMOSFSH MAVSHCH LPNBODSCH Y NEOSFSH TETHCCTSYNSCH TBVPFSH UNBFC RTEFPGEUPKVHK."), lBL Y CH UMKHYUBE U UEZNEOFBGYEK, TBTBVPFYUYLY x86 RETEVPTEYMY U ZHKHOLGYPOBMPN Y CHUE PU YURPMSH'HAF MYYSH DCHB HTPCHOS YYUEFSHCHTI CHPNPTSOSHSCHI, B DTHZIE FTTBVPFYUYLY BTIYFRTFETSHSYCHI, B DTHZIE FTBVPFYUYMY BTIYFRTFETSHSYCHI. x LBTSDPZP UEZNEOFB CH EZP DEULTYRFPTE KHLBBO DPL (deskriptori privileegi tase)- HTPCHEOSH DPUFHRB OEPVIPDYNSCHK DMS DBOOZP UEZNEOFB. OERTYCHYMEZYTPCHBOOSCHK LPD OE NPTsEF RPMKHYUFSH DPUFHR L UEZNEOFKH U HTPCHOEN DPUFKHRB 0, B RTYCHYMEZYTPCHBOOSCHK LPD NPTsEF RPMKHYUFSH DPUFHR LP CHUEN UEZNEOFBN.

UEMELFPT UEZNEOFB, LPFPTSCHK UPDETSYFUS CH UEZNEOFOPN TEZYUFTE, SCHMSEFUS OE RTPUFP OPNETPN BMENEOFB CH FBVMYGE, OP Y KHLBBBFEMEN HTPCHOS DPUFHRB - HMBDYE 2 VYFOPOPN TEZYUFTE (NMBDYE 2 BTYE OPNET UBNPK FBVMYGSHCH. fBLYN PVTBBN UEMELFPT = (YODELU_DEULTYRFPTB shl 2) + RPL. VÕTA- Soovitud privileegi tase - ЪBRTBYCHBENSCHK HTPCHEOSH RTYCHYMEZYK. rTY LFPN RPL DPMTSEO VSHFSH VPMSHYE YMY TBCHEO NBLUINBMSHOPNKH YЪ DPL Y CPL (praegune privileegitase). CPL TBCHEO RPL UEMELFPTB CH CS. fBLYN PVTBBPN LPD OE NPTSEF RPMKHYUFSH DPUFKHRB L UEZNEOFBN, KH LPFPTSCHI KHTPCHEOSH DPUFKHRB CH YUYUMPCHPN CHYDE OITSE, YUEN X OEZP UBNPZP. s, CHETPSFOP, PRYUBM DPUFBFPYuOP ЪBRKHFBOOP, OP CHRPMOE NPTsOP PVPKFYUSH RPL = DPL, LBL NSCH Y RPUFHRIN.

rPLB NSCH RYYEN FPMSHLP SDTP, NSCH VHDEN TBVPFBFSH CH OHMECHPN LPMSHGE ЪBEIFSH (FBL EEЈ OBSCHCHBAF KhTPCHOY RTYCHYMEZYK), YUFPVSH YNEFSH RPMOSHCHK DPUFTBHTE L BRRBTBHTE

UEZNEOFBGYS OBNOE OHTSOB, RPPFPNH S OE VHDH PUFBOBCHMYCHBFSHUS RPLB UFP TEAVE ZHTNBFE DEULTYRFPTB, B DBN ZPFPCHSHCHE OBYEOYS kohta. eUMY YOFETEUOP, NPTSEFE RPYUYFBFSH UFH UFBFSHA . tBUUNPFTYN RTPUFEKYK LPD RETEIPDB CH ЪBEEYEYOOOSCHK TETSYN.

; ъBRHUL 32-TBTSDOPZP SDTB.start32: ; CHCHCHPDYN HCHEDPNMEOYE P ЪBRHULE 32-VYFOPZP SDTB mov si, start32_msg call write_str ; ъБЗТХХЪН ЪБУУЭОЭ Ч GDTR lgdt ; ъBRTEFYN RTETSCHCHBOYS cli; RETEKDEN CH ЪBEEYEЈOOOSCHK TETSYN mov eax, cr0 või eax, 1 mov cr0, eax ; RETEKDEN ABOUT 32-VYFOSHCHK LPD jmp 8:start32; fBVMYGB DEULTYRFPTPCH UEZNEOFPPCH DMS 32-VYFOPZP SDTB joondus 16 gdt32: dq 0 ; NULL - 0 dq 0x00CF9A000000FFFF ; KOOD - 8 dq 0x00CF92000000FFFF ; ANDMED - 16 gdtr32: dw $ - gdt32 - 1 dd gdt32 ; 32-VYFOSHCHK LPD kasutamine32 start32: ; oBUFTPYN UEZNEOFOSH TEZYUFTSHY UFEL mov eax, 16 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax movzx esp, sp ; CHCHPDYN UINCHPM BLTB-st mov-bait, "!" ; ъБЧТЭТІІІе jmp $

ьFPF LPD UMEDHEF DPRYUBFSH L OBYENH OBYUBMSHOPNH ЪBZTHYUYLH.

RETED RETEIPDPN CH ЪBEEYEЈOOSHK TETSYN OEPVIPDYNP ЪBRTEFIFSH RTYEN BRRBTBFOSCHI RTETSCHCHBOYK (LMBCHYBFKHTB, NSHCHYSH, FBKNET Y DTHZIE KHUFTPKUFCHB), RPFPUMF BIOSЈOOSSK PVTBVPFYUYLY NSCH EEЈ OE OBRYUBMY, RPFPNKH RETCHPE TSE RTETSCHCHBOIE PVTKHYYF UYUFENKH.

oERPUTEDUFCHOOOP RETEIPD CH ЪBEEYEЈOOOSCHK TETSYN PUHEEUFCHMSEF KHUFBOPCHLB OHMECHPZP VYFB CH CR0. ynEOOP LFP NSCH Y DEMBEN (RTSNPK DPUFHR L CR0,2,3,4 OECHPNPTSEO FBL TSE LBL Y LUEZNEOFOSCHN TEZYUFTBN, RPFPNH YURPMSHJKHEN EAX). oEUNPFTS FP, YuFP NSCH HCE RETEYMY CH ЪBEEYEOOOSCHK TETSYN, LPD RTDPDPMTSBEF YURPMOSFSHUS RP-RTETSOENH 16-VYFOSHCHK. dMS PLPOYUBFEMSHOPZP RETEIPDB OBN OHTSOP PVOPCHYFSH UPDETSYNPE UEZNEOFOSCHI TEZYUFTPC. DYTELFYCHB BUUENVMETB use32 ZPCHPTYF ENKH, YuFP DBMSHOEKYK LPD CHSHRPMOSEFUS CH ЪBEEYEOOPN TETSINE Y OEPVIPDYNP RETELMAYUFSHUS CH TETSIN ZEOETBGYY LPNBOD DMS YPNBOD DMS OEZP 'YPPEHURFUSPZ16- 'YVPOPHURFUSPZP, B UBOYA) .

lPNBODB movzx TBUYYTSEF CHFPTPK BTZKHNEOF DP RETCHPZP. h UNHUME, YuFP JЪ 16 VYFOPZP OBYUEOYS SP RPMHYUBEFUS 32-VYFOPE. UFBTYYE VYFSH PVOHMSAFUS (NBMP MY, YuFP FBN VShchMP DP OBU). rTEDRPUMEDOSS LPNBODB DENPOUFTYTHEF OBN CHPNPTSOPUFY ЪBEEYEOOOPZP TETSYNB - NSCH PVTBEBENUS RP BVUPMAFOPNH 32-VYFOPNH BDTEUKH L CHYDEP-RBNSFY FELUFPCHPZY TETSYNBS "CHYDEP-RBNSFY FELUFPCHPZY TETSYNBS!" CH RTBCHSHCHK OYTSOYK KHZPM LBOBOB (FELUFPCHSHCHK LLTBO JNEEF TBTEYOEYE 80 x 25 UYNCHPMPCH, LBTSDSCHK UYNCHPM ЪBOYNBEF CH RBNSFY DCHB VBKFB - LPD UYNCHSHCHK LLTBO JNEEF TBTEYOEYE YNCHPMPCH, LBTSDSCHK UYNCHPM ЪBOYNBEF CH RBNSFY DCHB VBKFB - LPD UYNCHSHCHK LLTBO JNEEF TBTEYOEYE YYNCHPMPCH).

nsch VPMSHYE OE NPTSEN PVTBEBFSHUS L UETCHYUBN BIOS, FERETSH RTYYMP CHTENS OBN UFBFSH RPMOPUFSHA UBNPUFPSFEMSHOSCHNY Y UBNYN HRTBCHMSFSH CHUEN PVPTHDPHBOYEN. RETEBZTHTSBFSHUS Y TsDBFSH OBTSBFYS ABOUT LMBCHYYH NSCH RPLB OE KHNEEN, RPFPNH RTPUFP UBCHYUBEN U RPNPESH LPNBODSCH jmp $ (RETEIPD ABOUT FH CE UBNHA LPNBODH - VEULPOYUS).

h OBYEN boot.cfg LPNBODH S64 RPLB ЪBNEOYN TEAVE S32 kohta. FERETSH, EUMY CHU CHU RTBCHYMSHOP UDEMBMY, OBY ЪBZTHYUYL VKhDEF ЪBCHETYBFSH UCHPA TBVPFKH CHCHCHPDPN CHPULMYGBFEMSHOPZP OBBLB CH KHZPM LBOB YЪ ЪBEEYEOOZP. bFP FPMSHLP OBYBMP. nsch OBLPOEG-FP RTBLFYUEULY KHYMY YY TEBMSHOPZP TETSYNB (ABOUT UBNPN DEM FBN EEЈ PUFBMPUSH OENOPZP DEM) CH ЪBEEYEЈOOSHCHK. rPULPMSHLH OBZTHYUYL CHSHHRPMOSEFUS CH OHMECHPN UEZNEOFE TEBMSHOPZP TETSINB, CHUE UNEEEOYS UPPFCHEFUFCHHAF ZHIJYUEULYN BDTEUBN Y RTY RETEEIPDE CH ЪBEEYEOOOSCH RETEEIPDE CH ЪBEEYEOOOSCH RETEEIPDE CH ЪBEEYEOOOSCH REOMBUSHTBOYY, SH.

h ЪBCHETYEOYE CHSHCHRKHULB, RPTSBMKHK, DPVBCHMA RPUMEDOYK YFTYI – RTPCHETLH, YuFP RTPGEUUPT RPDDETSYCHBEF ЪBEEYEOOOSCHK TETSIN. UHFSH RTPCHETLY CH FPN, YuFP OE CHUE VYFSH FLAGS NPTsOP YYNEOIFSH RTPZTBNNOP. FP EUFSH TEZYUFT OE UPCHUEN 16-VYFOSHCHK. TEAVE OPCHSHCHI RTPGEUUPTBBI DPUFKHROP DMS YЪNEOOYS VPMSHYE VYF Y LFP NPTsOP PVOBTHTSYFSH kohta. TBVETYFE LPD OITSE UBNY, ULBTSKH FPMSHLP, YuFP LPNBODB pushf RPNEEBEF TEZYUFT ZHMBZPCH CH UFEL, B popf CHSHCHFBMLYCHBEF UPDETTSYNPE UFELB PE FLAGS. fBLYN PVTBUPN EZP NPTsOP NEOSFSH GEMYLPN, BOE PFDEMSHOSCHNY LPNBODBNY. ChPF RPMOSCHK LPD OBEZP ЪBZТХЪУЛБ:

Org 0x7C00 jmp alglaadimine ; ъБЗПМПЧПЛ ListFS joondada 4 fs_magic dd ? fs_version dd? fs_flags dd ? fs_base dq? fs_size dq ? fs_map_base dq? fs_map_size dq ? fs_first_file dq? fs_uid dq? fs_block_size dd ? ; ъБЗПМПЧПЛ ЖБКМБ virtuaalne 0x800 f_info: f_name rb 256 f_next dq ? f_prev dq ? f_parent dq ? f_flags dq ? f_data dq? f_size dq ? f_ctime dq ? f_mtime dq? f_atime dq ? lõpp virtuaalne ; dBOOSHE OBYUBMSHOPZP ЪБЗТХЪУЛБ sildi sektor_per_raja sõna $$ silt head_count bait $$ + 2 sildi disk_id bait $$ + 3 reboot_msg db "Vajutage suvalist klahvi...",13,10,0. bin "boot_file_name" ; hCHCHPD UFTPLAY DS:SI BLTB-st write_str: push si mov ah, 0x0E @: lodsb test al, al jz @f int 0x10 jmp @b @: pop si ret ; lTYFYUEULBS PYYVLB viga: pop si call write_str ; RETEЪБЗТХЛБ reboot: mov si, reboot_msg call write_str xor ah, ah int 0x16 jmp 0xFFFF:0 ; ъБЗТХЛБ UELFPTB DX:AX CH VHJET ES:DI load_sector: push dx add ax, word adc dx, word cmp bait, 0xFF je .use_EDD push bx cx si div mov cl, dl inc cl div mov dh, ah mov dh, ah dl, mov bx, di mov al, 1 mov si, 3 @: mov ah, 2 int 0x13 jnc @f xor ah, ah int 0x13 dets si jnz @b .error: kõne viga db "DISK ERROR",13,10 ,0 @: pop si cx bx dx ret .use_EDD: push si mov bait, 0x10 mov bait, 0 mov sõna, 1 mov , di push es pop sõna mov , ax mov , dx mov sõna, 0 mov sõna, 0 mov ah , 0x42 mov dl, mov si, 0x600 int 0x13 jc .error pop si dx ret ; rPYUL ZHBKMB U YNEOEN DS:SI CH LBFBMPZE DX:AX find_file: push cx dx di .find: cmp ax, -1 jne @f cmp dx, -1 jne @f .not_found: kõne viga db "EI LEIDA",13, 10.0 @: mov di, f_info call load_sector push di mov cx, 0xFFFF xor al, al repne scasb neg cx dec cx pop di push si repe cmpsb pop si je .found mov ax, word mov dx, word jmp .find . pop di dx cx ret ; ъБЗТХЛБ FELHEEZP ZHBKMB CH RBNSFSH RP BDTEUKH BX:0. lPMYUEUFCHP ЪБЗТХЦЕОШИ UELFPTPCH CHPCHTBEBEFUS CH AX-i load_file_data: push bx cx dx si di mov ax, word mov dx, word .load_list: cmp ax, -1 jne @f movx @vx dx: pop cmp1 jne dx. ax, bx pop bx sub ax, bx shr ax, 9 - 4 ret @: mov di, 0x8000 / 16 call load_sector mov si, di mov cx, 512 / 8 - 1 .load_sector: lodsw mov dx, add si, 6 cmp ax, -1 jne @f cmp dx, -1 je .file_end @: push es mov es, bx xor di, di call load_sector add bx, 0x200 / 16 pop es loop .load_sector lodsw mov dx, jmp .load_list ; fPULB CHIPDB CH OBYUBMSHOSHCHK ЪBZTHYUYL alglaadimine: ; oBUFTPYN UEZNEOFOSHE TEZYUFTSH jmp 0:@f @: mov ax, cs mov ds, ax mov es, ax ; oBUFTPYN UFEL mov ss, ax mov sp, $$ ; TBTEYIN RTETSCHCHBOYS sti; ъBRPNOYN OPNET ЪБЗТХЪПУОПЗП ДУЛБ mov, dl; prtedemyn RBTBNEFTSH ЪБЗТХЪПУОПЗП ДУЛБ mov ah, 0x41 mov bx, 0x55AA int 0x13 jc @f mov bait, 0xFF jmp .disk_detect8, xt, dik_tuvastus8 pop es jc inc dh mov , dh ja cx, 111111b mov , cx .disk_detected: ; f _andmed ; RETEIPDYN RTDDPMCEOYE kohta jmp boot2 ; rKHUFPE RTPUFTBOUFCHP Y UYZOBFKHTB rb 510 - ($ - $ $) db 0x55.0xAA ; dPRPMOYFEMSHOSH DBOOSH ЪБЗТХЪУЛБ load_msg_preffix db "Laadimine "",0 load_msg_suffix db ". ..",0 ok_msg db "OK",13,10,0 config_file_name db "boot.cfg",0 start16_msg db "16-bitise kerneli käivitamine...",13,10,0 start32_msg db "32-bitise kerneliga alustamine. ..",13,10,0 ; tБВЪВЪОЕУФТПЛИ DS:SI RP UYNCHPMH UMEYB split_file_name: push si @: lodsb cmp al, "/" je @f test al, al jz, @f mov byte @f mov byte ax, si pop si ret ix call write_str pop si push si bp mov dx, word mov ax, word @: push ax call split_file_name mov bp, ax pop ax call find_file testbait, 1 jz @f mov si, bp mov dx , sõna mov ax, word jmp @b @ : call load_file_data mov si, ok_msg call write_str pop bp si ret ; .config_end cmp al, 10 je .run_command cmp al, 13 je .run_command jmp .parse_char .run_command: mov bait, 0 xchg dx, si cmp bait, 0 je .parse_line ; rHUFBS UFTPLB cmp bait, "#" je .parse_line ; lPNNEOFBTYK cmp bait, "L" je .load_file ; ъБЗТХЛБ ЖБКМБ cmp bait, "S" je .start ; ъBRHUL SDTB; oEYCHEUFOBS LPNBODB mov al, mov [.cmd], al call error db "Tundmatu alglaadimisskripti käsk "" .cmd db ? db ""!",13,10,0 .config_end: ; rTY RTBCHYMSHOPN LPOZHYZHTBGYPOOPN ZHBKME NSCH OE DPMTSOSCH UADB RPRBUFSH; jmp taaskäivitamine; ъБЗТХЛБ ЖБКМБ.load_file: push dx inc si call load_file push ax mov cx, 512 mul cx mov word, ax mov word, dx mov word, 0 mov word, 0 mov ax, bx mov cx a mov word, . sõna, dx mov sõna, 0 mov sõna, 0 pop axe shr ax, 9 - 4 add bx, ax add bp, 16 pop dx jmp .parse_line ; ъBRHUL SDTB.start: ; rTPCHETYN, YuFP ЪBZTHTSEO IPFS VSC PDIO ZhBKM cmp bx, 0x9000 / 16 ja @f kõne viga db "KERNEL LOADED",13,10,0 @: ; ъBRPMOSEN RPUMEDOYK BMENEOF URYULB ZHBKMPCH xor ax, ax mov cx, 16 mov di, bp rep stosw ; RETEIPDYN L RTPGEDHTE YOYGYBMYBGYY SDTB DMS OKHTSOPK TBTSDOPUFY inc si cmp word, "16" je .start16 cmp word, "32" je .start32 ;cmp word, "64" ;je start64 ; oEYCHEUFOBS TTSDSDOPUFSH SDTB kõne viga db "Vigane käivituskäsu argument",13,10,0 ; ъBRHUL 16-TBTSDOPZP SDTB.start16: mov si, start16_msg mov bx, 0x6000 mov dl, jmp 0x9000 ; ъBRHUL 32-TBTSDOPZP SDTB.start32: ; CHCHCHPDYN HCHEDPNMEOYE P ЪBRHULE 32-VYFOPZP SDTB mov si, start32_msg call write_str ; rTPCHETYN, YuFP RTPGEUUPT OE IHTSE i386 mov ax, 0x7202 push ax popf pushf pop bx cmp ax, bx je @f call error db "Nõutav i386 või parem",13,10,0 @: ; ъБЗТХХЪН ЪБУУЭОЭ Ч GDTR lgdt ; ъBRTEFYN RTETSCHCHBOYS cli; RETEKDEN CH ЪBEEYEЈOOOSCHK TETSYN mov eax, cr0 või eax, 1 mov cr0, eax ; RETEKDEN ABOUT 32-VYFOSHCHK LPD jmp 8:start32; fBVMYGB DEULTYRFPTPCH UEZNEOFPPCH DMS 32-VYFOPZP SDTB joondus 16 gdt32: dq 0 ; NULL - 0 dq 0x00CF9A000000FFFF ; KOOD - 8 dq 0x00CF92000000FFFF ; ANDMED - 16 gdtr32: dw $ - gdt32 - 1 dd gdt32 ; 32-VYFOSHCHK LPD kasutamine32 start32: ; oBUFTPYN UEZNEOFOSH TEZYUFTSHY UFEL mov eax, 16 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax movzx esp, sp ; hCHCHPDYN UINCHPM TEAVE BLTB-st mov byte, "! ";

Operatsioonisüsteemi kirjutamiseks peate mõistma palju üksikasju. Nii et lubage mul teid veidi valgustada (aga leppigem kokku, et loete mana ise läbi, et teil oleks millestki rääkida).
Kui aus olla, siis Internetis on PM-i kohta tohutult materjale ja iley ja pehat rääkisid sellest režiimist veidi, aga mul paluti seda üldiselt kirjeldada. Nüüd kirjeldan lühidalt teooriat (tegelikult kirjutas Intel mana spetsiaalselt selle jaoks), seejärel hakkame koodi kirjutama.

Sissejuhatus kaitstud režiimi.
Seega erineb PM oluliselt reaalrežiimist (RM), mis on kõigile tuttav juba DOS-i aegadest. Nüüd peate sellega harjuma: pole staatilisi 64 kilobaidiseid segmente, 1 kilobaidis pole katkestustabeleid, segmendiregistrites pole segmendi baasaadresse, üldiselt on täiesti uus maailm.
Nüüd on segmente kirjeldatud artiklis Globaalne kirjeldustabel (GDT). See tabel võib olla ainult ühes eksemplaris. Ta on mälustruktuur. Mitte segment! See võib asuda kõikjal mälus, kuid selle aadress ja limiit kirjutatakse GDTR registrisse. Siin on selle struktuur:

Tabel ise koosneb järgmise struktuuriga kirjetest (muide, nullkirje on tühi. See on oluline. Nulldeskriptoriga ‘kirjeldatud’ mälule ligi pääsedes saate #GP - General Protection Fault):
Vaatame seda struktuuri lähemalt.

1. Segmendi piirang:
Selle välja eesmärk on nimest selge, kuid sellel on peensus. Koer on maetud G (Granularity) bitti.
Kui see on määramata, siis "loetakse" mälu baitides. Sel juhul võib segmendi suurus varieeruda 1 baidist 1 megabaidini 1 baidi suuruse kohta.
Kui seame selle väärtuseks 1, võetakse kasutusele lehemälu adresseerimine. Siis saame adresseerida 4 kilobaidist 4 gigabaidini muutmälu, mille suurus muutub 4 kilobaiti (lehe suurus). Üldiselt eelistatakse lehe adresseerimist (võrdle (1MB+64Kb-16baiti) ja 4GB). Räägime selles postituses ainult segmendi adresseerimisest. Lehitsemine väärib eraldi arutelu.

2. Baasaadress:
Siin näitame baasi füüsilist aadressi.

3. Tüübiväli:
Bitikombinatsioonid määravad segmendi tüübi:

4. S (deskriptori tüüp):
Inteli dokumentatsioon ütleb, et kui see bitt pole määratud, siis see deskriptor on süsteemi segmendi jaoks, muidu - kood või andmed. Süsteemi all peame silmas LDT-d, TSS-i, katkestusväravaid ja teisi sarnaseid (neist hiljem).

5. DPL (deskriptori privileegitase):
Kirjeldatud segmendi privileegid. Kõik teavad Ringsi.

6. P (olemas segment):
Kui see bitt on seatud, siis protsessor ‘teab’, et segment on juba mälus (kuigi õigem oleks öelda kehtiv). Kui laadite segmendiregistrisse deskriptori valija, mille P bitt on määramata, ilmneb erand #NP (pole olemas). Üldiselt selgitan selle ehitud fraasi tähendust veidi hiljem.

7.D/B:
Seda tõlgendatakse erinevat tüüpi segmentide puhul erinevalt.
1. Koodisegmentide jaoks:
32- või 16-bitine efektiivne aadressi pikkus ja operandi suurus.
(1-32; 0-16);
2. Virna jaoks:
Pinu osuti on 32 või 16 bitine. (1-32; 0-16);

8.G:
Mõjutab ühikuid (baite, lehti), milles segmendi limiiti mõõdetakse. Üldjuhul saab PM-le liikumisel otsingut lubada, seadistades CR0 registri 31 bitti.

Veel veidi teavet:
Arvame, et sõna Global ei pandud asjata. Seega on veel üks märk. Täpselt nii, on ka Kohalike deskriptorite tabel. Neid võib olla väga erinevaid. Näiteks saab neid kasutada ülesannete elluviimisel jne. Ja siin LDT moodustab juba segmendi! Nii et harjuge selliste fraasidega nagu „kohaliku deskriptori tabeli segmendi kirjeldus”.

Pärast tabeli kirjeldamist peame selle registrisse laadima GDTR. Seda ei tee mov. GDTR täidetakse käsuga lgdt fword (väärtus). See tähendab, et peate selle struktuuri ise looma ja ülalnimetatud registrisse laadima. Selle registriga töötavad endiselt meeskonnad, kuid meie galopeerime üle Euroopa.

Üks asi veel. PM-is ei salvesta segmendiregistrid segmentide baasaadresse (nagu RM-is), vaid spetsiaalselt koolitatud asju nn. valijad. Nende struktuur on järgmine:

Siin on indeks tabelis oleva deskriptori järjekorranumber.
TI näitab, kust deskriptorit otsida (in GDT või LDT).

Nüüd, kui tabeli koostamine on juba selge, räägime sellest, kuidas minna PM-i (pange tähele, seda saab teha ainult RM-ist). Üldiselt... peate lihtsalt määrama juhtregistri CR0 biti 0. Valetan siiski. Kõigepealt peate keelama kõik katkestused ( NMI (Mittemaskeeritavad katkestused) sealhulgas), avage aadressirida A20(et 32-bitine adresseerimine oleks saadaval), laadige alla GDTR, ja hüpata märgi peale – start.

Kasutame laadijat (võite kasutada KOLIBRI oma), mis laeb meie koodi aadressile 1000h:0 (RM-i aadress, panen tähele).
Siin ei ole kõik nii sujuv kui nendes manas, kui nad lülituvad otse alglaadurist PM-ile. Kõik on veidi keerulisem. Aga esmalt vaatame alglaaduri laaditavat koodi (me kirjutame kõik FASM-ile).

Binaarne vorming
xor kirves, kirves
cli ;initsialiseeri segmendiregistrid uuesti
mov ss, ax
xor sp,sp
sti
mov ax,3
int 10h

Jmp 1000h:r_start

Mov ax,1000h;registrite ümberkonfigureerimine
mov ds, ax
mov es, ax

Al, 0x92 luba A20
või al, 2
välja 0x92, al

Lgdt fword ;laadige GDTR register
mov eax,cr0
või al,1;määra bitt 0
mov cr0,eax;lülitage PM sisse

Jmp fword 08h:Startup32; hüppa PM-i

Joonda 8 ;protsessor käsitleb joondatud plaati kiiremini
GDT:
dq 0 ;tühi
db 0FFh,0FFh,0,0,0,9Ah,0CFh,0 ;kood
db 0FFh,0FFh,0,0,0,92h,0CFh,0;andmed
db 0FFh,0FFh,0,80h,0Bh,92h,40h,0 ;videolõik
silt GDT_SIZE hinnaga $-GDT
GDTR:
dw GDT_SIZE-1
dd GDT+10000h
; peate üles kirjutama 32-bitise aadressi. Nüüd oleme segmendis 1000h, mille baas on 1000h*10h (füüsilise aadressi järgi) => GDTR füüsiline aadress (sildid!) = 10000h (segmendibaasi füüsiline aadress) + nihe

Virtuaalne ;nüüd tegelikult täidame ruumi segmendi lõpuni
Rb 10000h-$;
lõpp virtuaalne
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;
kasutamine32
org $+10000h;Siin on põhjus: PM-is töötame lamedate segmentidega ja kui jätame PM-i koodi enne org-i, siis;segmendisisene aadress ei ühti ühtse aadressiga. Nii et siin see on.

Startup32: ;sisenemispunkt PM-i
mov ax,10h ; Sageli (! ärge unustage seerianumbrit
mov es,ax ;tabel) valija koodi segment - 08h. andmed - 10h, videolõik - 18h
mov ds, ax
mov fs, ax
mov ss, ax
mov esp,10000h;stack
mov ax,18h
mov gs, ax

Mov esi,hi_string ;näitame, et oleme edukalt ületanud
kõne printida
jmp$

;ESI - liini aadress
printida:
pushad
x või ebx, ebx
mov ah,07h;atribuut
paneb:
mov al,
mov, kirves
inc ebx
test al, al
jnz paneb
popad
ret
hi_string db 'Tere tulemast PM-i, kutt',0

Mida me oleme teinud? Laadur laadis meid edukalt aadressil 1000h:0, kust jätkasime täitmist. Esmalt sisse lülitatud A20, keelas kõik katkestused, laaditi sisse GDTR sobiv väärtus, hüppas kandesildile. Märgin, et hüppasime peale
jmp fword 08h:Startup32
See tähendab, et 08h on koodideskriptori valija. Harju sellega.

Nüüd, kuidas seda imet käivitada. Isiklikult kasutan WinImage'i ja VirtualBoxi. Lükkame alglaaduri disketi alglaadimissektorisse ja paneme .bin faili juurjuurde. Salvestame selle .vfd-vormingus, määrame virtuaalmasina atribuutides disketipildi tee, käivitame selle ja vaatame tulemust.

Järgmises numbris käsitleme katkestusi, rikkeid, lõkse, katkestusi ja nende toimimist, tabamist ja silumist. Hakkame rääkima arhitektuurist.

Teabeallikad.
1) Tahaksin kohe avaldada tänu Phantom_84 aka egole, et nad õigele teele osutasid ja mind kohe alguses aitasid. Ilma temata oleks mul olnud palju raskem sellest aru saada.

Kõik protsessorid Intel, alustades i80286-st ja kuni viimaste (kaasa arvatud) toiteallika sisselülitamisel (pärast esialgset lähtestamist) töötavad need pärisaadressi režiimis (reaalrežiim). Tavaliselt kasutatakse reaalrežiimi kas vaherežiimina kaitstud režiimi lülitumiseks pärast mikroprotsessorisüsteemi lähtestamist või mikroprotsessoritele kirjutatud programmide kiiremaks täitmiseks. 8086 , 80186 , kuid võrreldes 8086 , 80186 , on reaalrežiimis kaasaegsetel mikroprotsessoritel laiem käivitatavate käskude komplekt ja võimalus töödelda 32-bitisi operande.
Protsessori lülitamine kaitstud režiimi reaalrežiimist toimub laadimise teel CR0(joonis 1) sõnad PE-biti ühe väärtusega ( Kaitsmine Luba). 80286 tarkvaraga ühilduvuse tagamiseks saab PE-biti seadistada ka LMSW juhiste abil. Enne ümberlülitamist tuleb vajalikud deskriptorite tabelid mällu lähtestada IDT Ja GDT. Vahetult pärast kaitstud režiimi lubamist on protsessoril CPL = 0.

Riis. 1

Kõigi 32-bitiste protsessorite puhul on kaitstud režiimile lülitumiseks soovitatav järgida järgmisi toiminguid.
1. Keelake maskeeritavad katkestused lähtestades IF-lipu ja blokeerige välise loogikaga mittemaskeeritavate katkestuste esinemine. Programmi kood peab "üleminekuperioodil" tagama erandite puudumise ja mitte kasutama tarkvara katkestusi. See nõue on põhjustatud katkestuste töötlejate kutsumise mehhanismi muutumisest.
2. Laadige üles GDTR baasaadress GDT(LGDT juhised).
3. Juhised MOV CRO määrake PE lipp ja kui lehemälu haldamine on vajalik, siis PG lipp.
4. Vahetult pärast seda antakse segmentidevahelise hüppe käsk ( JMP kaugel) või helista ( HELISTA kaugele) reaalrežiimis dekodeeritud juhiste järjekorra tühjendamiseks ja protsessori serialiseerimiseks. Kui otsimine on lubatud, siis juhiste koodid MOV CRO Ja JMP või HELISTAMA peab olema lehel, mille füüsiline aadress on sama, mis loogiline aadress (koodi puhul, millele juhtimine üle antakse, seda nõuet ei kohaldata).
5. Kui kavatsete kasutada kohalikku deskriptorite tabelit, siis juhis LLDT laadimissegmendi valija jaoks LDT registrisse LDTR
6. Juhised LTR laadimise valija ülesannete registrisse TSS kaitstud režiimi esialgse ülesande jaoks.
7. Laadi uuesti segmendiregistrid (v.a CS), mille sisu kuulub veel reaalrežiimi, või soorita üleminek või kutsu mõni muu ülesanne (sel juhul laaditakse registrid ümber automaatselt). Kasutamata segmendiregistrid laaditakse selektori väärtusega null.
8. Juhised LIDT laadige registrisse IDTR aadress ja limiit IDT— kaitstud režiimi katkestuste kirjelduste tabelid.
9. Lubage maskeeritavad ja mittemaskeeritavad riistvarakatkestused

See artikkel tutvustab kaitstud protsessori režiimis töötavate programmide väljatöötamist. Siin tuuakse välja mis tahes kaitstud režiimis töötava programmi peamised ülesanded ja antakse nende lahendused. Põhimõtteliselt kirjutatakse programmid selles keeles FASM.

Intel 80386 protsessori töörežiimid

Protsessori tulekuga Intel 80386 tekkis arhitektuur IA32. See eeldas uue protsessori töörežiimi tekkimist - kaitstud (" Kaitstud režiim"). Ühilduvuse tagamiseks rea eelmiste protsessoritega Intel 80x86 Protsessor 80386 ei käivitunud kohe kaitstud režiimis, vaid töötas nn reaalrežiimis (“ Pärisrežiim"). Lisaks on igal režiimil üks või mitu alamrežiimi. Vaatame neid.

Päris režiim

Protsessor on selles režiimis kohe pärast nuppu " Võimsus" arvuti. Reaalrežiimis mälule juurdepääsu teostab konstruktsioon " segment:nihe", mis kirjeldab loogilist aadressi. Segmendi väärtus, nagu ka nihe, on vahemikus 0 enne 0FFFFh.

Kuna adresseerimist saab teha ainult ühes segmendis, on segmendi maksimaalne suurus 64 kilobait Füüsiline aadress, mis on määratud protsessori aadressi siinile, arvutatakse järgmise valemi järgi:

lineaarne aadress = segment * 16 + nihe

Reaalrežiimi protsessorid 80186 Ja 8086 segmendi väärtus oli vahemikus 0 enne 0F000h. Seega on aadressibussi maksimaalne avatud aadress 0FFFFH, mis vastab (2^20)-1 , st. 1 megabait.

Muidugi tundus alguses sellise mälu maht kolossaalne, kuid aja jooksul ei piisa ühest megabaidist. Protsessori tulekuga 80286 sai kättesaadavaks nn mäluplokk U.M.B., alustades aadressiga 0FFFFh:0010h ja lõpetades aadressiga 0FFFFh:0FFFFh(65520 baiti üle ühe megabaidi). Nüüd saate operatsioonisüsteemi uuesti konfigureerida MS-DOS nii et see hõivab selle ploki, vabastades 64 kilobaiti RAM-i.

Kaitstud režiim

Sellel režiimil on tegelikuga võrreldes keeruline disain. Loogilist aadressi tähistab konstruktsioon " valija:nihe". Valija vahemik on vahemikus 0 enne 0FFFFh(tegelikult on valijaid 4 korda vähem – sellest lähemalt järgmistes artiklites). Nihe, erinevalt reaalrežiimist, on 32-bitine, mis võimaldab adresseerida 4 gigabaidiseid segmente. Loogiline aadress teisendatakse lineaarseks vastavalt järgmisele skeemile:

lineaarne aadress = segmendi alus + nihe

Lineaarne aadress paigutatakse seejärel aadressi siinile, kui lehe adresseerimisrežiim pole lubatud. Vastasel juhul teisendatakse lineaarne aadress füüsiliseks ja alles siis asetatakse see aadressi siinile. Lisaks võimaldab kaitstud režiim korraldada virtuaalmälu, ulatudes kuni 64 terabaidini ja olenevalt ainult kõvaketta suurusest (näiteks sama lehtefail Windows rakendab virtuaalset mälu). Peaaegu kõik kaasaegsed operatsioonisüsteemid töötavad kaitstud režiimis.

Kaitstud režiimi multitegumtöö alamrežiim

See režiim võimaldab teil korraldada multitegumtöötlust, st võimalust täita korraga mitut ülesannet või mitme kasutajaga süsteemi.

Virtuaalne 8086 režiim

See on ka kaitstud režiimi alamrežiim, mis võimaldab teil luua virtuaalse masina, mis toimiks nagu reaalrežiimis, kuid tegelikult töötab kaitstud režiimis.

Ebareaalne režiim

See on reaalrežiimi eriline alamrežiim. Protsessor on reaalrežiimis, kuid selle adresseerib mällu " valija: nihe". Sel viisil on saadaval üle 1 megabaidi mälu. Edaspidi võetakse arvesse kaitstud režiimi ja selle alamrežiime.

Esimene programm: lülitage kaitstud režiimi

Üleminek kaitstud režiimile toimub biti seadistamisega 0 Registreeri CR0. Reaalrežiimile üleminek toimub sama nullbiti lähtestamisega. Mõelge programmile, mis seda toimingut sooritab (keel - Lamekomplekt):

kasutamine16 ; Kasutab 16-bitiseid juhiseid

org 100h

Alusta:

; Oleme reaalrežiimis

mov eax, cr0 ; Registri CR0 väärtuse lugemine
või al, 1 ; Seadke nullbitt
mov cr0, eax ; Kirjutage uus CR0 väärtus

; Oleme kaitstud režiimis

mov eax, cr0 ; CR0 väärtuse lugemine
ja al, 0feh ; Lähtestage nullbitt 0-le
mov cr0, eax ; Läheme reaalrežiimi

; Oleme reaalrežiimis

ret ; Välju programmist

See programm on aga täiesti toores, sest loopimist ei saa selles rakendada. Kui kirjutate käske nagu hlt või jmp$, siis kui esimene katkestus käivitatakse, taaskäivitub arvuti.

Meie puhul käivituvad käsud üsna kiiresti, kuid on võimalik, et meie programmi mis tahes käskude täitmise vahelisel intervallil vallandub katkestus ikkagi, mis toob kaasa kohese tõrke ja taaskäivituse. Seetõttu peaksite katkestuste eest hoolitsema. Niisiis, vaatame nimekirja uuesti. Seda ei saa nimetada esimeseks programmiks (pigem oleks see null), kuna see ei rakenda kaitstud režiimile ülemineku põhitoiminguid. Minimaalsete sätetega kaitstud režiimile täielikuks lülitumiseks peate tegema järgmised toimingud.

1. kontrollige, kas on võimalik lülituda kaitstud režiimi;

2. initsialiseerida deskriptortabelid;

3. keelata katkestused (nii maskeeritavad kui ka mittemaskeeritavad);

4. avatud liin A20;

5. laadimismälu juhtimisregistrid;

7. migreeruda 32-bitisele koodisegmendile, alistades CS-registri.

Kuid piisab, kui esimene programm sooritab sammud 3, 4, 5. Siis ei too selle silmuskäik kaasa arvuti taaskäivitamist. Vaatame iga toimingut.

Katkestuste keelamine takistab meil taaskäivitamist. Katkestused jagunevad nii maskeeritavateks kui ka mittemaskitavateks. Maskeeritavate katkestuste keelamiseks peate lipu lähtestama KUI Registreeri LIPUD meeskond cli, katkestused on käsuga lubatud sti. Mittemaskeeritavad katkestused on keelatud veidi teistmoodi. Selleks on kaks võimalust: katkestuskontrolleri registrite programmeerimine (sellest meetodist tuleb juttu veidi hiljem) või pordi seitsmenda biti muutmine 70h: kui bitt on seatud, siis katkestused on keelatud, kui bitt lähtestatakse, saab katkestusi teostada.

Nüüd küsime endalt, mis on joone funktsioon A20, Mis see siis on. Liin A20- üks 32 aadressireast. Kui arvuti käivitub, joon A20 suletud. Selle tulemuseks on 20-bitiste aadresside genereerimine (st kogu aadressiruum on võrdne (2^20)=1 megabait). See on kaasas protsessori ühilduvuse tagamiseks. 8086 : seega üritab kirjutada lineaarsele aadressile 12345678h, kirjutame selle üles aadressil 00045678h, mis võib viia täiesti ootamatute tulemusteni. Seetõttu 32-bitise rakenduse täielikuks toimimiseks liin A20 peab olema avatud. Seda tehakse biti seadistamisega 1 sadamasse 92h, rea sulgemine A20- lähtestage see osa.

Viimase toiminguga on lugeja juba tuttav ja see ei tohiks temas enam küsimusi tekitada.

Niisiis, vaatame meie uue, esimese programmi loetelu, milles väike tsükkel juba rakendatakse. Eelmisele kirjele lisatud read on tähistatud tärniga (*).

org 100h

Alusta:

; Oleme reaalrežiimis

cli ;*

sisse al, 70h ;*
või al, 80h ;*
välja 70h, al ;*

; Avage liin A20

sisse al, 92h ;*
või al, 2 ;*
välja 92h, al ;*

mov eax, cr0
või al, 1
mov cr0, eax


; Väike kahekordne silmus

mov cx, 20 ;*

tsükkel: ;*
mov kirves, cx ;*
mov cx, 0ffffh ;*
silmus $ ;*
mov cx, ax ;*
silmus tsükkel ;*

mov eax, cr0
ja al, 0feh
mov cr0, eax

; Sule rida A20

sisse al, 92h ;*
ja al, 0fdh ;*
välja 92h, al ;*

sisse al, 70h ;*
ja al, 7h ;*
välja 70h, al ;*

sti ;*

ret ; täitke programm

Saate veenduda, et programm töötab, käivitades käivitatava faili puhtalt MS-DOS. Kui programm väljub õigesti, on kõik korras.

Siiski võivad tekkida ka järgmised probleemid:

1. arvuti külmub";

2. arvuti taaskäivitub.

See võib ilmneda järgmistel põhjustel:

1. programm käivitatakse režiimis V86(virtuaalne režiim 8086 );

2. programm käivitatakse kaitstud režiimis või konkreetse operatsioonisüsteemi all.

Seetõttu peaksite enne kaitstud režiimis töötava programmi käivitamist kontrollima, kas programm võib jätkata tööd. Seda arutatakse edasi.

Kaitstud režiimile lülitumise võimaluse kontrollimine

Eelmises peatükis oli meil järgmine probleem: programm ei tuvasta, et see on kaitstud režiimis või režiimis V86, mis viib süsteemi külmumise või taaskäivitamiseni. Kui proovime programmi käivitada operatsioonisüsteemi all Windows, See Windows püüab kinni programmi katse lülituda kaitstud režiimi ja pakub emuleerimisrežiimis taaskäivitamist MS-DOS(platvormi jaoks 9x) või lõpetage programm (platvorm) jõuga NT).

Seega, et kontrollida, kas oleme tõesti reaalrežiimis, peaksime tegema järgmised toimingud:

1. kontrollige registri nullbitti CR0;

2. Veenduge, et Windowsi operatsioonisüsteem pole laaditud.

Esimene toiming tehakse otse registri lugemisega CR0 registri nullbiti täiendava kontrollimisega EAX, AX või AL. Kui bitt pole määratud, oleme reaalrežiimis. Vastasel juhul muutub programmi edasine täitmine mõttetuks.

Teine toiming viiakse läbi funktsiooni kutsumisega 1600h katkestab 2fh. See funktsioon võimaldab teil hankida operatsioonisüsteemi praeguse versiooni Windows. Kui pärast funktsiooni kutsumist registris AL sisaldab nulli, siis operatsioonisüsteemi ei laadita. Vastasel juhul pole meie programmil jällegi mõtet enam jätkata.

Vaatleme järgmise programmi näidet. See on eelmise programmi modifikatsioon; kõik uued juhised on tähistatud tärniga (*).

Org 100h

Alusta:

; Seadistage segmendiregistrid

mov kirves, cs ;*
mov ds, kirves ;*

; Kontrollime, kas oleme tõesti reaalrežiimis

mov eax, cr0 ;* kontrolli nullbiti olemasolu
katsetada al, 1 ;* register CR0
jz no_pm ;*

mov ah, 09h ;* DOS-i funktsioon 09h
mov dx, pm_msg ;* reaväljund
int 21h ;*
ret;* ja välju

no_pm:
; Kontrollige, kas programm töötab Windowsi all

mov kirves, 1600h ;* 1600h multiplekseri funktsioon
int 2fh ;* katkestab - hankige Windowsi versioon
katsetada al, al ;* kui mitte 0 - viga
jz no_windows

; Kuva veateade

mov ah, 09h ;*
mov dx, win_msg ;*
int 21h ;*
ret ;*

no_windows:
; Oleme kindlasti reaalrežiimis
; Keela maskeeritavad katkestused

; Keela mittemaskeeritavad katkestused (NMI)

sisse al, 70h
või al, 80h
välja 70h, al

; Avage liin A20

sisse al, 92h
või al, 2
välja 92h, al

; Lülitage kaitstud režiimi

mov eax, cr0
või al, 1
mov cr0, eax

; Nüüd oleme kaitstud režiimis
; Väike kahekordne silmus

mov cx, 20

tsükkel:
mov kirves, cx
mov cx, 0ffffh
silmus $
mov cx, ax
silmus tsükkel

; Lülituge reaalrežiimile

mov eax, cr0
ja al, 0feh
mov cr0, eax

; Sule rida A20

sisse al, 92h ;*
ja al, 0fdh ;*
välja 92h, al ;*

; Luba mittemaskeeritavad katkestused (NMI)

sisse al, 70h ;*
ja al, 7h ;*
välja 70h, al ;*

; Luba maskeeritavad katkestused

sti ;*

; Oleme tagasi reaalrežiimis

ret ; täitke programm

; Veateated

pm_msg: ;*
db "Viga: töötab juba kaitstud režiimis!$" ;*
win_msg: ;*
db "Viga: Microsoft Windows tuvastati!$" ;*
Ka see näide ei näita veel 32-bitiste käskude rakendamist. Selleks tuleks end kurssi viia ka järgmises peatükis oleva materjaliga. Lisaks on näitel järgmine puudus: kutsutakse funktsioone DOS (int 21h), mis hakkab juba vastuolus olema meie programmi sõltumatusega operatsioonisüsteemist MS-DOS. Tulevikus tuleb operatsioonisüsteemi funktsioonide kasutamisest lahti saada ja üle minna funktsioonide kasutamisele BIOS. Kuid praegu piisab, kui piirduda selle koodiga.

Hetkel mängin x86 Assemberiga, et oma madalal tasemel programmeerimisoskusi parandada. Mul on praegu väike probleem 32-bitise kaitstud režiimi adresseerimisskeemiga.

Olukord on selline:

Mul on 0x7e0 laaditud programm, mis lülitab CPU kaitstud režiimi ja hüppab koodis vastava märgini:

[...] kood CPU lülitamiseks kaitstud režiimis [...] jmp ProtectedMode [...] bitti 32 ProtectedMode: .halt: hlt jmp .halt

Siiani töötab kõik suurepäraselt. "Jmp ProtectedMode" töötab ilma selgesõnalise kaughüppeta eellaadimisjärjekorra tühjendamiseks, kuna see programm laaditakse nihkega 0 (alguses org 0), sundides koodisegmenti osutama õigesse kohta.

Minu praegune probleem seisneb selles, et "ProtectedMode" otseteel tahan minna teise 0x8000-st laaditud programmi juurde (testisin seda mälu tühjendamisega, laadimisfunktsioon töötas õigesti ja programm laaditi õigesti kuni 0x8000-ni).

Kuna protsessor on nüüd pigem ProtectedMode kui RealMode režiimis, on adresseerimisskeem erinev. ProtectedMode kasutab deskriptoreid, et otsida deskriptorite tabelist baasaadressi ja piirangut, et lisada antud nihe ja saada füüsiline aadress (nagu ma aru saan). Seetõttu tuli enne ProtectedMode'i sisenemist installida GDT.

Minu oma näeb välja selline:

%ifndef __GDT_INC_INCLUDED__ %define __GDT_INC_INCLUDED__ ;************************************ ;* Globaalne deskriptortabel (GDT) * ; ********************************* NULL_DESC: dd 0 ; null deskriptor dd 0 CODE_DESC: dw 0xFFFF ; piir madal dw 0 ; baas madal db 0 ; alus keskmine db 10011010b ; juurdepääs db 11001111b; granulaarsus db 0 ; baaskõrg DATA_DESC: dw 0xFFFF ; andmete deskriptor dw 0 ; piir madal db 0 ; baas madal db 10010010b ; juurdepääs db 11001111b; granulaarsus db 0 ; põhi kõrge gdtr: Limit dw 24 ; GDT baasi pikkus dd NULL_DESC ; GDT %endif alus ;__GDT_INC_INCLUDED__

ja laaditi GDT registrisse kaudu

Lgdt

Mida ma pole siiani aru saanud, on see, kuidas ma saan nüüd GDT-d kasutades ProtectedMode'is füüsilisele aadressile 0x8000 minna?

Minu esimesed mõtted olid valida koodi deskriptor (CODE_DESC), mis peaks osutama 0x7e00-le (praegused programmid laaditi) ja kasutada 0x8000 (512 baiti) saamiseks vajalikku nihet, mille tulemuseks on hüppekäsk:

Jmp CODE_DESC:0x200

Aga see ei tööta.

Jmp 0x7e0:0x200

ei tööta ka...

Kas teil on aimugi, millest ma siin ilma jään? Võib-olla jäin 32-bitise ProtectedMode'i adresseerimisskeemi ja GDT kasutamise kohta midagi olulist kahe silma vahele.

Täielik kood:

Bitid 16 org 0 ; laetud nihkega 0000 (phys addr: 0x7e00) jmp Start Start: xor ax, ax mov ax, cs mov ds, ax ; uuenda andmesegment cli ; selge katkestab lgdt ; laadige GDT GDTR-ist (vt gdt_32.inc) kutsuge OpenA20Gate ; avage A20 värava kõne EnablePMode ; hüppab ProtectedMode'i ;******************* ;* Avab A20 värava * ;******************* OpenA20 Gate: sisse al, 0x93; lüliti A20 värav läbi kiire A20 pordi 92 või al, 2 ; komplekt A20 Gate bit 1 ja al, ~1 ; tühjenda INIT_NOW bitt välja 0x92, al ret ;****************************** ;* Lubab kaitstud režiimi * ;******** ****************** EnablePMode: mov eax, cr0 või eax, 1 mov cr0, eax jmp ProtectedMode ; see töötab (hüppab sildi juurde ja peatub) ;jmp (CODE_DESC-NULL_DESC):ProtectedMode ; => ei tööta ;jmp 08h:ProtectedMode , => ei tööta ;**************** ;* andmeväljad * ;* &includes * ;******** ******* %include "gdt_32.inc" ;****************** ;* Kaitstud režiim * ;************ * ******* bitti 32 ProtectedMode: ;siin tahan hüpata füüsilisele adr-ile 0x8000 (elf64 asm programm) .halt: hlt jmp .halt

11