Qorunan rejim nədir və o, nə ilə gəlir? Intel prosessorlarının qorunan rejimə keçidi Assembler tərəfindən qorunan rejimə keçid

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Ъ LPFPTSCHI SSPUSSHCHUEPSHYFYPSHYSCHYFMVPSHYFZYFP 640 LYMPVBKF). fBL LFP Y VSHMP PE CHTENEOB RETCHSCHI RTPGEUUPTPCH CHTPDE 8086, OP RPUFEREOOP PVIENB PRETBFYCHOPK RBNSFY UFBMP OE ICHBFBFSH. h FP CE CHTENS FTEVPCHBMPUSH UPITBOYFSH RPMOHA PVTBFOKHA UPCHNEUFYNPUFSH, YUFPVSHCH 16-TBTSDOSH PRETBGYPOOSCH UYUFENSCH CHTPDE DOS UNPZMY OPTNBMSHOPBFSHOP TBVPFSH 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 VSHMP YЪPMYTPCHBOOP PF RTYMPTSEOYK Y NPZMP YNY UCHPVPDOP HRTBCHMSFSH. lFP OEPVIPDYNP MAVPK RPMOPGEOOOPK NOPZPBBDBUOPK UYUFEN.

FPZP HAQQINDA, UFP DPVBCHMSEFUS CH TEBMSHOPN TETSYNE HAQQINDA RTPGEUUPTBBI, LPFPTSHCHE RPDDETSYCHBAF 32-VYFOSCHK BDTEU (i386 Y CHCHYE) - DPVBCHMSAFUS OPCHUSFUSTSEFUS OPCHUSHEESCHEV : EAX, EBX, ECX, EDX, ESP, EBP, EIP, ESI, EDI, EFLAGS. lBL NPTsOP DPZBDBFSHUS, LFP 32-VYFOSCH CHETUY PVSHYUOSCHI TEZYUFTPCH TEBMSHOPZP TETSINB (LYNEOY TEZYUFTB DPVBCHMSEFUS RTYUFBCHLB "E"). Chue UFY 32-VYFOSCH TEZYUFTSH LTPNE EIP DPUFHROSCH Y CH TEBMSHOPN TETSYNE, OP CH FBLPN UMHYUBE VHDHF ЪBOINBFSH HAQQINDA 1 VBKF VPMSHYE (LOYN DPVBCHMSEBMOSCHZHLUK). RTPGEUUPTE NMPPTSE HAQQINDA 286 FY LPNBODSCH VHDHF OELPTTELFOSCH. nsch NPTSEN, OBRTYNET, OBRYUBFSH mov eax, 0x12345678 Y RPUME bFPZP CH AX VHDEF 0x5678, RPFPNH YuFP ON LBL VSH SCHMSEFUS "PLOPN" CH NMBDİKHA YUBBOXDİMBBUSHB, UBUFSH AX). TEZYUFTB-PFPVTBTTSEOYS UFBTYEK YUBUFY 32-VYFOSHI TEZYUFTPC OE UHEEUFCHHEF - NPTsOP EI YYCHMEYUSH FPMSHLP U RPNPESH BTYZHNEFYLY (OBRTYNET, AUDCHBOSHBOHFCHPEsh1 eax, 16, FPZDB CH AX VHDEF UFBTYBS RPMPCHYOB, OP UPDETSYNPE NMBDYI VYF VHDEF KHFETSOP) . YuFP IBTBLFETOP, CH ЪBEEYEOOOPN TETSYNE OBPVPTPF, LPNBODSCH TBVPFSCH U 16-VYFOSHNY TEZYUFTBNY (OP OE 8-VYFOSHCHNY) FTEVHAF RTEZHYLU, RPFPNH OUNPPCHBOUTTBSHPÜTB, BB VPMSHYE, CH ЪBEEYEЈOOPN TETSYNE VSCHUFTEE CHSHRPMOSAFUS Y ЪBOINBAF NEOSHIE NEUFB YNEOOOP LPNBODSCH 32 - VYFOPK BTYJNEFILY.

fBLCE, FERTSH KH OBU O 2 UEZNEOFOSCHI TEZYUFTB VPMŞYE - 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 LPNBODBNY Y OELPFPTSHNY UFTTBCHELPCHNYREPNG, YSNY) Y OBDP SCHOP KHLBYSCHBFSH, YUFP CHSHCH IPFYFE PVTBEBFSHUS YUETE OYI. oBRTYNET, mov balta, .

rPNYNP bFPZP TBUYYTEOYS TEZYUFTPC, DPVBCHMSAFUS OPCHCHCHE HRTBCHMSAEYE TEZYUFTSH (TBOSHYE CHMYSM HAQQINDA TETSYN TBVPFSH RTPGEUUPTB FPMSHLP CR0CR3, CR0CR3, 4,. 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 UFTBOYUOPYY. DPUFHROSCH CH TEBMSHOPN TETSINE oxuyun.

h ЪBEEYEЈOOPN TETSYNE RPOSFYE WEZNEOFB 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 ЪBEEYEOOOPZP TETSYNB DEMSFUS HAQQINDA DCHB FIRB - UEZNEOFSH LPDB Y UEZNEOFSH DBOOSCHI (UBNPN DEM EUFSH EE CHUSLYE TSS Y LDT, OP RPLB POY OBSHBTCEP HAQQINDA). h CS NPTsOP ЪБЗТХЦБФШ FПМШЛП OPNETB DEULTYRFPTCH, PRYUBOOSCHI LBL UEZNEOF LPDB, h PUFBMSHOSHE UEZNEOFOSHE TEZYUFTSH NPTsOP ЪBZTHTSBFSH MAVSHCHE LÜBZTHTSBFSH -FPMSHCHE LUBOSSHLP. 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 HAQQINDA PDYO Y FPF TSE TEZYPO RBNSDOSSHYOUFYFY, B DTHZPK DPUFKHROSCHN DMS ЪBRYUY.

oEUNPFTS HAQQINDA RPDDETSLH UEZNEOFBGYY, POB UYFBEFUS KHUFBTECHYEK. OH Windows, OH Linux OE YURPMSHJHAF EЈ CH RPMOPC NETE, B HAQQINDA 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Ъ DCHHI DEULTYRFPTPCH, KH LBTSDPZP YЪ LPFPTSCHI VBPCHSHCHK BDTEU 0, B TBNET BDNTECHBLUYPKs ( TBNET 4 sn. BNSFY CH 32-VYFOPN TETSYNE). h FBLPN UMKHYUBE ZPCHPTSF, YuFP NSCH CHLMAYUYUMY TETSYN MYOEKOSCHI BDTEUPCH - UNEEOOYE UPPFCHEFUFCHHEF ZHIYYUUEULPNH 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 (OBRTYNETSYTEDNED+) OFBGYA (FP EUFSH CHSC UNPTSEFE RPMOPGEOOOP RTPZTBNNNYTPCHBFSH FPMSHLP HAQQINDA Assembler) Y, OBLPOEG, CHCH OE UNPTSEFE RETEOUFY UYUFENKH HAQQINDA DTHZHA BTIYFELFHTH, RPFPNH YuFP x86 EDYOUFCHEOOBS, LPFPTBS KHNEEF LFPF NEIBOYN (Y FP, CH 64-VYFOPN TETSYNE RPMS VBPCHPZP BDTEUB Y TBNETOFFUSSHB Y TBNETAFUSSHY'ZY' YOZHPTNBGYS P RTBCHBI DPFHRB).

lBL S HCE ULBBM, FBVMYGB DEULTYRFPTPCH UEZNEOFPCH ZHTNYTHHEFUS UBNPK PRETBGYPOOPK UYUFENPK. YuFPVSH KHLBBBFSH RTPGEUUPTH, ZDE POB OBIPDFUS YURPMSH'HEFUS UREGYBMSHOBS LPNBODB - lgdt (Qlobal Deskriptor Cədvəlini yükləyin). pOB RTOYNBEF 6-VBKFPCHHA RETENEOOKHA CH RBNSFY. RETCHCHE EЈ 16 VYF UPDETSBF TBNET FBVMYGSHCH VBKFBI (FBLYN PVTBBPN, NBLUINBMSHOPE LPMYUUEUFCHP DEULTYRFPTPCH - 65536 / 8 = 8192), RPUMEDHAEYFYOBDÇПЧК VYF - U CH RBNSFY UBNPK FBVMYGSHCH (FP EUFSH VEЪ HYuЈFB CHUEI UEZNEOFPCH). yNEEF UNSHUM CHSTTBCHOSFSH OBYUBMP FBVMYGSHCH HAQQINDA 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 HAQQINDA BMENEOF FBVMYGSH DEULTYRFPTPCH CH UEZNEOFOPN TEZYUFTE OBSCCHBEFUS FBL) RTYCHPDYF L PYYVLE. ъOBYUIF VPMEE-NEOOEE TBVPFPURPUPVOBS FBVMYGB DEULTYRFPTPCH DPMTSOB UPDETSBFSH IPFS VSH 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 UYUFENSHY LPD RTYMPTSEOYK PFDEMEOSCH DTHZ PF DTHZB U FPK GEMSHA, YuFPVSH SDTP NPZMP RPMOPUFSHA KHRTBCHMSFSH RTPGEUUPTPN, B RTYMPTSEOYS OE NPUSCHTCHPSHBZBFY ( X OBU NOPZPЪBDBUOBS pu). lPD YURPMOSEFUS U PRTEDEMOOOSCHN KHTPCHOEN RTYCHYMEZYK. h x86 YI GEMSHCHI 4 YFHLY - PF 0 DP 3. oKHMECHPK HTPCHEOSH UBNSCHK RTYCHYMEZYTPCHBOOSCHK (NPTSEF CHSHCHRPMOSFSH MAVSHCH LPNBODSCH Y NEOSFSH TETSYNSCH FTPGETBOSCHVEPF), CHK." lBL Y CH UMHYUBE U UEZNEOFBGYEK, TBTBVPFYUYLY x86 RETEVPTEYMY U ZHKHOLGYPOBMPN Y CHUE pu YURPMSHJHAF MYYSH DCHB KHTPCHOS YYUEFSHCHTI CHPNPTSOSCHI, BTHYTBHTSCHTECHDEFGYEK, BTHYTBTSCHDEFGEZFZ FPMSHLP YI. x LBTSDPZP UEZNEOFB CH EZP DEULTYRFPTE KHLBBO DPL (Deskriptor imtiyaz səviyyəsi)- HTPCHEOSH DPUFHRB OEPVIPDYNSCHK DMS DBOOZP UEZNEOFB. OERTYCHYMEZYTPCHBOOSCHK LPD OE NPTsEF RPMKHYUFSH DPUFHR L UEZNEOFKH U HTPCHOEN DPUFKHRB 0, B RTYCHYMEZYTPCHBOOSCHK LPD NPTsEF RPMKHYUFLPZNECHOFENBUE.

UEMELFPT UEZNEOFB, LPFPTSCHK UPDETSYFUS CH UEZNEOFOPN TEZYUFTE, SCHMSEFUS OE RTPUFP OPNETPN BMENEOFB CH FBVMYGE, OP Y KHLBBBFEMEN KHTPCHOS DPUFHRB - NMBHPCHYFTYBH2 YMEZYK (PF 0 DP 3), B HCE UFBTYYE OPNET UBNPK FBVMYGSHCH. fBLYN PVTBBN UEMELFPT = (YODELU_DEULTYRFPTB shl 2) + RPL. RPL- Tələb olunan imtiyaz səviyyəsi - ЪBRTBYCHBENSCHK HTPCHEOSH RTYCHYMEZYK. rTY LFPN RPL DPMTSEO VSHFSH VPMSHYE YMY TBCHEO NBLUINBMSHOPNKH YЪ DPL Y CPL (Cari imtiyaz səviyyəsi). 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 DPFBFPYuOP ЪBRKHFBOOP, OP CHRPMOE NPTsOP PVPKFYUSH RPL = DPL, LBL NSCH Y RPUFHRIN.

rPLB NSCH RYYEN FPMSHLP SDTP, NSCH VHDEN TBVPFBFSH CH OHMECHPN LPMSHGE ЪBEIFSHCH (FBL EEЈ OBSCHCHBAF KhTPCHOY RTYCHYMEZYK), YUFPVSH YNEFSH RPMOSHCHK LBRTEBTRHB.

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

; ъBRHUL 32-TBTSSDOPZP 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ə ya eax, 1 mov cr0, eax ; RETEKDEN HAQQINDA 32-VYFOSHCHK LPD jmp 8:start32; fBVMYGB DEULTYRFPTPCH UEZNEOFPPCH DMS 32-VYFOPZP SDTB align 16 gdt32: dq 0 ; NULL - 0 dq 0x00CF9A000000FFFF ; KOD - 8 dq 0x00CF92000000FFFF ; DATA - 16 gdtr32: dw $ - gdt32 - 1 dd gdt32 ; 32-VYFOSHCHK LPD istifadə32 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 HAQQINDA BLTB mov bayt, "!" ; ъБЧТЭТИІе jmp $

ьFPF LPD UMEDHEF DPRYUBFSH L OBYENH OBYUBMSHOPNH ЪBZTHYUYLH.

RETED RETEIPDPN CH ЪBEEYEЈOOOSCHK TETSYN OEPVIPDYNP ЪBRTEFIFYFSH RTYEN BRRBTBFOSCHI RTETSCHCHBOYK (LMBCHYBFKHTB, NSHCHYSH, FBKNET Y DTHZIE RHUFTPKUFKBREPUFTECHB), FUS OE X DEM, B UCHPY PVTBVPFYUYLY NSCH EEЈ OE OBRYUBMY, RPFPNKH RETCHPE TSE RTETSCHCHBOYE PVTHYYF 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 HAQQINDA FP, YuFP NSCH HCE RETEYMY CH ЪBEEYEYOOOSCHK 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 ЪBEEYEOOOPN TETSYNE Y OEPVIPDYNP RETELMAYUIFSHUS CH TETSIN ZEOETBGYMSPYPYP6Z, BUUENVMETB1Z URPMSH'HEFUS RP KHNPMYUBOYA) .

lPNBODB movzx TBUYYTSEF CHFPTPK BTZKHNEOF DP RETCHPZP. h UNSHUME, YuFP JЪ 16 VYFOPZP OBYUEOYS SP RPMHYUBEFUS 32-VYFOPE. UFBTYYE VYFSH PVOHMSAFUS (NBMP MY, YuFP FBN VShchMP DP OBU). rTEDRPUMEDOSS LPNBODB DENPOUFTYTHEF OBN CHPNPTSOPUFY ЪBEEYEЈOOOPZP TETSYNB - NSCH PVTBEBENUS RP BVUPMAFOPNH 32-VYFOPNH BDTEUKH L CHYDEP-RBNSBODB DENPOUFTYTHEF OBN, !" CH RTBCHSHCHK OYTSOYK KHZPM LBOBOB (FELUFPCHSHCHK BLTBO YNEEF TBTEYEOYE 80 x 25 UYNCHPMPCH, LBTSDSCHK UYNCHPM ЪBOYNBEF CH RBNSFY DCHB VBKFYNFYB - LPFFTCHPYBHBH - LPFTSHPYBHB).

nsch VPMSHYE OE NPTSEN PVTBEBFSHUS L UETCHYUBN BIOS, FERETSH RTYYMP CHTENS OBN UFBFSH RPMOPUFSHA UBNPUFPSFEMSHOSCHNY Y UBNYN HRTBCHMSFSH CHUEN PVPTHDPHBOYEN. Oblfsh Mərkəzi Bankının RetebztkhTkhzbfshus, LMBCHY NSHB RPLB HNEEN, RPFPNH RTPUFPP KO-da RPNPASH LPNBODSH JMP $ (UBNHA LPNHHO-nun FH haqqında REPEIPD - VUULPOEOSHCH GELM).

h OBYEN boot.cfg LPNBODH S64 RPLB ЪBNEOYN HAQQINDA S32. FERETSH, EUMY CHU RTBCHYMSHOP UDEMBMY, OBY ЪBZTHYUYL VKhDEF ЪBCHETYBFSH UChPA TBVPFKH CHCHCHPDPN CHPULMYGBFEMSHOPZP ЪOBLB Ch KHZPM LBEEYPEC YЪOBLB YЪOPZPM LBOBE. lFP FPMSHLP OBYBMP. nsch OBLPOEG-FP RTBLFYUEULY XYMY YY TEBMSHOPZP TETSYNB (UBNPN DEM FBN EEЈ PUFBMPUSH OENOPZP DEM HAQQINDA) CH ЪBEEYEЈOOSHCHK. rPULPMSHLH HAQQINDA ЪБЗТХЪУйЛ CHSHRPMOSEFUS CH OHMECHPN UEZNEOFE TEBMSHOPZP TETSINB, CHUE UNEEOYS UPPFCHEFUFCHHAF ZHYYYUEULYN BDTEUBN Y RTY RETEEIPDEEPTYPEYKOOCH, OYUEZP RETEUUYFSHCHBFSH.

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

Org 0x7C00 jmp açılışı ; ъБЗПМПЧПЛ ListFS align 4 fs_magic dd ? fs_version dd ? fs_bayraqları 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 ? ; ъБЗПМПЧПЛ ЖБКМБ virtual 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? virtual son; dBOOSHE OBYUBMSHOPZP ЪБЗТХЪУЛБ etiket sektor_başına_track sözü $$ etiketində head_count bayt $$ + 2 etiket disk_id bayt $$ + 3 reboot_msg db "Hər hansı düyməni basın...",13,10,0 boot_file_name db "boot.bin",0 ; hCHCHPD UFTPLAY DS:SI HAQQINDA BLTB write_str: push si mov ah, 0x0E @: lodsb test al, al jz @f int 0x10 jmp @b @: pop si ret ; lTYFYUEULBS PYYVLB xətası: pop si call write_str ; RETEЪБЗТХЛБ yenidən başladın: mov si, reboot_msg zəng 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 byte, 0xFF je .use_EDD push bx cx si div mov cl, dl inc cl div mov dh, al movch dl, mov bx, di mov al, 1 mov si, 3 @: mov ah, 2 int 0x13 jnc @f xor ah, ah int 0x13 dec si jnz @b .error: zəng xətası db "DISK ERROR",13,10 ,0 @: pop si cx bx dx ret .use_EDD: push si mov byte, 0x10 mov byte, 0 mov word, 1 mov , di push es pop word mov , ax mov , dx mov word, 0 mov word, 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: zəng xətası db "TAPILMADI",13, 10.0 @: mov di, f_info zəng 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 . tapıldı: pop di dx cx ret ; ъБЗТХЛБ FELHEEZP ZHBKMB CH RBNSFSH RP BDTEUKH BX:0. lPMYUEUFCHP ЪБЗТХЦЕОШИ UELFPTPCH CHPCHTBEBEFUS CH AX load_file_data: push bx cx dx si di mov ax, word mov dx, word .load_list: cmp ax, -1 jne @f cmp dx, -1 jne @f movle c:x . 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 açılış: ; 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 byte, 0xFF jmp .disk_detected @: mov ah, 0x08 xor di, di pushesh in j0x1 poptc. mov, dh və cx, 111111b mov , cx .disk_detected: ; ъБЗТХЪН РТПДПМЦЭОЕ ОБИБМШОПЗП ъБЗТХУЛБ mov si, boot_file_name mov ax, word mov dx, word call find_file mov bx, 0x7E00 / 16 call load_file_data ; RTDDPMCEOYE HAQQINDA RETEIPDYN jmp boot2 ; rKHUFPE RTPUFTBOUFCHP Y UYZOBFKHTB rb 510 - ($ - $$) db 0x55.0xAA ; dPRPMOYFEMSHOSH DBOOSH ЪБЗТХУЛБ load_msg_preffix db "Yüklənir "",0 load_msg_suffix db "". ..",0 ok_msg db "OK",13,10,0 config_file_name db "boot.cfg",0 start16_msg db "Starting 16 bit kernel...",13,10,0 start32_msg db "32 bit kernel başlayır. ..",13,10,0 ; tБВЪВЪОЕУФТПЛИ DS:SI RP UYNCHPMH UMEYB split_file_name: push si @: lodsb cmp al, "/" je @f test al, al jz @f jmp @b @: mov bayt, 0 mov 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 test baytı, 1 jz @f mov si, bp mov dx , söz mov ax, söz jmp @b @ : zəng load_file_data mov si, ok_msg zəng write_str pop bp si ret ; g_fayl_name mov bx, 0x1 000 / 16 zəng load_file ; chShchRPMOYN ЪБЗТХПУОШК УЛТИРФ mov bx, 0x9000 / 16 mov bp, 0x6000 mov dx, 0x1000 .parse_line: mov si, dx .parse_char: lodsb test al, al jz .config_end cmp al, 10 je .run_commandr.cmp.run_commandrse .run_command: mov bayt, 0 xchg dx, si cmp bayt, 0 je .parse_line ; rHUFBS UFTPLB cmp baytı, "#" je .parse_line ; lPNNEOFBTYK cmp bayt, "L" və .load_file ; ъБЗТХЛБ ЖБКМБ cmp bayt, "S" je .start ; ъBRHUL SDTB; oEYCHEUFOBS LPNBODB mov al, mov [.cmd], al zəng xətası db "Naməlum yükləmə skripti əmri "" .cmd db ? db ""!",13,10,0 .config_end: ; rTY RTBCHYMSHOPN LPOZHYZHTBGYPOOPN ZHBKME NSCH OE DPMTSOSCH UADB RPRBUFSH; jmp yenidən başladın; ъБЗТХЛБ ЖБКМБ.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, 16 mul cx mov word, ax mov word, dx mov word, 0 mov word, 0 pop ax 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 zəng xətası db "YÜKLƏMƏDİ NƏZƏR",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 TSTSDOPUFSH SDTB çağırış xətası db "Yanlış başlanğıc əmri arqumenti",13,10,0 ; ъBRHUL 16-TBTSDOPZP SDTB.start16: mov si, start16_msg mov bx, 0x6000 mov dl, jmp 0x9000 ; ъBRHUL 32-TBTSSDOPZP 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 zəng xətası db "Tələb olunan i386 və ya daha yaxşı",13,10,0 @: ; ъБЗТХХЪН ЪБУУЭОЭ Ч GDTR lgdt ; ъBRTEFYN RTETSCHCHBOYS cli; RETEKDEN CH ЪBEEYEЈOOOSCHK TETSYN mov eax, cr0 və ya eax, 1 mov cr0, eax ; RETEKDEN HAQQINDA 32-VYFOSHCHK LPD jmp 8:start32; fBVMYGB DEULTYRFPTPCH UEZNEOFPPCH DMS 32-VYFOPZP SDTB align 16 gdt32: dq 0 ; NULL - 0 dq 0x00CF9A000000FFFF ; KOD - 8 dq 0x00CF92000000FFFF ; DATA - 16 gdtr32: dw $ - gdt32 - 1 dd gdt32 ; 32-VYFOSHCHK LPD istifadə32 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 HAQQINDA BLTB mov bayt, "! " ;

Əməliyyat sistemini yazmaq üçün bir çox detalları başa düşmək lazımdır. Odur ki, icazə verin sizi bir az maarifləndirim (amma gəlin razılaşaq ki, mananı özünüz oxuyacaqsınız ki, danışmağa bir şeyiniz olsun).
Düzünü desəm, internetdə PM-də bir ton material var və iley və pehat bu rejim haqqında bir az danışdılar, amma məndən hər halda ümumi şəkildə təsvir etməyi xahiş etdilər. İndi mən nəzəriyyəni qısaca təsvir edəcəyəm (əslində, Intel bunun üçün xüsusi olaraq mana yazmışdı), sonra kod yazmağa başlayacağıq.

Qorunan rejimə giriş.
Beləliklə, PM DOS günlərindən bəri hər kəsə tanış olan real rejimdən (RM) əhəmiyyətli dərəcədə fərqlənir. İndi buna öyrəşməli olacaqsınız: 64 kilobaytlıq statik seqmentlər, 1 kilobaytlıq kəsmə cədvəlləri, seqment registrlərində seqment əsas ünvanları, ümumiyyətlə, tamamilə yeni dünya yoxdur.
İndi seqmentlər təsvir edilmişdir Qlobal Deskriptor Cədvəli (GDT). Bu cədvəl yalnız bir nüsxədə ola bilər. O, yaddaşda olan bir quruluşdur. Seqment deyil! O, yaddaşın istənilən yerində yerləşdirilə bilər, lakin onun ünvanı və limiti GDTR registrinə yazılır. Budur onun strukturu:

Cədvəl özü aşağıdakı strukturun qeydlərindən ibarətdir (yeri gəlmişkən, sıfır qeydi boşdur. Bu vacibdir. Sıfır deskriptoru ilə "təsvir edilən" yaddaşa daxil olduqda #GP - Ümumi Qoruma xətası alacaqsınız):
Bu quruluşa daha yaxından nəzər salaq.

1. Seqment Limiti:
Bu sahənin məqsədi adından aydın olsa da, bir incəlik var. Köpək G (Qranularlıq) bitində basdırılır.
Qurulmayıbsa, yaddaş baytlarda 'hesablanır'. Bu halda, seqment ölçüsü 1 bayt ölçüsü üçün 1 baytdan 1 meqabayta qədər dəyişə bilər.
Onu 1-ə təyin etsək, səhifə yaddaşının ünvanlanması təqdim olunacaq. Onda biz 4 kilobayt ölçü dəyişikliyi (səhifə ölçüsü) ilə 4 kilobaytdan 4 giqabayt RAM-a ünvanlaya biləcəyik. Ümumiyyətlə, səhifənin ünvanlanmasına üstünlük verilir (müqayisə edin (1MB+64Kb-16bayt) və 4GB). Bu yazıda yalnız seqment ünvanlanmasından danışaq. Peyjinq ayrıca müzakirəyə layiqdir.

2. Əsas Ünvan:
Burada bazanın fiziki ünvanını göstəririk.

3.Növ sahəsi:
Bit birləşmələri seqment növünü müəyyən edir:

4. S (deskriptor növü):
Intel sənədlərində deyilir ki, əgər bu bit təyin olunmayıbsa, bu deskriptor sistem seqmenti üçündür, əks halda - kod və ya məlumat. Sistem dedikdə LDT, TSS, Interrupt Gates və digərləri nəzərdə tutulur (onlar haqqında daha sonra).

5. DPL (Deskriptor Privilege Level):
Təsvir edilən seqmentin imtiyazları. Hər kəs Rings-i tanıyır.

6. P (seqment mövcuddur):
Bu bit qurulubsa, prosessor seqmentin artıq yaddaşda olduğunu "bilir" (baxmayaraq ki, etibarlı demək daha yaxşı olardı). Əgər seqment registrinə P biti təyin olunmamış deskriptor seçicisini yükləsəniz, #NP (mövcud deyil) istisnası baş verəcək. Ümumiyyətlə, bu təmtəraqlı ifadənin mənasını bir az sonra açıqlayacağam.

7.D/B:
Müxtəlif növ seqmentlər üçün fərqli şəkildə şərh olunur.
1. Kod seqmentləri üçün:
32 və ya 16 bit effektiv ünvan uzunluğu və operand ölçüsü.
(1-32; 0-16);
2. Yığın üçün:
Yığın göstəricisi 32 və ya 16 bitdir. (1-32; 0-16);

8.G:
Seqment limitinin ölçüldüyü vahidlərə (bayt, səhifələr) təsir edir. Ümumiyyətlə, CR0 registrinin 31 bitini təyin etməklə, PM-ə keçərkən Peyjinq aktivləşdirilə bilər.

Daha bir neçə məlumat:
Güman edirik ki, Qlobal sözünü boş yerə qoymayıblar. Beləliklə, başqa bir əlamət var. Düzdü, bir də var Yerli deskriptor cədvəli. Onların böyük bir çeşidi ola bilər. Məsələn, onlardan tapşırıqların icrasında və s. Və burada LDT artıq bir seqment təşkil edir! Beləliklə, "yerli təsviri cədvəl seqmenti deskriptoru" kimi ifadələrə öyrəşin.

Cədvəli təsvir etdikdən sonra onu registrə yükləmək lazımdır GDTR. Bu mov tərəfindən edilmir. GDTRəmri ilə doldurulur lgdt fword (dəyər). Yəni bu strukturu özünüz yaradıb yuxarıda qeyd olunan registrə yükləməlisiniz. Hələ də bu reyestrlə işləyən komandalar var, lakin biz Avropada çapırıq.

Daha bir şey. PM-də seqment registrləri seqmentlərin əsas ünvanlarını deyil (RM-də olduğu kimi), lakin adlanan xüsusi təlim keçmiş əşyaları saxlayır. seçicilər. Onların quruluşu belədir:

Burada İndeks cədvəldəki deskriptorun sıra nömrəsidir.
TI deskriptorun harada axtarılacağını göstərir (in GDT və ya LDT).

İndi cədvəlin necə qurulacağı artıq aydındır, gəlin PM-ə necə getmək barədə danışaq (qeyd edək ki, bu yalnız RM-dən edilə bilər). Ümumiyyətlə... sadəcə olaraq CR0 nəzarət registrinin 0 bitini təyin etməlisiniz. Yalan desəm də. Əvvəlcə bütün fasilələri söndürməlisiniz ( NMI (Maskalana bilməyən fasilələr) daxil olmaqla), ünvan xəttini açın A20(32-bit ünvanlamanın mövcud olması üçün), yükləyin GDTR, və işarəyə atlayın - başlayın.

Kodumuzu 1000h:0 (RM-nin ünvanı, qeyd edirəm) ünvanına yükləyən yükləyicidən istifadə edək (KOLIBRI-lərdən istifadə edə bilərsiniz).
Burada yükləyicidən birbaşa PM-ə keçəndə hər şey o manalardakı kimi hamar olmayacaq. Hər şey bir az daha mürəkkəbdir. Amma əvvəlcə bootloaderin yükləyəcəyi koda baxaq (biz hər şeyi FASM-də yazırıq).Bu bir növ helloworlddur.Gəlin yükləyək, PM-ə gedək və salamı çap edək.Bu qədər.

İkili format
xor balta, balta
cli ;seqment qeydlərini yenidən işə salın
mov ss, balta
xor sp, sp
sti
mov balta, 3
int 10h

Jmp 1000h:r_start

Mov ax,1000h;registrləri yenidən konfiqurasiya edin
mov ds, balta
hərəkət, balta

Al, 0x92; A20-ni aktivləşdirin
və ya digər, 2
0x92 çıxışı, al

Lgdt fword ;GDTR reyestrini yükləyin
mov eax,cr0
və ya al,1;bit 0 təyin edin
mov cr0,eax;PM-i yandırın

Jmp fword 08h:Startup32; PM-ə keçin

Align 8 ;prosessor düzülmüş lövhəni daha sürətli idarə edir
GDT:
dq 0 ;boş
db 0FFh,0FFh,0,0,0.9Ah,0CFh,0 ;kod
db 0FFh,0FFh,0,0,0.92h,0CFh,0;data
db 0FFh,0FFh,0,80h,0Bh,92h,40h,0 ;video seqment
$-GDT dəyərində GDT_SIZE etiketi
GDTR:
dw GDT_SIZE-1
gg GDT+10000h
; 32 bitlik ünvanı yazmalısınız. İndi biz 1000h seqmentindəyik, onun bazası 1000h * 10h (fiziki ünvana görə) => GDTR-nin fiziki ünvanı (teqlər!) = 10000h (seqment bazasının fiziki ünvanı) + ofset

Virtual ;indi, əslində, seqmentin sonuna qədər boşluğu doldururuq
rb 10000h-$;
virtual bitir
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PM32 Giriş;;;;;;;;;;;;;;;;; ;;
istifadə 32
org $+10000h;buna görə: PM-də biz Flat seqmentləri ilə işləyirik və əgər PM kodunu org-dan əvvəl buraxsaq, o zaman;seqmentdaxili ünvan Flat ünvanı ilə üst-üstə düşməyəcək. Beləliklə, budur.

Startup32: ;PM-ə giriş nöqtəsi
mov ax,10h; burada seçiciləri itələyirik. Tez-tez (! seriya nömrəsini unutma
mov es,ax ;table) seçici kod seqmenti - 08h. məlumat - 10 saat, video seqment - 18 saat
mov ds, balta
mov fs, ax
mov ss, balta
hərəkət esp, 10000h; yığın
mov balta, 18h
mov gs, balta

Mov esi,hi_string ;gəlin müvəffəqiyyətlə keçdiyimizi göstərək
çap edin
jmp$

;ESI - xətt ünvanı
çap:
pushad
xor ebx,ebx
mov ah,07h;atribut
qoyur:
mov al,
mov, balta
inc ebx
test al, al
jnz qoyur
popad
ret
hi_string db 'PM-ə xoş gəlmisiniz, dostum',0

Biz nə etmişik? Yükləyici bizi 1000h:0 ünvanında uğurla yüklədi, biz icraya davam etdik. Əvvəlcə işə salındı A20, bütün kəsmələri söndürdü, yükləndi GDTR uyğun dəyər, giriş etiketinə atladı. Qeyd edim ki, biz atladıq
jmp fword 08h:Startup32
Yəni 08h kod deskriptor seçicisidir. Buna alışın.

İndi bu möcüzəni necə başlamaq olar. Şəxsən mən WinImage və VirtualBox istifadə edirəm. Yükləyicini disketin yükləmə sektoruna itələyirik və .bin faylını kökə qoyuruq. Biz onu .vfd-də saxlayırıq, virtual maşının xüsusiyyətlərində disket şəklinə gedən yolu müəyyənləşdiririk, işə salırıq və nəticəyə baxırıq.

Növbəti sayımızda fasilələrə, nasazlıqlara, tələlərə, abortlara və onların necə işlədiyinə, tutulduğuna və düzəldilməsinə baxacağıq. Memarlıq haqqında danışmağa başlayaq.

İnformasiya mənbələri.
1) Mən dərhal Phantom_84 aka egos-a düzgün yolu göstərdiyinə və mənə ən başlanğıcda kömək etdiyinə görə minnətdarlığımı bildirmək istərdim. O olmasaydı, mənim üçün bunu anlamaq daha çətin olardı.

Bütün prosessorlar Intel, i80286-dan başlayaraq sonuncular da daxil olmaqla, enerji təchizatı işə salındıqda (ilkin “sıfırlamadan” sonra) onlar real ünvan rejimində (real rejim) işləyirlər. Tipik olaraq, real rejim ya mikroprosessor sistemini işə saldıqdan sonra qorunan rejimə keçmək üçün aralıq rejim kimi, ya da mikroprosessorlar üçün yazılmış proqramların daha sürətli icrası üçün istifadə olunur. 8086 , 80186 , lakin, ilə müqayisədə 8086 , 80186 , real rejimdə olan müasir mikroprosessorlar daha geniş icra edilə bilən təlimatlar toplusuna və 32 bitlik operandları emal etmək qabiliyyətinə malikdir.
Prosessorun real rejimdən qorunan rejimə keçidi yükləmə yolu ilə həyata keçirilir CR0(Şəkil 1) PE bitinin tək dəyəri olan sözlər ( Qoruma Aktivləşdirin). 80286 üçün proqram təminatı ilə uyğunluq üçün PE biti LMSW təlimatından istifadə etməklə də təyin edilə bilər. Kommutasiyadan əvvəl lazımi deskriptor cədvəlləri yaddaşda işə salınmalıdır IDTGDT. Qorunan rejimi işə saldıqdan dərhal sonra prosessorda var CPL = 0.

düyü. 1

Bütün 32 bitlik prosessorlar üçün qorunan rejimə keçmək üçün aşağıdakı addımlar ardıcıllığı tövsiyə olunur:
1. IF bayrağını sıfırlamaqla maskalana bilən kəsilmələri söndürün və maskalana bilməyən kəsilmələrin baş verməsini xarici məntiqlə bloklayın.“Keçid dövrü” zamanı proqram kodu istisnaların olmamasına zəmanət verməli və proqram fasilələrindən istifadə etməməlidir. Bu tələb kəsilmə işləyicilərini çağırmaq üçün mexanizmin dəyişdirilməsi ilə əlaqədardır.
2. Yükləyin GDTRəsas ünvan GDT(LGDT təlimatları).
3. Təlimatlar MOV CRO PE bayrağını təyin edin və səhifə yaddaşının idarə edilməsi tələb olunarsa, PG bayrağı.
4. Bundan dərhal sonra seqmentarası keçid əmri ( JMP Uzaq) və ya zəng ( Uzağa ZƏNG) real rejimdə deşifrə edilmiş təlimatların növbəsini təmizləmək və prosessorun seriallaşdırılmasını həyata keçirmək. Əgər səhifələmə aktivdirsə, onda təlimat kodları MOV CROJMP və ya ZƏNG fiziki ünvanın məntiqi ünvanla eyni olduğu səhifədə olmalıdır (nəzarətin ötürüldüyü kod üçün bu tələb qoyulmur).
5. Lokal deskriptor cədvəlindən istifadə etməyi planlaşdırırsınızsa, təlimat LLDTüçün yük seqment seçicisi LDT reyestrinə LDTR
6. Təlimatlar LTR selektoru tapşırıq reyestrinə yükləyin TSS ilkin qorunan rejim tapşırığı üçün.
7. Tərkibləri hələ də real rejimə aid olan seqment registrlərini (CS-dən başqa) yenidən yükləyin və ya keçidi yerinə yetirin və ya başqa tapşırığı çağırın (bu halda registrlər avtomatik olaraq yenidən yüklənəcək). İstifadə olunmayan seqment registrləri sıfır seçici dəyəri ilə yüklənir.
8. Təlimatlar LIDT reyestrinə yükləyin IDTRünvan və limit IDT— qorunan rejim kəsmə deskriptorlarının cədvəlləri.
9. Maskalana bilən və maskalanamayan aparat fasilələrinə icazə verin

Bu məqalə qorunan prosessor rejimində işləyən proqramların hazırlanmasına bəzi girişlər təqdim edir. Burada qorunan rejimdə işləyən hər hansı proqramın əsas vəzifələri bəyan ediləcək və onların həlli yolları veriləcəkdir. Əsasən proqramlar dildə yazılacaq FASM.

Intel 80386 prosessorunun iş rejimləri

Prosessorun yaranması ilə Intel 80386 memarlıq yaranmışdır IA32. Bu, yeni prosessorun iş rejiminin meydana çıxmasını nəzərdə tuturdu - qorunur (" Qorunan rejim"). Xəttdəki əvvəlki prosessorlarla uyğunluq üçün Intel 80x86 CPU 80386 dərhal qorunan rejimdə başlamadı, lakin sözdə real rejimdə işlədi (" Real rejim"). Bundan əlavə, hər bir rejimdə bir və ya bir neçə alt rejim var. Gəlin onlara baxaq.

Real rejim

Prosessor " düyməsini basdıqdan dərhal sonra bu rejimdə olur. Güc"Kompüter. Real rejimdə yaddaşa giriş konstruksiya ilə həyata keçirilir" seqment:ofset", məntiqi ünvanı təsvir edir. Seqment dəyəri, ofset kimi, arasında dəyişir 0 əvvəl 0FFFFh.

Ünvanlama yalnız bir seqment daxilində edilə bildiyi üçün maksimum seqment ölçüsüdür 64 kilobayt Prosessorun ünvan avtobusunda təyin olunan fiziki ünvan düsturla hesablanır:

xətti ünvan = seqment * 16 + ofset

Real rejim prosessorları 80186 8086 seqment dəyəri arasında dəyişir 0 əvvəl 0F000h. Beləliklə, ünvan avtobusunda maksimum məruz qalan ünvandır 0FFFFh, uyğun gəlir (2^20)-1 , yəni. 1 meqabayt.

Əlbəttə ki, əvvəlcə belə yaddaşın həcmi böyük görünürdü, lakin zaman keçdikcə bir meqabayt kifayət etmədi. Prosessorun yaranması ilə 80286 sözdə yaddaş bloku mövcud oldu U.M.B., ünvandan başlayaraq 0FFFFh:0010h və ünvanla bitir 0FFFFh:0FFFFh(bir meqabaytdan artıq 65520 bayt). İndi əməliyyat sistemini yenidən konfiqurasiya edə bilərsiniz MS-DOS belə ki, bu bloku tutur, RAM-da 64 kilobayt boşaldır.

Qorunan rejim

Bu rejim realla müqayisədə mürəkkəb dizayna malikdir. Məntiqi ünvan tikinti ilə təmsil olunur " seçici:ofset". Seçici arasında dəyişir 0 əvvəl 0FFFFh(əslində 4 dəfə az seçici var - bu barədə növbəti məqalələrdə daha çox). Ofset, real rejimdən fərqli olaraq, 4 gigabaytlıq seqmentləri ünvanlamağa imkan verən 32 bitdir. Məntiqi ünvan aşağıdakı sxemə uyğun olaraq xəttinə çevrilir:

xətti ünvan = seqment bazası + ofset

Səhifənin ünvanlanması rejimi aktiv deyilsə, xətti ünvan sonradan ünvan avtobusuna yerləşdirilir. Əks halda, xətti ünvan fiziki ünvana çevrilir və yalnız bundan sonra ünvan avtobusuna yerləşdirilir. Bundan əlavə, qorunan rejim 64 terabayt ölçüsünə çatan və yalnız sabit diskin ölçüsündən (məsələn, eyni paging faylı) asılı olaraq virtual yaddaşı təşkil etməyə imkan verir. Windows virtual yaddaşı həyata keçirir). Demək olar ki, bütün müasir əməliyyat sistemləri qorunan rejimdə işləyir.

Qorunan rejimin multitasking alt rejimi

Bu rejim çoxtapşırığı təşkil etməyə, yəni eyni vaxtda bir neçə işi və ya çox istifadəçi sistemini yerinə yetirmək imkanı verir.

Virtual 8086 rejimi

Bu həm də Qorunan Rejimin alt rejimidir ki, bu da sizə real rejimdə olduğu kimi fəaliyyət göstərən, lakin əslində Qorunan rejimdə işləyən virtual maşın yaratmağa imkan verir.

Qeyri-real rejim

Bu real rejimin xüsusi alt rejimidir. Prosessor real rejimdədir, lakin yaddaşa " seçici: ofset". Bu yolla 1 meqabaytdan yuxarı yaddaş mövcuddur. Gələcəkdə qorunan rejim və onun alt rejimləri nəzərdən keçiriləcək.

Birinci proqram: qorunan rejimə keçin

Qorunan rejimə keçid biti təyin etməklə həyata keçirilir 0 qeydiyyatdan keçin CR0. Real rejimə keçid eyni sıfır bitinin sıfırlanması ilə həyata keçirilir. Bu əməliyyatı yerinə yetirən proqramı nəzərdən keçirək (dil - Düz montajçı):

istifadə 16 ; 16 bitlik təlimatlardan istifadə edir

org 100 saat

Başlamaq:

; Biz real rejimdəyik

mov eax, cr0 ; CR0 registrinin dəyərinin oxunması
və ya al, 1 ; Sıfır bitini təyin edin
mov cr0, məsələn ; Yeni CR0 dəyərini yazın

; Qorunan rejimdəyik

mov eax, cr0 ; CR0 dəyərinin oxunması
al, 0feh ; Sıfır bitini 0-a sıfırlayın
mov cr0, məsələn ; Real rejimə keçək

; Biz real rejimdəyik

ret ; Proqramdan çıxın

Bununla belə, bu proqram tamamilə xamdır, çünki onda loop həyata keçirilə bilməz. kimi əmrlər yazsanız hlt və ya jmp$, sonra ilk fasilə işə salındıqda, kompüter yenidən başlayacaq.

Bizim vəziyyətimizdə əmrlər kifayət qədər tez işə salınır, lakin ola bilər ki, proqramımızda hər hansı əmrlərin yerinə yetirilməsi arasındakı intervalda fasilə hələ də işə düşəcək, bu da ani uğursuzluğa və yenidən başlamağa səbəb olacaq. Buna görə də, fasilələrə diqqət yetirməlisiniz. Beləliklə, siyahıya yenidən baxaq. Bunu birinci proqram adlandırmaq olmaz (daha doğrusu, sıfırdan kənara çıxacaq), çünki qorunan rejimə keçidin əsas hərəkətlərini həyata keçirmir. Minimum parametrlərlə qorunan rejimə tam keçmək üçün aşağıdakı addımları yerinə yetirməlisiniz:

1. qorunan rejimə keçmək mümkün olub olmadığını yoxlayın;

2. deskriptor cədvəllərini işə salmaq;

3. fasilələri söndürün (həm maskalana bilən, həm də maskalanamayan);

4. açıq xətt A20;

5. yaddaşa nəzarət registrlərini yükləmək;

7. CS registrini ləğv etməklə 32 bitlik kod seqmentinə keçin.

Ancaq ilk proqramın 3, 4, 5-ci addımları yerinə yetirməsi kifayətdir. Sonra onu dövrələmək kompüterin yenidən başlamasına səbəb olmayacaq. Gəlin hər bir hərəkətə nəzər salaq.

Kesintiləri söndürmək bizi yenidən yükləməyə mane olur. Kesintilər maskalana bilən və maskalanamayanlara bölünür. Maskalana bilən fasilələri aradan qaldırmaq üçün bayrağı sıfırlamalısınız ƏGƏR qeydiyyatdan keçin EFLAGS komanda cli, fasilələr komanda ilə aktivləşdirilir sti. Maskalanmayan fasilələr bir az fərqli şəkildə qadağandır. Bunun iki yolu var: kəsmə nəzarətçi registrlərinin proqramlaşdırılması (bu üsul bir az sonra müzakirə olunacaq) və ya portun yeddinci bitinin dəyişdirilməsi 70 saat: bit qurulubsa, kəsilmələr söndürülür, bit sıfırlanırsa, kəsilmələr yerinə yetirilə bilər.

İndi özümüzdən soruşaq ki, xəttin funksiyası nədir? A20, Bəs bu nədir. Xətt A20- 32 ünvan xəttindən biri. Kompüter açıldıqda, xətt A20 Bağlı. Bu, 20 bitlik ünvanların yaranması ilə nəticələnir (yəni bütün ünvan sahəsi bərabərdir (2^20)=1 meqabayt). Bu prosessor uyğunluğu üçün daxil edilmişdir. 8086 : beləliklə, xətti ünvana yazmağa çalışır 12345678 saat, biz əslində onu yazacağıq 00045678h, bu da tamamilə gözlənilməz nəticələrə səbəb ola bilər. Buna görə, 32 bitlik bir tətbiqin tam işləməsi üçün xətt A20 açıq olmalıdır. Bu, biti təyin etməklə həyata keçirilir 1 liman 92 saat, xəttin bağlanması A20- bu biti sıfırlayın.

Oxucu artıq son hərəkətlə tanışdır və bu, artıq onda suallar yaratmamalıdır.

Beləliklə, kiçik bir dövrün artıq həyata keçirildiyi yeni, ilk proqramımızın siyahısına baxaq. Əvvəlki siyahıya əlavə olunan sətirlər ulduz (*) ilə qeyd olunur.

org 100 saat

Başlamaq:

; Biz real rejimdəyik

cli ;*

in al, 70 saat;*
və ya al, 80h;*
həyata 70 saat, al ;*

; A20 xəttini açın

in al, 92 saat;*
və ya al, 2;*
həyata 92h, al ;*

mov eax, cr0
və ya al, 1
mov cr0, məsələn


; Kiçik ikiqat döngə

mov cx, 20;*

dövr: ;*
mov balta, cx ;*
mov cx, 0ffffh ;*
döngə $ ;*
mov cx, balta;*
döngə dövr ;*

mov eax, cr0
al, 0feh
mov cr0, məsələn

; A20 xəttini bağlayın

in al, 92 saat;*
al, 0fdh ;*
həyata 92h, al ;*

in al, 70 saat;*
al, 7fh ;*
həyata 70 saat, al ;*

sti ;*

ret ; proqramı tamamlayın

İcra olunan faylı təmizdən işlətməklə proqramın işlədiyinə əmin ola bilərsiniz MS-DOS. Proqram düzgün çıxırsa, hər şey qaydasındadır.

Bununla belə, aşağıdakı problemlər də yarana bilər:

1. kompüter donur";

2. kompüter yenidən başlayır.

Bu, aşağıdakı səbəblərə görə baş verə bilər:

1. proqram rejimində işə salınır V86(virtual rejim 8086 );

2. proqram qorunan rejimdə və ya müəyyən bir əməliyyat sistemi altında işə salınır.

Buna görə, qorunan rejimdə işləyən hər hansı bir proqramı işə salmazdan əvvəl, proqramın işləməyə davam edə biləcəyini yoxlamaq lazımdır. Bu daha sonra müzakirə olunacaq.

Qorunan rejimə keçid imkanının yoxlanılması

Əvvəlki fəsildə belə bir problemlə qarşılaşdıq: proqram qorunan rejimdə və ya rejimdə olduğunu tanımır V86, bu sistemin donmasına və ya yenidən başlamasına səbəb olur. Proqramı əməliyyat sistemi altında işlətməyə çalışsaq Windows, Bu Windows proqramın qorunan rejimə keçmə cəhdini tutacaq və emulyasiya rejimində yenidən başlamağı təklif edəcək MS-DOS(platforma üçün 9x) və ya proqramı zorla dayandırın (platforma NT).

Beləliklə, həqiqətən real rejimdə olduğumuzu yoxlamaq üçün aşağıdakı əməliyyatları yerinə yetirməliyik:

1. reyestrin sıfır bitini yoxlayın CR0;

2. Windows əməliyyat sisteminin yüklənmədiyinə əmin olun.

Birinci əməliyyat reyestri birbaşa oxumaqla həyata keçirilir CR0 reyestrin sıfır bitinin əlavə yoxlanılması ilə EAX, AX və ya AL. Bit təyin olunmayıbsa, biz real rejimdəyik. Əks halda, proqramın sonrakı icrası mənasız olur.

İkinci hərəkət funksiyanı çağırmaqla həyata keçirilir 1600 saat müdaxilə edir 2fh. Bu funksiya əməliyyat sisteminin cari versiyasını əldə etməyə imkan verir Windows. Əgər registrdə funksiyanı çağırdıqdan sonra AL sıfır ehtiva edir, onda əməliyyat sistemi yüklənmir. Əks halda, yenə də proqramımızın bundan sonra davam etməsinin mənası yoxdur.

Aşağıdakı proqramın nümunəsini nəzərdən keçirin. Bu, əvvəlki proqramın modifikasiyasıdır; bütün yeni təlimatlar ulduz (*) ilə qeyd olunur.

Org 100h

Başlamaq:

; Seqment qeydlərini qurun

mov balta, cs ;*
mov ds, balta ;*

; Həqiqətən real rejimdə olduğumuzu yoxlayırıq

mov eax, cr0 ;* sıfır biti yoxlayın
test al, 1 ;* qeyd CR0
jz no_pm ;*

mov ah, 09h ;* DOS funksiyası 09h
mov dx, pm_msg ;* xətt çıxışı
int 21 saat ;*
ret;* və çıxın

no_pm:
; Proqramın Windows altında işlədiyini yoxlayın

mov balta, 1600 saat ;* 1600h multipleksor funksiyası
int 2fh ;* kəsir - Windows versiyasını əldə edin
test al, al ;* 0 deyilsə - xəta
jz pəncərəsiz

; Səhv mesajı göstərin

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

no_windows:
; Biz mütləq real rejimdəyik
; Maskalanan fasilələri söndürün

; Maskalanmayan kəsmələri (NMI) deaktiv edin

in al, 70h
və ya al, 80h
həyata 70h, al

; A20 xəttini açın

in al, 92h
və ya al, 2
həyata 92h, al

; Qorunan rejimə keçin

mov eax, cr0
və ya al, 1
mov cr0, məsələn

; İndi biz qorunan rejimdəyik
; Kiçik ikiqat döngə

mov cx, 20

dövr:
mov balta, cx
mov cx,0ffffh
döngə $
mov cx, balta
döngə dövrü

; Real rejimə keçin

mov eax, cr0
al, 0feh
mov cr0, məsələn

; A20 xəttini bağlayın

in al, 92 saat;*
al, 0fdh ;*
həyata 92h, al ;*

; Maskalanmayan kəsmələri aktivləşdirin (NMI)

in al, 70 saat;*
al, 7fh ;*
həyata 70 saat, al ;*

; Maskalana bilən fasilələri aktivləşdirin

sti ;*

; Biz real rejimə qayıtdıq

ret ; proqramı tamamlayın

; Səhv mesajları

pm_msg: ;*
db "Xəta: artıq qorunan rejimdə işləyir!$" ;*
win_msg: ;*
db "Xəta: Microsoft Windows aşkarlandı!$" ;*
Bu nümunə də hələ 32 bitlik əmrlərin icrasını göstərmir. Bunun üçün siz növbəti fəsildəki materialla da tanış olmalısınız. Bundan əlavə, nümunədə aşağıdakı çatışmazlıq var: funksiyalar çağırılır DOS (int 21h), artıq proqramımızın əməliyyat sistemindən müstəqilliyinə zidd olmağa başlayır MS-DOS. Gələcəkdə əməliyyat sistemi funksiyalarından istifadə etməkdən qurtulmalı və funksiyalardan istifadəyə keçməli olacaqsınız BIOS. Ancaq hələlik bu kodla məhdudlaşmaq kifayətdir.

Aşağı səviyyəli proqramlaşdırma bacarıqlarımı təkmilləşdirmək üçün hazırda x86 Assember ilə oynayıram. Hazırda 32 bit qorunan rejimdə ünvanlama sxemi ilə bağlı kiçik problemim var.

Vəziyyət belədir:

CPU-nu qorunan rejimə keçirən və koddakı müvafiq işarəyə keçən 0x7e0-da yüklənmiş proqramım var:

[...] CPU Qorunan rejimə keçmək üçün kod [...] jmp ProtectedMode [...] bit 32 ProtectedMode: .halt: hlt jmp .halt

İndiyə qədər hər şey əla işləyir. "Jmp ProtectedMode" əvvəlcədən gətirmə növbəsini təmizləmək üçün açıq-aydın uzağa sıçrayış olmadan işləyir, çünki bu proqram ofset 0 (əvvəlində org 0) ilə yüklənir və kod seqmentini lazımi yerə işarə etməyə məcbur edir.

Mənim cari problemim odur ki, "ProtectedMode" qısayolunda mən 0x8000-dən yüklənmiş başqa bir proqrama keçmək istəyirəm (mən bunu yaddaş boşaltma ilə sınaqdan keçirdim, yükləmə funksiyası düzgün işlədi və proqram 0x8000-ə qədər düzgün yükləndi).

CPU indi RealMode deyil, ProtectedMode rejimində olduğundan, ünvanlama sxemi fərqlidir. ProtectedMode verilmiş ofseti əlavə etmək və fiziki ünvanı almaq (anladığım kimi) üçün deskriptor cədvəlində əsas ünvanı və limiti axtarmaq üçün deskriptorlardan istifadə edir. Buna görə də, ProtectedMode daxil edilməzdən əvvəl GDT quraşdırılmalı idi.

Mənimki belə görünür:

%ifndef __GDT_INC_INCLUDED__ %define __GDT_INC_INCLUDED__ ;************************************ ;* Qlobal Deskriptor Cədvəli (GDT) * ; ********************************* NULL_DESC: dd 0 ; null deskriptoru dd 0 CODE_DESC: dw 0xFFFF ; limit aşağı dw 0 ; baza aşağı db 0; baza orta db 10011010b ; giriş db 11001111b; dənəvərlik db 0 ; əsas yüksək DATA_DESC: dw 0xFFFF ; məlumat deskriptoru dw 0; limit aşağı db 0 ; baza aşağı db 10010010b; giriş db 11001111b; dənəvərlik db 0 ; əsas yüksək gdtr: Limit dw 24 ; GDT Bazasının uzunluğu dd NULL_DESC ; GDT əsası %endif ;__GDT_INC_INCLUDED__

vasitəsilə GDT reyestrinə yüklənir

Lgdt

Hələ də başa düşmədiyim odur ki, mən indi GDT istifadə edərək ProtectedMode-da 0x8000 fiziki ünvana necə keçə bilərəm?

İlk düşüncələrim 0x7e00 (cari proqramlar yüklənmişdir) işarəsi olan kod deskriptorunu (CODE_DESC) seçmək və 0x8000 (512 bayt) əldə etmək üçün lazım olan ofsetdən istifadə etmək idi, nəticədə keçid əmri alındı:

Jmp CODE_DESC:0x200

Amma işləmir.

Jmp 0x7e0:0x200

da işləmir...

Burada nəyi əskik etdiyim barədə heç bir fikriniz varmı? 32-bit ProtectedMode ünvanlama sxemi və GDT-nin istifadəsi ilə bağlı vacib bir şeyi qaçırmış ola bilərəm.

Tam kod:

Bit 16 org 0; yüklənmiş ofset 0000 (phys adr: 0x7e00) jmp Start Start: xor ax, ax mov ax, cs mov ds, ax ; məlumat seqmentini yeniləmək cli ; aydın fasilələr lgdt ; GDTR-dən GDT yükləyin (gdt_32.inc-ə baxın) OpenA20Gate-ə zəng edin; A20 qapısını açın EnablePMode ; ProtectedMode-a keçir;******************** ;* A20 Qapını açır * ;******************** OpenA20Gate: in al, 0x93; sürətli A20 portu 92 və ya al, 2 vasitəsilə A20 qapısını dəyişdirin; set A20 Gate bit 1 və al, ~1 ; təmiz INIT_NOW bit out 0x92, al ret ;**************************** ;* Qorunan rejimi aktivləşdirir * ;******** ****************** EnablePMode: mov eax, cr0 və ya eax, 1 mov cr0, eax jmp ProtectedMode; bu işləyir (etiketə sıçrayır və dayanır) ;jmp (CODE_DESC-NULL_DESC):ProtectedMode ; => işləmir ;jmp 08h:ProtectedMode , => işləmir ;**************** ;* məlumat sahələri * ;* &daxildir * ;******** ******* %daxil et "gdt_32.inc" ;****************** ;* Qorunan Rejim * ;************* * ******* bit 32 ProtectedMode: ;burada mən fiziki addr 0x8000 (elf64 asm proqramı) keçidinə keçmək istəyirəm .halt: hlt jmp .halt

11