Ano ang Protected Mode at ano ang kasama nito? Paglipat ng mga processor ng Intel sa protected mode Paglipat sa assembler protected mode

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

yFBL, LBL CHSH RPNOYFE, CH TEBMSHOPN TETSYNE TBVPFSCH RTPGEUUPTB OBN DPUFHREO CHUEZP MYYSH 1 NEZBVBKF BDTEUOPZP RTPUFTBOUFCHB (YЪ LPFPTSCHI PVSHYUOPK RBNSFSY CHUEZPSHMSE4). 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 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 VSHMP YЪPMYTPCHBOOP PF RTYMPTSEOYK Y NPZMP YNY UCHPVPDOP HRTBCHMSFSH. lFP OEPVIPDYNP MAVPK RPMOPGEOOOPK NOPZPBBDBUOPK UYUFEN.

TUNGKOL SA FPZP, UFP DPVBCHMSEFUS CH TEBMSHOPN TETSYNE TUNGKOL SA RTPGEUUPTBI, LPFPTSHCHE RPDDETSYCHBAF 32-VYFOSCHK BDTEU (i386 Y CHCHYE) - DPVBCHMSAFUS OPCHSHCH TEZYUFTSHCHY, CHETAXE TBUFTSHCH, CHETAXE TBUFTSHCH, CHETAXE , EIP, ESI, EDI, EFLAGS. lBL NPTsOP DPZBDBFSHUS, LFP 32-VYFOSCH CHETUY PVSHYUOSCHI TEZYUFTPCH TEBMSHOPZP TETSINB (LYNEOY TEZYUFTB DPVBCHMSEFUS RTYUFBCHLB "E"). CHUE LFY 32-VYFOSCH TEZYUFTSH LTPNE EIP DPUFHROSCH Y CH TEBMSHOPN TETSYNE, OP CH FBLPN UMHYUBE VHDHF ЪBOINBFSH TUNGKOL SA 1 VBKF VPMSHYE (LOYN DPVBCHMSEFUS UREGYBMSHOSCHK RTEZHYLU). TUNGKOL SA RTPGEUUPTE NMPPTSE 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 NMBDIKHA YUBUFSH TEZYUFTB EAX (ALBABYUFTB EAX). TEZYUFTB-PFPVTBTTSEOYS UFBTYEK YUBUFY 32-VYFOSHI TEZYUFTPC OE UHEEUFCHHEF - NPTsOP EЈ YICHMEYUSH FPMSHLP U RPNPESH BTYZHNEFYLY (OBRTYNET, UDCHYOKHFSH EAX, UDCHYOKHFSH EAX, UDCHYOKHFSH EAXF 1TB, 1TB 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, RPFPNH OUNPFTS ABOUT FP, YuFPSH CHTBЪSHHBTTBNY VSCHUFTEE CHSHRPMOSAFUS Y BOYNBAF 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 RTBLLFYUEULY CHUENY LPNBODBNY Y OELPFPTSHNY UFTPLPCCHNY PRET BGYSNY, PRES OELPFPTSHNY OELPFPTSHNY PRET BGYSNY, PRES OELPFPTSHNY OELPFPTSHNY PFMYUYE SH, YuFP CHSH IPFYFE PVTBEBFSHUS YUETE OYI. oBRTYNET, mov ax, .

rPNYNP bFPZP TBUYYTEOYS TEZYUFTPC, DPVBCHMSAFUS OPCHCHCHE HRTBCHMSAEYE TEZYUFTSH (TBOSHYE CHMYSM TUNGKOL SA TETSYN TBVPFSH RTPGEUUPTB FPMSHLP FLAGS) - CR0, CR2, CR3 AT 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. kumanta ng DPUFHROSCH CH TEBMSHOPN TETSINE.

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 TUNGKOL SA DCHB FIRB - UEZNEOFSH LPDB Y UEZNEOFSH DBOOSCHI (TUNGKOL SA UBNPN DEM EUFSH EE CHUSLYE TSS Y LDT, OP RPLB POY OBNOE CHBTSOSH FPCE). h CS NPTsOP ЪБЗТХЦБФШ FПМШЛП OPNETB DEULTYRFPTCH, PRYUBOOSCHI LBL UEZNEOF LPDB, h PUFBMSHOSHE UEZNEOFOSHE TEZYUFTSH NPTsOP BFSHHIBBLUE DB. 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, UUSHMBAEYEUS TUNGKOL SA PDYO Y FPF TSE TEZYPO RBNSFY, OP PDYO YY OYI DPEMTHBFNHROS YUY.

oEUNPFTS TUNGKOL SA RPDDETSLH UEZNEOFBGYY, POB UYFBEFUS KHUFBTECHYEK. OH Windows, OH Linux OE YURPMSHJHAF EЈ CH RPMOPC NETE, B TUNGKOL SA 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 4 na bituin (NBLUYTHENBTSHOBTNFFORCEBNT2FJNBTNFO SYNE). 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 UCHPEK PRETBGYPOOPK UYUFENE - LFP UYMSHOP HUMPTSOSEF LPD SDTB, SJSHLY CHSHUPLPZP HTPCHOS (OBRTYNET, y YMY YMY DDFETS CHEECHBARPY++) OE CHSHUPLPZP HTPCHOS RPMOPGEOOOP RTPZTBNNYTPCHBFSH FPMSHLP TUNGKOL SA Assembler) Y, OBLPOEG, CHCH OE UNPTSEFE RETEOUFY UYUFENKH TUNGKOL SA DTHZHA BTIYFELFHTH, RPFPNKH YuFP x86 EDYOUFCHEOOBS, LPFPTBS KHNEEF LFPF NEIBOYN (Y FP, Ch 64-VYFOPN TETSYNE RPMS VBPCHPZP BDTEUB Y TBNETB UEZNEOFB'Y BOPTYNBSHURSHFB Y ZOPTYOFMY CHBI DPUFHRB).

lBL S HCE ULBBM, FBVMYGB DEULTYRFPTPCH UEZNEOFPCH ZHTNYTHHEFUS UBNPK PRETBGYPOOPK UYUFENPK. YuFPVSH KHLBBBFSH RTPGEUUPTH, ZDE POB OBIPDFUS YURPMSH'HEFUS UREGYBMSHOBS LPNBODB - lgdt (I-load ang Global Descriptor Table). pOB RTOYNBEF 6-VBKFPCHHA RETENEOOKHA CH RBNSFY. RETCHCHE EЈ 16 VYF UPDETSBF TBNET FBVMYGSHCH VBKFBI (FBLYN PVTBBPN, NBLUINBMSHOPE LPMYUUEUFCHP DEULTYRFPTPCH - 65536 / 8 = 8192), RPUMEDHAEYE 32 MYBBFHCBNH - VHKBHCBFYB - VHKBHCBFY VMYGSHCH (FP EUFSH VE KHYUFB CHUEI UEZNEOFPC). yNEEF UNSHUM CHSTTBCHOSFSH OBYUBMP FBVMYGSHCH TUNGKOL SA 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 TUNGKOL SA 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 UYUFENSH Y LPD RTYMPTSEOYK PFDEMEOSCH DTHZ PF DTHZB U FPK GEMSHA, YuFPVSH SDTP NPZMP RPMOPUFSHA KHRTBCHMSFSH RTPGEUUPTPN, B RTYMPTSEOYS OE NPZMY CHNEYBFSHUS CH TBЪ lPD YURPMOSEFUS U PRTEDEMOOOSCHN KHTPCHOEN RTYCHYMEZYK. h x86 YI GEMSHCHI 4 YFKHLY - PF 0 DP 3. oKHMECHPK KHTPCHEOSH UBNSCHK RTYCHYMEZYTPCHBOOSCHK (NPTSEF CHSHCHRPMOSFSH MAVSHCH LPNBODSCH Y NEOSFSH TETSYNSCH TBVPFSH RTPGEUPKB" UBNSCHK, "UBSCHUBP." lBL Y CH UMHYUBE U UEZNEOFBGYEK, TBTBVPFYUYLY x86 RETEVPTEYMY U ZHKHOLGYPOBMPN Y CHUE pu YURPMSHJHAF MYYSH DCHB KHTPCHOS YYUEFSHCHTI CHPNPTSOSCHI, B DTHZIE BTIYFELPH TSCH RPGETDUSH. x LBTSDPZP UEZNEOFB CH EZP DEULTYRFPTE KHLBBO DPL (Antas ng pribilehiyo ng Descriptor)- 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 KHTChOS DPUFHRB - NMBDYE 2 VYFCH HDPCHETS 2 VYFCH 3 HCE UFBTYYE OPNET UBNPK FBVMYGSHCH. fBLYN PVTBBN UEMELFPT = (YODELU_DEULTYRFPTB shl 2) + RPL. RPL- Hiniling na antas ng pribilehiyo - ЪBRTBYCHBENSCHK HTPCHEOSH RTYCHYMEZYK. rTY LFPN RPL DPMTSEO VSHFSH VPMSHYE YMY TBCHEO NBLUINBMSHOPNKH YЪ DPL Y CPL (Kasalukuyang antas ng pribilehiyo). 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 ЪBEIFSHCH (FBL EEЈ OBSCHCHBAF KhTPCHOY RTYCHYMEZYK), YUFPVSH YNEFSH RPMOSHCHK DPUFHR L BRRBTBFKHTE.

UEZNEOFBGYS OBNOE OHTSOB, RPPFPNH S OE VHDH PUFBOBCHMYCHBFSHUS RPLB UFP TUNGKOL SA ZHTNBFE DEULTYRFPTB, B DBN ZPFPCHSHCHE OBYEOYS. 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 o eax, 1 mov cr0, eax ; RETEKDEN TUNGKOL SA 32-VYFOSHCHK LPD jmp 8:start32; fBVMYGB DEULTYRFPTPCH UEZNEOFPPCH DMS 32-VYFOPZP SDTB align 16 gdt32: dq 0 ; NULL - 0 dq 0x00CF9A000000FFFF ; CODE - 8 dq 0x00CF92000000FFFF ; DATA - 16 gdtr32: dw $ - gdt32 - 1 dd gdt32 ; 32-VYFOSHCHK LPD use32 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 TUNGKOL SA BLTB mov byte, "!" ; ъБЧТЭТІІе 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 KHUFTPKUFCHB), RPFPNH YuFPY BIOS RPUFBYU, RPFPNH YuFPY BIOS RPUME REPBYU YLY 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 TUNGKOL SA 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 TETSINE Y OEPVIPDYNP RETELMAYUIFSHUS CH TETSIN ZEOETBGYY LPNBOD DMS OEZP, BOE FOPMY'PYA .

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-RBPMNSFY TETSYNB "UPSCH!" CH RTBCHSHCHK OYTSOYK KHZPM LBOBOB (FELUFPCHSHCHK BLTBO YNEEF TBTEYEOYE 80 x 25 UYNCHPMPCH, LBTSDSCHK UYNCHPM ЪBOINBEF CH RBNSFY DCHB VBKFB - LPD UYNCSHFMBY GBBh).

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

h OBYEN boot.cfg LPNBODH S64 RPLB ЪBNEOYN TUNGKOL SA S32. FERETSH, EUMY CHU CHU RTBCHYMSHOP UDEMBMY, OBY ЪBZTHYUYL VKhDEF ЪBCHETYBFSH UCHPA TBVPFKH CHCHCHPDPN CHPULMYGBFEMSHOPZP ЪOBLB Ch KHZPM LBOB YЪ ЪBEYEЈTSYOOOPZPZP. lFP FPMSHLP OBYBMP. nsch OBLPOEG-FP RTBLYUEULY KHYMY YY TEBMSHOPZP TETSYNB (TUNGKOL SA UBNPN DEM FBN EEЈ PUFBMPUSH OENOPZP DEM) CH ЪBEEYEЈOOSHCHK. rPULPMSHLH OBZTHYUYL CHSHRPMOSEFUS CH OHMECHPN UEZNEOFE TEBMSHOPZP TETSINB, CHUE UNEEEOYS UPPFCHEFUFCHHAF ZHJYUEULYN BDTEUBN Y RTY RETEEIPDE CH ЪBEEYEOOOSCHK TETS YN.

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. TUNGKOL SA OPCHSHCHI RTPGEUUPTBBI DPUFKHROP DMS YЪNEOOYS VPMSHYE VYF Y LFP NPTsOP PVOBTHTSYFSH. 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 boot ; ъБЗПМПЧПЛ ListFS align 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 ? ; ъБЗПМПЧПЛ ЖБКМБ virtual sa 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 ? tapusin virtual ; dBOOSHE OBYUBMSHOPZP ЪБЗТХЪУЛБ label sector_per_track word sa $$ label head_count byte sa $$ + 2 label disk_id byte sa $$ + 3 reboot_msg db "Pindutin ang anumang key...",13,10,0 boot_file_name", db "boot. ; hCHCHPD UFTPLAY DS:SI TUNGKOL SA BLTB write_str: push si mov ah, 0x0E @: lodsb test al, al jz @f int 0x10 jmp @b @: pop si ret ; lTYFYUEULBS PYYVLB error: 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 byte, 0xFF je .use_EDD push bx cx si div mov cl, dl inc cl div mov dh, ah mov ch 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: call error 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: call error db "NOT FOUND",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 . found: 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 axis, -1 jne @f cmp dx: -1 jne @f cmp dx: -1 jne @f cmp 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 boot: ; oBUFTPYN UEZNEOFOSHE TEZYUFTSH jmp 0:@f @: mov ax, cs mov ds, ax mov es, ax ; oBUFTPYN UFEL mov ss, palakol 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. c load_sector.error sa c dh mov , dh at cx, 111111b mov , cx .disk_detected: ; ъБЗТХЪН РТПДПМЦЭОЕ ОБИБМШОПЗП ъБЗТХЪУЛБ mov si, boot_file_name mov ax, word mov dx, word mov dx, word mov_6 call load ; RETEIPDYN TUNGKOL SA RTDDPMCEOYE jmp boot2 ; rKHUFPE RTPUFTBOUFCHP Y UYZOBFKHTB rb 510 - ($ - $$) db 0x55.0xAA ; dPRPMOYFEMSHOSH DBOOSH ЪБЗТХЪУЛБ load_msg_preffix db "Naglo-load "",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 "Starting 32 bit kernel. ..",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 byte, ax, si pop si ret ; 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 byte, 1 jz @f mov si, bp mov dx, word mov ax, word jmp @b @ : call load_file_data mov si, ok_msg call write_str pop bp si ret ; rTPDPMTSEOYE OBYUBMSHOPZP ЪБЗТХЪУИЛБ boot2: ; ъБЗТЛІППОП К ЖБКМ ЪБЗТХЪУЛБ mov si, config_file_name mov bx, 0x100 0 / 16 call load_file ; CHSHRPMOYN ЪБЗТХЪПУОЛТТУУ Р 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_command cmp al, 13 je .run_command cmp al. : mov byte, 0 xchg dx, si cmp byte, 0 je .parse_line ; rHUFBS UFTPLB cmp byte, "#" je .parse_line ; lPNNEOFBTYK cmp byte, "L" ay .load_file ; ъБЗТХЛБ ЖБКМБ cmp byte, "S" je .start ; ъBRHUL SDTB; oEYCHEUFOBS LPNBODB mov al, mov [.cmd], al call error db "Unknown boot script command "" .cmd db ? db ""!",13,10,0 .config_end: ; rTY RTBCHYMSHOPN LPOZHYZHTBGYPOOPN ZHBKME NSCH OE DPMTSOSCH UADB RPRBUFSH; jmp reboot; ъБЗТХЛБ ЖБКМБ.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 mov, 16 mulcx salita, 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 at @f error sa tawag db "NO 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 TSTSDOPUFSH SDTB call error db "Invalid start command 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 "Kinakailangan i386 o mas mahusay",13,10,0 @: ; ъБЗТХХЪН ЪБУУЭОЭ Ч GDTR lgdt ; ъBRTEFYN RTETSCHCHBOYS cli; RETEKDEN CH ЪBEEYEЈOOOSCHK TETSYN mov eax, cr0 o eax, 1 mov cr0, eax ; RETEKDEN TUNGKOL SA 32-VYFOSHCHK LPD jmp 8:start32; fBVMYGB DEULTYRFPTPCH UEZNEOFPPCH DMS 32-VYFOPZP SDTB align 16 gdt32: dq 0 ; NULL - 0 dq 0x00CF9A000000FFFF ; CODE - 8 dq 0x00CF92000000FFFF ; DATA - 16 gdtr32: dw $ - gdt32 - 1 dd gdt32 ; 32-VYFOSHCHK LPD use32 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 TUNGKOL SA BLTB mov byte, "! " ;

Upang magsulat ng isang operating system, kailangan mong maunawaan ang maraming mga detalye. Kaya hayaan mo akong maliwanagan ka ng kaunti (pero magkasundo tayo na ikaw mismo ang magbabasa ng mana para may mapag-usapan).
Sa totoo lang, mayroong isang tonelada ng mga materyales sa PM sa Internet, at si iley at pehat ay nag-usap ng kaunti tungkol sa mode na ito, ngunit hiniling sa akin na ilarawan ito sa mga pangkalahatang termino pa rin. Ngayon ay maibabalangkas ko sa madaling sabi ang teorya (sa katunayan, ang Intel ay nagsulat ng mana partikular para dito), pagkatapos ay magsisimula kaming magsulat ng code.

Panimula sa Protected Mode.
Kaya, malaki ang pagkakaiba ng PM sa totoong mode (RM) na pamilyar sa lahat mula pa noong panahon ng DOS. Ngayon ay kailangan mo nang masanay: walang mga static na 64 kilobyte na mga segment, walang mga interrupt na talahanayan sa 1 kilobyte, walang mga segment na base address sa mga rehistro ng segment, sa pangkalahatan ay isang ganap na bagong mundo.
Ngayon ang mga segment ay inilarawan sa Global Descriptor Table (GDT). Ang talahanayang ito ay maaari lamang sa isang kopya. Siya ay isang istraktura sa memorya. Hindi segment! Ito ay matatagpuan kahit saan sa memorya, ngunit ang address at limitasyon nito ay nakasulat sa GDTR register. Narito ang istraktura nito:

Ang talahanayan mismo ay binubuo ng mga talaan ng sumusunod na istraktura (nga pala, ang zero record ay walang laman. Ito ay mahalaga. Kapag nag-access sa memorya na 'inilalarawan' ng isang zero descriptor, makakakuha ka ng #GP - General Protection Fault):
Tingnan natin ang istrukturang ito nang mas malapitan.

1. Limit ng Segment:
Ang layunin ng patlang na ito ay malinaw mula sa pangalan, ngunit mayroong isang kapitaganan. Ang aso ay inilibing sa G (Granularity) bit.
Kung ito ay hindi nakatakda, ang memorya ay 'binibilang' sa mga byte. Sa kasong ito, maaaring mag-iba ang laki ng segment mula 1 byte hanggang 1 megabyte bawat 1 byte na laki.
Kung itatakda namin ito sa 1, ang pag-address sa memorya ng pahina ay ipakikilala. Pagkatapos ay makakapag-address tayo mula 4 kilobytes hanggang 4 gigabytes ng RAM na may pagbabago sa laki na 4 kilobytes (laki ng pahina). Sa pangkalahatan, mas mainam ang pag-address ng page (ihambing (1MB+64Kb-16bytes) at 4GB). Pag-usapan lang natin ang tungkol sa segment addressing sa post na ito. Ang paging ay nararapat sa isang hiwalay na talakayan.

2. Base Address:
Dito ipinapahiwatig namin ang pisikal na address ng base.

3.Type field:
Tinutukoy ng mga kumbinasyon ng bit ang uri ng segment:

4. S (uri ng deskriptor):
Sinasabi ng dokumentasyon ng Intel na kung hindi nakatakda ang bit na ito, ang descriptor na ito ay para sa segment ng system, kung hindi - code o data. Ang ibig sabihin ng system ay LDT, TSS, Interrupt Gates at iba pang katulad nila (higit pa sa kanila mamaya).

5. DPL (Descriptor Privilege Level):
Mga pribilehiyo ng inilarawang segment. Alam ng lahat si Rings.

6. P (naroroon ang segment):
Kung ang bit na ito ay nakatakda, kung gayon ang processor ay 'alam' na ang segment ay nasa memorya na (bagaman ito ay mas mahusay na sabihin na wasto). Kung nag-load ka ng descriptor selector na may P bit na hindi nakatakda sa rehistro ng segment, isang #NP (not present) exception ang magaganap. Sa pangkalahatan, ipapaliwanag ko ang kahulugan ng magarbong pariralang ito sa ibang pagkakataon.

7.D/B:
Ito ay binibigyang-kahulugan nang iba para sa mga segment ng iba't ibang uri.
1. Para sa mga segment ng code:
32 o 16 bit na epektibong haba ng address at laki ng operand.
(1-32; 0-16);
2. Para sa stack:
Ang stack pointer ay 32 o 16 bit. (1-32; 0-16);

8.G:
Nakakaapekto sa mga unit (byte, page) kung saan sinusukat ang limitasyon ng segment. Sa pangkalahatan, maaaring paganahin ang Paging kapag nag-PM sa pamamagitan ng pagtatakda ng bit 31 ng rehistro ng CR0.

Ilang karagdagang impormasyon:
Sa palagay namin, ang salitang Global ay hindi inilagay sa walang kabuluhan. Kaya may isa pang palatandaan. Tama, meron din Talahanayan ng Lokal na Deskriptor. Maaaring mayroong isang mahusay na pagkakaiba-iba ng mga ito. Halimbawa, maaari silang magamit sa pagpapatupad ng mga gawain, atbp. At dito LDT bumubuo na ng isang segment! Kaya masanay sa mga pariralang tulad ng 'local descriptor table segment descriptor'.

Pagkatapos naming ilarawan ang talahanayan, kailangan naming i-load ito sa rehistro GDTR. Hindi ito ginagawa ng mov. GDTR pinunan ng utos lgdt fword (halaga). Iyon ay, kailangan mong likhain ang istrakturang ito sa iyong sarili at i-load ito sa nabanggit na rehistro. Mayroon pa ring mga koponan na nagtatrabaho sa rehistrong ito, ngunit kami ay tumatakbo sa buong Europa.

Isa pang bagay. Sa PM, ang mga rehistro ng segment ay hindi nag-iimbak ng mga base address ng mga segment (tulad ng sa RM), ngunit espesyal na sinanay na mga bagay na tinatawag mga pumipili. Ang kanilang istraktura ay ang mga sumusunod:

Narito ang Index ay ang ordinal na numero ng descriptor sa talahanayan.
Ipinapakita ng TI kung saan hahanapin ang descriptor (sa GDT o LDT).

Ngayon na malinaw na kung paano bumuo ng isang talahanayan, pag-usapan natin kung paano pumunta sa PM (tandaan, maaari lamang itong gawin mula sa RM). Sa pangkalahatan... kailangan mo lang itakda ang bit 0 ng control register CR0. Kahit nagsisinungaling ako. Una kailangan mong huwag paganahin ang lahat ng mga pagkagambala ( NMI (Mga Hindi Maskable na Pagkagambala) kasama), buksan ang linya ng address A20(para maging available ang 32-bit addressing), i-download GDTR, at tumalon sa marka - magsimula.

Gumamit tayo ng loader (maaari mong gamitin ang KOLIBRI's), na maglo-load ng ating code sa address na 1000h:0 (ang address ng RM, tandaan ko).
Dito, hindi lahat ay magiging kasing ayos ng mga mana kapag lumipat sila sa PM nang direkta mula sa bootloader. Ang lahat ay medyo mas kumplikado. Pero tignan muna natin ang code na ilo-load ng bootloader (isinulat natin ang lahat sa FASM). Ito ay isang uri ng helloworld. Mag-boot tayo, mag-PM at mag-print ng pagbati. Ayan.

I-format ang binary
xor palakol, palakol
cli ;muling simulan ang mga rehistro ng segment
mov ss, ax
xor sp,sp
sti
mov ax,3
sa loob ng 10h

Jmp 1000h:r_start

Mov ax,1000h;reconfigure ang mga rehistro
mov ds,ax
mov es, ax

Sa al, 0x92; paganahin ang A20
o al, 2
out 0x92, al

Lgdt fword ;load ang GDTR register
mov eax,cr0
o al,1;itakda ang bit 0
mov cr0,eax;i-on ang PM

Jmp fword 08h:Startup32; tumalon sa PM

I-align ang 8; mas mabilis na hinahawakan ng processor ang naka-align na plato
GDT:
dq 0; walang laman
db 0FFh,0FFh,0,0,0.9Ah,0CFh,0 ;code
db 0FFh,0FFh,0,0,0.92h,0CFh,0;data
db 0FFh,0FFh,0,80h,0Bh,92h,40h,0 ;segment ng video
lagyan ng label ang GDT_SIZE sa $-GDT
GDTR:
dw GDT_SIZE-1
dd GDT+10000h
; kailangan mong isulat ang 32-bit na address. Ngayon ay nasa 1000h segment na tayo, ang base nito ay 1000h*10h (by physical address) => physical address ng GDTR (tag!) = 10000h (physical address ng segment base) + offset

Virtual ;ngayon, sa katunayan, pinupuno namin ang espasyo hanggang sa dulo ng segment
rb 10000h-$;
tapusin ang virtual
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PM32 Entry;;;;;;;;;;;;;;;;;;; ;;
gamitin32
org $+10000h;eto kung bakit: sa PM nagtatrabaho kami sa mga Flat na segment, at kung iiwan namin ang code; para sa PM bago ang org, kung gayon; ang intrasegment na address ay hindi magkakasabay sa Flat address. Kaya eto na.

Startup32: ;entry point sa PM
mov ax,10h ; dito namin itinulak ang mga pumipili. Kadalasan (! huwag kalimutan ang tungkol sa serial number sa
mov es,ax ;table) segment ng selector code - 08h. data - 10h, segment ng video - 18h
mov ds,ax
mov fs, ax
mov ss, ax
mov esp,10000h;stack
mov ax,18h
mov gs, ax

Mov esi,hi_string ;ipakita natin na matagumpay tayong nakatawid
tawag sa print
jmp$

;ESI - address ng linya
print:
pushad
xor ebx, ebx
mov ah,07h;attribute
naglalagay ng:
mov al,
mov, ax
inc ebx
pagsubok al,al
inilalagay ni jnz
popad
ret
hi_string db 'Welcome to PM, dude',0

Ano'ng nagawa natin? Matagumpay na na-load kami ng loader sa address na 1000h:0, mula sa kung saan kami nagpatuloy sa pagpapatupad. Unang naka-on A20, hindi pinagana ang lahat ng mga pagkagambala, na-load sa GDTR angkop na halaga, tumalon sa entry label. Pansin ko na tumalon kami
jmp fword 08h:Startup32
Ibig sabihin, ang 08h ay isang code descriptor selector. Masanay ka na.

Ngayon kung paano ilunsad ang himalang ito. Personal, gumagamit ako ng WinImage at VirtualBox. Itinutulak namin ang bootloader sa boot sector ng floppy disk at inilalagay ang .bin file sa root. Ise-save namin ito sa .vfd, tukuyin ang path patungo sa floppy disk image sa mga katangian ng virtual machine, ilunsad ito at tingnan ang resulta.

Sa susunod na isyu, titingnan natin ang mga interrupt, fault, traps, abort at kung paano gumagana ang mga ito, nahuli at na-debug. Magsimula tayong pag-usapan ang tungkol sa arkitektura.

Mga mapagkukunan ng impormasyon.
1) Nais kong agad na ipahayag ang aking pasasalamat kay Phantom_84 aka egos para sa pagturo ng tamang landas at pagtulong sa akin sa simula pa lang. Kung wala siya ay mas mahirap para sa akin na malaman ito.

Lahat ng mga processor Intel, simula sa i80286 at hanggang sa at kabilang ang mga huli, kapag ang power supply ay naka-on (pagkatapos ng paunang "reset") ay nagpapatakbo sila sa real address mode (real mode). Karaniwan, ang real mode ay ginagamit bilang isang intermediate mode upang lumipat sa protektadong mode pagkatapos simulan ang isang microprocessor system, o para sa mas mabilis na pagpapatupad ng mga program na isinulat para sa mga microprocessor. 8086 , 80186 , ngunit, kumpara sa 8086 , 80186 , ang mga modernong microprocessor sa real mode ay may mas malawak na hanay ng mga executable na tagubilin at ang kakayahang magproseso ng 32-bit na mga operand.
Ang paglipat ng processor sa protektadong mode mula sa totoong mode ay isinasagawa sa pamamagitan ng paglo-load sa CR0(Larawan 1) mga salita na may iisang halaga ng PE bit ( Protektahan ang Paganahin). Para sa pagiging tugma sa software para sa 80286, ang PE bit ay maaari ding itakda gamit ang pagtuturo ng LMSW. Bago lumipat, ang mga kinakailangang descriptor table ay dapat na masimulan sa memorya IDT At GDT. Kaagad pagkatapos paganahin ang protected mode, ang processor ay may CPL = 0.

kanin. 1

Para sa lahat ng 32-bit na processor, ang sumusunod na pagkakasunud-sunod ng mga hakbang ay inirerekomenda upang lumipat sa protektadong mode:
1. I-disable ang mga maskable interrupts sa pamamagitan ng pag-reset ng IF flag, at i-block ang paglitaw ng mga non-maskable interrupts gamit ang external logic. Ang program code sa panahon ng "transition period" ay dapat magagarantiya ng kawalan ng mga exception at hindi gumamit ng software interrupts. Ang pangangailangang ito ay sanhi ng pagbabago sa mekanismo para sa pagtawag sa mga humahawak ng interrupt.
2. I-upload sa GDTR base address GDT(Mga tagubilin sa LGDT).
3. Mga tagubilin MOV CRO itakda ang bandila ng PE, at kung kinakailangan ang pamamahala ng memorya ng pahina, pagkatapos ay ang bandila ng PG.
4. Kaagad pagkatapos nito, ang intersegment jump command ( JMP Malayo) o tawagan ( TAWAG Malayo) upang i-clear ang pila ng mga tagubilin na na-decode sa real mode, at magsagawa ng serialization ng processor. Kung pinagana ang paging, ang mga code ng pagtuturo MOV CRO At JMP o TAWAG dapat ay nasa isang pahina kung saan ang pisikal na address ay kapareho ng lohikal na address (para sa code kung saan inililipat ang kontrol, ang pangangailangang ito ay hindi ipinapataw).
5. Kung plano mong gumamit ng lokal na descriptor table, ang pagtuturo LLDT load segment selector para sa LDT sa rehistro LDTR
6. Mga tagubilin LTR i-load ang tagapili sa rehistro ng gawain TSS para sa paunang protektadong mode na gawain.
7. I-reload ang mga rehistro ng segment (maliban sa CS), ang mga nilalaman nito ay nabibilang pa rin sa totoong mode, o magsagawa ng paglipat o tumawag ng isa pang gawain (sa kasong ito, ang mga rehistro ay awtomatikong mai-reload). Ang mga hindi nagamit na rehistro ng segment ay nilo-load ng selector value na zero.
8. Mga tagubilin LIDT i-load sa rehistro IDTR address at limitasyon IDT— mga talahanayan ng mga protected mode na interrupt descriptor.
9. Payagan ang maskable at non-maskable na pagkaantala ng hardware

Ang artikulong ito ay nagbibigay ng ilang panimula sa pagbuo ng mga program na gumagana sa protektadong processor mode. Dito sasabihin ang mga pangunahing gawain ng anumang programa na tumatakbo sa protektadong mode at ibibigay ang kanilang mga solusyon. Karaniwan, ang mga programa ay isusulat sa wika FASM.

Mga mode ng pagpapatakbo ng processor ng Intel 80386

Sa pagdating ng processor Intel 80386 bumangon ang arkitektura IA32. Ipinapalagay nito ang paglitaw ng isang bagong operating mode ng processor - protektado (" Protektadong Mode"). Para sa pagiging tugma sa mga nakaraang processor sa linya Intel 80x86 CPU 80386 hindi agad nagsimula sa protektadong mode, ngunit nagtrabaho sa tinatawag na real mode (" Real Mode"). Bilang karagdagan, ang bawat mode ay may isa o higit pang mga submode. Tingnan natin ang mga ito.

Real mode

Ang processor ay nasa mode na ito kaagad pagkatapos pindutin ang " kapangyarihan" computer. Ang pag-access sa memorya sa totoong mode ay isinasagawa ng konstruksyon " segment:offset", na naglalarawan sa lohikal na address. Ang halaga ng segment, tulad ng offset, ay mula sa 0 dati 0FFFFh.

Dahil ang pagtugon ay maaari lamang gawin sa loob ng isang segment, ang maximum na laki ng segment ay 64 kilobyte Ang pisikal na address, na nakatakda sa processor address bus, ay kinakalkula ayon sa formula:

linear address = segment * 16 + offset

Mga processor ng totoong mode 80186 At 8086 ang halaga ng segment ay mula sa 0 dati 0F000h. Kaya, ang maximum na nakalantad na address sa address bus ay 0FFFFFh, na tumutugma sa (2^20)-1 , ibig sabihin. 1 megabyte.

Siyempre, sa una ang dami ng naturang memorya ay tila napakalaki, ngunit sa paglipas ng panahon ang isang megabyte ay naging hindi sapat. Sa pagdating ng processor 80286 naging available ang tinatawag na memory block U.M.B., simula sa address 0FFFFh:0010h at nagtatapos sa isang address 0FFFFh:0FFFFh(65520 bytes na lampas sa isang megabyte). Ngayon ay maaari mong muling i-configure ang operating system MS-DOS upang sakupin nito ang bloke na ito, na nagpapalaya ng 64 kilobytes sa RAM.

Protektadong Mode

Ang mode na ito ay may kumplikadong disenyo kumpara sa tunay. Ang isang lohikal na address ay kinakatawan ng konstruksiyon " tagapili:offset". Ang tagapili ay mula sa 0 dati 0FFFFh(sa katunayan, mayroong 4 na beses na mas kaunting mga pumipili - higit pa tungkol dito sa mga sumusunod na artikulo). Ang offset, hindi tulad ng real mode, ay 32-bit, na nagbibigay-daan sa iyo upang matugunan ang 4 gigabyte na mga segment. Ang lohikal na address ay na-convert sa linear ayon sa sumusunod na scheme:

linear address = base ng segment + offset

Ang linear na address ay kasunod na inilalagay sa address bus kung ang page addressing mode ay hindi pinagana. Kung hindi, ang linear na address ay iko-convert sa isang pisikal, at pagkatapos lamang ito ilalagay sa address bus. Bilang karagdagan, pinapayagan ka ng protected mode na ayusin ang virtual memory, na umaabot sa sukat na hanggang 64 terabytes at depende lamang sa laki ng hard drive (halimbawa, ang parehong paging file sa Windows nagpapatupad ng virtual memory). Halos lahat ng modernong operating system ay gumagana sa protektadong mode.

Multitasking submode ng protected mode

Pinapayagan ka ng mode na ito na ayusin ang multitasking, iyon ay, ang kakayahang sabay na magsagawa ng ilang mga gawain o isang multi-user system.

Virtual 8086 mode

Isa rin itong submode ng Protected Mode na nagbibigay-daan sa iyong lumikha ng virtual machine na kumikilos na parang nasa real mode, ngunit aktwal na tumatakbo sa Protected Mode.

Unreal mode

Ito ay isang espesyal na sub-mode ng real mode. Ang processor ay nasa real mode, ngunit naka-address sa memorya ng " tagapili: offset". Sa ganitong paraan, available ang memorya na higit sa 1 megabyte. Sa hinaharap, isasaalang-alang ang protected mode at mga submode nito.

Unang programa: lumipat sa protektadong mode

Ang paglipat sa protektadong mode ay isinasagawa sa pamamagitan ng pagtatakda ng bit 0 magparehistro CR0. Ang paglipat sa totoong mode ay isinasagawa sa pamamagitan ng pag-reset ng parehong zero bit. Isaalang-alang ang isang programa na nagsasagawa ng operasyong ito (wika - Flat Assembler):

gamitin16 ; Gumagamit ng 16-bit na mga tagubilin

org 100h

Magsimula:

; Real mode kami

mov eax, cr0 ; Binabasa ang halaga ng register CR0
o al, 1 ; Itakda ang zero bit
mov cr0, eax ; Isulat ang bagong halaga ng CR0

; Nasa protected mode tayo

mov eax, cr0 ; Binabasa ang halaga ng CR0
at al, 0feh ; I-reset ang zero bit sa 0
mov cr0, eax ; Pumunta tayo sa real mode

; Real mode kami

ret ; Lumabas sa programa

Gayunpaman, ang program na ito ay ganap na krudo dahil ang looping ay hindi maipapatupad dito. Kung sumulat ka ng mga utos tulad ng hlt o jmp$, pagkatapos kapag na-trigger ang unang interrupt, magre-reboot ang computer.

Sa aming kaso, ang mga utos ay mabilis na na-trigger, ngunit posible na sa pagitan sa pagitan ng pagpapatupad ng anumang mga utos sa aming programa, ang pagkagambala ay mag-trigger pa rin, na hahantong sa isang instant na pagkabigo at isang pag-reboot. Samakatuwid, dapat mong alagaan ang mga pagkagambala. Kaya, tingnan natin muli ang listahan. Hindi ito matatawag na unang programa (sa halip, magiging zero ito), dahil hindi nito ipinapatupad ang mga pangunahing aksyon ng paglipat sa protektadong mode. Upang ganap na lumipat sa protected mode na may kaunting mga setting, kailangan mong gawin ang mga sumusunod na hakbang:

1. suriin kung posible na lumipat sa protektadong mode;

2. magpasimula ng mga talahanayan ng deskriptor;

3. huwag paganahin ang mga interrupts (parehong maskable at non-maskable);

4. bukas na linya A20;

5. load memory control registers;

7. lumipat sa isang 32-bit na code segment sa pamamagitan ng pag-override sa CS register.

Ngunit sapat na para sa unang programa na magsagawa ng mga hakbang 3, 4, 5. Pagkatapos ang pag-loop ay hindi hahantong sa pag-reboot ng computer. Tingnan natin ang bawat aksyon.

Pinipigilan kami ng hindi pagpapagana ng mga interrupt na mag-reboot. Ang mga interrupt ay nahahati sa parehong maskable at non-maskable. Upang i-disable ang mga naka-mask na interrupt, kailangan mong i-reset ang flag KUNG magparehistro EFLAGS pangkat cli, ang mga interrupt ay pinagana ng command sti. Ang mga di-maskable na interrupts ay ipinagbabawal sa bahagyang naiibang paraan. Mayroong dalawang mga paraan upang gawin ito: pagprograma ng mga rehistro ng interrupt controller (ang pamamaraang ito ay tatalakayin sa ibang pagkakataon) o pagbabago ng ikapitong bit ng port 70h: kung ang bit ay nakatakda, pagkatapos ay ang mga interrupt ay hindi pinagana, kung ang bit ay na-reset, ang mga interrupt ay maaaring isagawa.

Ngayon tanungin natin ang ating sarili kung ano ang function ng linya A20, Kaya ano ito. Linya A20- isa sa 32 linya ng address. Kapag nag-boot ang computer, ang linya A20 sarado. Nagreresulta ito sa pagbuo ng 20-bit na mga address (iyon ay, ang buong address space ay katumbas ng (2^20)=1 megabyte). Kasama ito para sa pagiging tugma ng processor. 8086 : kaya, sinusubukang sumulat sa isang linear address 12345678h, talagang isusulat namin ito sa 00045678h, na maaaring humantong sa ganap na hindi inaasahang mga resulta. Samakatuwid, para sa buong paggana ng isang 32-bit na application, ang linya A20 dapat bukas. Ginagawa ito sa pamamagitan ng pagtatakda ng bit 1 daungan 92h, pagsasara ng linya A20- i-reset ang bit na ito.

Pamilyar na ang mambabasa sa huling aksyon, at hindi na ito dapat magbangon ng mga tanong sa kanya.

Kaya, tingnan natin ang listahan ng aming bago, unang programa, kung saan ang isang maliit na cycle ay ipinapatupad na. Ang mga linyang idinagdag sa nakaraang listahan ay minarkahan ng asterisk (*).

org 100h

Magsimula:

; Real mode kami

cli ;*

sa al, 70h ;*
o al, 80h ;*
palabas 70h , al ;*

; Buksan ang linya A20

sa al, 92h ;*
o al, 2 ;*
palabas 92h, al ;*

mov eax,cr0
o al, 1
mov cr0, eax


; Maliit na double loop

mov cx, 20 ;*

cycle: ;*
mov palakol, cx ;*
mov cx, 0ffffh ;*
loop $ ;*
mov cx, palakol ;*
loop cycle ;*

mov eax,cr0
at al, 0feh
mov cr0, eax

; Isara ang linya A20

sa al, 92h ;*
at al, 0fdh ;*
palabas 92h, al ;*

sa al, 70h ;*
at al, 7fh ;*
palabas 70h , al ;*

sti ;*

ret ; kumpletuhin ang programa

Maaari mong tiyakin na gumagana ang program sa pamamagitan ng pagpapatakbo ng executable file mula sa isang malinis MS-DOS. Kung ang programa ay lumabas nang tama, kung gayon ang lahat ay maayos.

Gayunpaman, maaaring lumitaw ang mga sumusunod na problema:

1. nag-freeze ang computer";

2. nag-restart ang computer.

Ito ay maaaring mangyari dahil sa mga sumusunod na dahilan:

1. ang programa ay inilunsad sa mode V86(virtual mode 8086 );

2. ang programa ay inilunsad sa protektadong mode o sa ilalim ng isang partikular na operating system.

Samakatuwid, bago ilunsad ang anumang programa na tumatakbo sa protektadong mode, dapat mong suriin kung ang programa ay maaaring magpatuloy na gumana. Ito ay tatalakayin pa.

Sinusuri ang posibilidad ng paglipat sa protektadong mode

Sa nakaraang kabanata nagkaroon kami ng sumusunod na problema: hindi kinikilala ng program na ito ay nasa protektadong mode o mode V86, na humahantong sa pagyeyelo o pag-reboot ng system. Kung susubukan naming patakbuhin ang programa sa ilalim ng operating system Windows, Iyon Windows sasaluhin ang pagtatangka ng program na lumipat sa protected mode at mag-alok na mag-reboot sa emulation mode MS-DOS(para sa plataporma 9x), o puwersahang wakasan ang programa (platform NT).

Kaya, upang matiyak na tayo ay nasa totoong mode, dapat nating gawin ang mga sumusunod na operasyon:

1. suriin ang zero bit ng rehistro CR0;

2. Tiyaking hindi na-load ang operating system ng Windows.

Ang unang operasyon ay isinasagawa sa pamamagitan ng direktang pagbabasa ng rehistro CR0 na may karagdagang pagsusuri sa zero bit ng rehistro EAX, AX o AL. Kung ang bit ay hindi nakatakda, pagkatapos tayo ay nasa real mode. Kung hindi, ang karagdagang pagpapatupad ng programa ay magiging walang kabuluhan.

Ang pangalawang aksyon ay isinasagawa sa pamamagitan ng pagtawag sa function 1600h nakakagambala 2fh. Binibigyang-daan ka ng function na ito na makuha ang kasalukuyang bersyon ng operating system Windows. Kung pagkatapos tawagan ang function sa rehistro AL naglalaman ng zero, pagkatapos ay hindi na-load ang operating system. Kung hindi, muli, walang punto sa aming programa na magpatuloy pa.

Isaalang-alang ang halimbawa ng sumusunod na programa. Ito ay isang pagbabago ng nakaraang programa; lahat ng mga bagong tagubilin ay minarkahan ng asterisk (*).

Org 100h

Magsimula:

; I-set up ang mga rehistro ng segment

mov palakol, cs ;*
mov ds, palakol ;*

; Sinusuri kung talagang nasa real mode kami

mov eax, cr0 ;* suriin para sa zero bit
pagsusulit al, 1 ;* irehistro ang CR0
jz walang_pm ;*

mov ah, 09h ;* DOS function 09h
mov dx, pm_msg ;* output ng linya
int 21h ;*
ret;* at lumabas

no_pm:
; Sinusuri kung ang programa ay tumatakbo sa ilalim ng Windows

mov palakol, 1600h ;* 1600h multiplexer function
int 2fh ;* nagambala - kumuha ng bersyon ng Windows
pagsusulit al, al ;* kung hindi 0 - error
jz walang_windows

; Magpakita ng mensahe ng error

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

walang_windows:
; Siguradong nasa real mode kami
; Huwag paganahin ang mga naka-mask na interrupt

; I-disable ang non-maskable interrupts (NMI)

sa al, 70h
o al, 80h
palabas 70h, al

; Buksan ang linya A20

sa al, 92h
o al, 2
palabas 92h, al

; Lumipat sa protected mode

mov eax,cr0
o al, 1
mov cr0, eax

; Ngayon ay nasa protected mode na tayo
; Maliit na double loop

mov cx, 20

cycle:
mov palakol, cx
mov cx,0ffffh
loop $
mov cx, palakol
loop ikot

; Lumipat sa real mode

mov eax,cr0
at al, 0feh
mov cr0, eax

; Isara ang linya A20

sa al, 92h ;*
at al, 0fdh ;*
palabas 92h, al ;*

; I-enable ang non-maskable interrupts (NMI)

sa al, 70h ;*
at al, 7fh ;*
palabas 70h , al ;*

; I-enable ang mga naka-mask na interrupt

sti ;*

; Bumalik na kami sa real mode

ret ; kumpletuhin ang programa

; Mga mensahe ng error

pm_msg: ;*
db "Error: tumatakbo na sa protected mode!$" ;*
win_msg: ;*
db "Error: Microsoft Windows detected!$" ;*
Ang halimbawang ito ay hindi pa nagpapakita ng pagpapatupad ng 32-bit na mga utos. Upang gawin ito, dapat mo ring maging pamilyar sa materyal sa susunod na kabanata. Bilang karagdagan, ang halimbawa ay may sumusunod na disbentaha: tinatawag ang mga function DOS (sa loob ng 21h), na nagsisimula nang sumalungat sa kalayaan ng aming programa mula sa operating system MS-DOS. Sa hinaharap, kakailanganin mong alisin ang paggamit ng mga function ng operating system at lumipat sa paggamit ng mga function BIOS. Ngunit sa ngayon ay sapat na upang limitahan ang ating sarili sa code na ito.

Kasalukuyan akong naglalaro sa x86 Assember upang mapabuti ang aking mababang antas ng mga kasanayan sa programming. Kasalukuyan akong nagkakaroon ng maliit na problema sa addressing scheme sa 32-bit protected mode.

Ang sitwasyon ay ganito:

Mayroon akong isang programa na na-load sa 0x7e0 na nagpapalit ng CPU sa protektadong mode at tumalon sa naaangkop na marka sa code:

[...] code para ilipat ang CPU sa Protected Mode [...] jmp ProtectedMode [...] bits 32 ProtectedMode: .halt: hlt jmp .halt

Sa ngayon ang lahat ay gumagana nang mahusay. Gumagana ang "Jmp ProtectedMode" nang walang tahasang malayong pagtalon upang i-clear ang prefetch queue, dahil naglo-load ang program na ito sa offset 0 (org 0 sa simula), na pinipilit ang segment ng code na tumuro sa tamang lugar.

Ang aking kasalukuyang problema ay na sa shortcut na "ProtectedMode" gusto kong pumunta sa isa pang programa na na-load mula sa 0x8000 (Sinubukan ko ito sa isang memory dump, ang pag-andar ng pag-load ay gumana nang tama at ang programa ay na-load nang tama hanggang 0x8000).

Dahil nasa ProtectedMode na ngayon ang CPU kaysa sa RealMode, iba ang addressing scheme. Gumagamit ang ProtectedMode ng mga descriptor upang hanapin ang base address at limitasyon sa talahanayan ng descriptor upang idagdag ang ibinigay na offset at makuha ang pisikal na address (tulad ng pagkakaintindi ko). Samakatuwid, kinailangang i-install ang GDT bago maipasok ang ProtectedMode.

Ang akin ay ganito:

%ifndef __GDT_INC_INCLUDED__ %define __GDT_INC_INCLUDED__ ;********************************* ;* Global Descriptor Table (GDT) * ; ********************************* NULL_DESC: dd 0 ; null descriptor dd 0 CODE_DESC: dw 0xFFFF ; limitahan mababa dw 0 ; base mababa db 0 ; base gitna db 10011010b ; i-access ang db 11001111b; granularity db 0 ; mataas na base DATA_DESC: dw 0xFFFF ; deskriptor ng data dw 0 ; limitahan ang mababang db 0 ; base mababa db 10010010b ; i-access ang db 11001111b; granularity db 0 ; base high gdtr: Limitasyon dw 24 ; haba ng GDT Base dd NULL_DESC ; base ng GDT %endif ;__GDT_INC_INCLUDED__

at na-load sa GDT register sa pamamagitan ng

LGdt

Ang hindi ko pa naiisip ay kung paano ako pupunta ngayon sa pisikal na address na 0x8000 sa ProtectedMode gamit ang GDT?

Ang una kong naisip ay pumili ng isang code descriptor (CODE_DESC) na dapat tumuro sa 0x7e00 (kasalukuyang mga programa ay na-load) at gamitin ang offset na kailangan upang makakuha ng 0x8000 (512 bytes), na nagreresulta sa isang jump command:

Jmp CODE_DESC:0x200

Ngunit hindi ito gumagana.

Jmp 0x7e0:0x200

hindi rin gumagana...

May idea ka ba kung ano ang kulang ko dito? Maaaring may napalampas akong mahalagang bagay tungkol sa 32-bit ProtectedMode addressing scheme at sa paggamit ng GDT.

Buong code:

Bits 16 org 0 ; puno ng offset 0000 (phys addr: 0x7e00) jmp Start Start: xor ax, ax mov ax, cs mov ds, ax ; i-update ang segment ng data cli ; malinaw na interrupts lgdt ; i-load ang GDT mula sa GDTR (tingnan ang gdt_32.inc) tumawag sa OpenA20Gate ; buksan ang A20 gate call EnablePMode ; tumalon sa ProtectedMode ;****************** ;* Binubuksan ang A20 Gate * ;******************** OpenA20Gate: sa al, 0x93 ; lumipat A20 gate sa pamamagitan ng mabilis na A20 port 92 o al, 2 ; itakda ang A20 Gate bit 1 at al, ~1 ; malinaw INIT_NOW bit out 0x92, al ret ;************************** ;* Pinapagana ang Protected Mode * ;******** ****************** EnablePMode: mov eax, cr0 o eax, 1 mov cr0, eax jmp ProtectedMode ; gumagana ito (tumalon sa label at huminto); jmp (CODE_DESC-NULL_DESC):ProtectedMode ; => hindi gumagana ;jmp 08h:ProtectedMode , => hindi gumagana ;************** ;* data fields * ;* &includes * ;******** ******* %include "gdt_32.inc" ;****************** ;* Protected Mode * ;************** * ******* bits 32 ProtectedMode: ;dito gusto kong lumipat sa physical addr 0x8000 (elf64 asm program) .halt: hlt jmp .halt

11