Apakah Mod Dilindungi dan apakah yang disertakan dengannya? Menukar pemproses Intel kepada mod terlindung Beralih kepada mod terlindung pemasang

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

yFBL, LBL CHSH RPNOYFE, CH TEBMSHOPN TETSYNE TBVPFSCH RTPGEUUPTB OBN DPUFHREO CHUEZP MYYSH 1 NEZBVBKF BDTEUOPZP RTPUFTBOUFCHB (YЪ LPFPTSCHI PVSHYUOPK RBNSFSY CHMPZHMSE4). 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.

MENGENAI FPZP, UFP DPVBCHMSEFUS CH TEBMSHOPN TETSYNE TENTANG RTPGEUUPTBI, LPFPTSHCHE RPDDETSYCHBAF 32-VYFOSCHK BDTEU (i386 Y CHCHYE) - DPVBCHMSAFUS OPCHSHCH TEZYUFTSHCHY, ESPEXCX EZYUFTSHCHY, CHETAXE TBUFTSHCHY, CHEETAXE TBUFTSHCHY, DPVBCHMSAFUS , 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 KIRA-KIRA 1 VBKF VPMSHYE (LOYN DPVBCHMSEFUS UREGYBMSHOSCHK RTEZHYLU). MENGENAI RTPGEUUPTE NMPPTSE 286 FY LPNBODSCH VHDHF OELPTTELFOSCH. nsch NPTSEN, OBRTYNET, OBRYUBFSH mov eax, 0x12345678 Y RPUME bFPZP CH AX VHDEF 0x5678, RPFPNH YuFP PADA LBL VSH SCHMSEFUS "PLOPN" CH NMBDIKHA YUBUFSH TEZYUFTB EAX (ALBUFSH TEZYUFTB EAX). TEZYUFTB-PFPVTBTTSEOYS UFBTYEK YUBUFY 32-VYFOSHI TEZYUFTPC OE UHEEUFCHHEF - NPTsOP EЈ YICHMEYUSH FPMSHLP U RPNPESH BTYZHNEFYLY (OBRTYNET, UDCHYOKHFSH EAX TENTANG 1TB, UDCHYOKHFSH EAX TENTANG 6TB 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 TENTANG FP, YuFSH CHTBЪSHHBTDOOO 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 SKOP RPDTBHNECHBAF (DS YURPMSH'HEFUS RP KHNPMYUBOYA RTBLLFYUEULY CHUENY LPNBODBNY Y OELPFPTSHNY UFTPLPCCHNY PRET BGYSNY, PRES OELPLPCPTSHNY OELPFPTSHNY UFTPLPCCHNY PRET BGYSNY, PRES OELPLPCPTSHNY OELPFPTSHNY SH, YuFP CHSH IPFYFE PVTBEBFSHUS YUETE OYI. oBRTYNET, mov ax, .

rPNYNP bFPZP TBUYYTEOYS TEZYUFTPC, DPVBCHMSAFUS OPCHCHCHE HRTBCHMSAEYE TEZYUFTSH (TBOSHYE CHMYSM MENGENAI TETSYN TBVPFSH RTPGEUUPTB FPMSHLP BENDERA) - CR0, CR2, CR3 DAN 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. menyanyikan 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 TENTANG DCHB FIRB - UEZNEOFSH LPDB Y UEZNEOFSH DBOOSCHI (TENTANG 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 BFSHHILEBZSHTSCHE BFSHOT, LLPZSHTSCHE BFSHI 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 TENTANG PDYO Y FPF TSE TEZYPO RBNSFY, OP PDYO YY OYI BDRPEMFNHROSS YUY.

oEUNPFTS TENTANG RPDDETSLH UEZNEOFBGYY, POB UYFBEFUS KHUFBTECHYEK. OH Windows, OH Linux OE YURPMSHJHAF EЈ CH RPMOPC NETE, B MENGENAI 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 bintang (NBLUYVSHPN SBNBTNFORCENB20000000 SYNE). 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 UCHPEK PRETBGYPOOPK UYUFENE - LFP UYMSHOP HUMPTSOSEF LPD SDTB, SJSHLY CHSHUPLPZP HTPCHOS (OBRTYNET, y YMY MY DDFEET CHFYAFFET CHFYAFFET CHFYAFFY++) OE RPMOPGEOOOP RTPZTBNNYTPCHBFSH FPMSHLP TENTANG Asembler) Y, OBLPOEG, CHCH OE UNPTSEFE RETEOUFY UYUFENKH MENGENAI DTHZHA BTIYFELFHTH, RPFPNKH YuFP x86 EDYOUFCHEOOBS, LPFPTBS KHNEEF LFPF NEIBOYN (Y FP, Ch 64-VYFOPN TETSYNE RPMS VBPCHPZP BDTEUB Y TBNETB UEZNEOFSHPTBS Y TBNETB UEZNEOFSHPTY'BETSHNBYURTHAFB Y ZOPTYNBYOFSH CHBI DPUFHRB).

lBL S HCE ULBBM, FBVMYGB DEULTYRFPTPCH UEZNEOFPCH ZHTNYTHHEFUS UBNPK PRETBGYPOOPK UYUFENPK. YuFPVSH KHLBBBFSH RTPGEUUPTH, ZDE POB OBIPDFUS YURPMSH'HEFUS UREGYBMSHOBS LPNBODB - lgdt (Muat Jadual Deskriptor Global). 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 MYBOKKBN UHBHCBFB - VHKBHBHCBN VMYGSHCH (FP EUFSH VE KHYUFB CHUEI UEZNEOFPC). yNEEF UNSHUM CHSTTBCHOSFSH OBYUBMP FBVMYGSHCH KIRA-KIRA 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 MENGENAI 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 SDNEYBFSHUS CH OTBЪ(CHVBDPFSHUS CH OTBЪ 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 FPGEUHKTB" UBNSCHK, "NPTSEF CHSHCHRPMOSFSH MAVSHCH LPNBODSCH Y NEOSFSH TETSYNSCH TBVPFSH FPGEUPK" UBNSCHK. lBL Y CH UMHYUBE U UEZNEOFBGYEK, TBTBVPFYUYLY x86 RETEVPTEYMY U ZHKHOLGYPOBMPN Y CHUE pu YURPMSHJHAF MYYSH DCHB KHTPCHOS YYUEFSHCHTI CHPNPTSOSCHI, B DTHZIE BTIYFELPH TSCH RPGETSHIP TSCH RTPGETSHIP x LBTSDPZP UEZNEOFB CH EZP DEULTYRFPTE KHLBBO DPL (Tahap keistimewaan Deskriptor)- HTPCHEOSH DPUFHRB OEPVIPDYNSCHK DMS DBOOZP UEZNEOFB. OERTYCHYMEZYTPCHBOOSCHK LPD OE NPTsEF RPMKHYUFSH DPUFHR L UEZNEOFH 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 VYFCH3HPDECHETS VYFCH3HDPCHETS HCE UFBTYYE OPNET UBNPK FBVMYGSHCH. fBLYN PVTBBN UEMELFPT = (YODELU_DEULTYRFPTB shl 2) + RPL. RPL- Tahap keistimewaan yang diminta - ЪBRTBYCHBENSCHK HTPCHEOSH RTYCHYMEZYK. rTY LFPN RPL DPMTSEO VSHFSH VPMSHYE YMY TBCHEO NBLUINBMSHOPNKH YЪ DPL Y CPL (Tahap keistimewaan semasa). 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 YuFP MENGENAI 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 bergerak, mula32_msg call write_str ; ъБЗТХХЪН ЪБУУЭОЭ Ч GDTR lgdt ; ъBRTEFYN RTETSCHCHBOYS cli; RETEKDEN CH ЪBEEYEЈOOOSCHK TETSYN mov eax, cr0 atau eax, 1 mov cr0, eax ; RETEKDEN MENGENAI 32-VYFOSHCHK LPD jmp 8:start32; fBVMYGB DEULTYRFPTPCH UEZNEOFPPCH DMS 32-VYFOPZP SDTB jajaran 16 gdt32: dq 0 ; NULL - 0 dq 0x00CF9A000000FFFF ; KOD - 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 TENTANG 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), RPVTEFIFYFSH RTYEN BRRBTBFOSCHI RTETSCHCHBOYK (LMBCHYBFKHTB, NSHCHYSH, FBKNET Y DTHZIE KHUFTPKUFCHB), RPVFPNH YuFPY BIOS RPUME BPFYU, RPFPNH YuFPY BIOS FPUME REPBFYU 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 TENTANG 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 YNPOFMY'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 FELUPDSYNBCHPZPNCSCTCH!" CH RTBCHSHCHK OYTSOYK KHZPM LBOBOB (FELUFPCHSHCHK BLTBO YNEEF TBTEYEOYE 80 x 25 UYNCHPMPCH, LBTSDSCHK UYNCHPM ЪBOINBEF CH RBNSFY DCHB VBKFB - LPD UYNCHPFMB Y EZKBhFB).

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

h OBYEN but.cfg LPNBODH S64 RPLB ЪBNEOYN MENGENAI 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 (TENTANG 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 YNYZUSH OBN YN.

h ЪBCHETYEOYE CHSHCHRKHULB, RPTSBMKHK, DPVBCHMA RPUMEDOYK YFTYI - RTPCHETLH, YuFP RTPGEUUPT RPDDETSYCHBEF ЪBEEYEOOOSCHK TETSIN. UHFSH RTPCHETLY CH FPN, YuFP OE CHUE VYFSH BENDERA NPTsOP YYNEOIFSH RTPZTBNNOP. FP EUFSH TEZYUFT OE UPCHUEN 16-VYFOSHCHK. MENGENAI 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 BENDERA. fBLYN PVTBUPN EZP NPTsOP NEOSFSH GEMYLPN, BOE PFDEMSHOSCHNY LPNBODBNY. ChPF RPMOSCHK LPD OBEZP ЪBZТХЪУЛБ:

Org 0x7C00 jmp but ; ъБЗПМПЧПЛ 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 ? ; ъБЗПМПЧПЛ ЖБКМБ maya pada 0x800 f_info: f_name rb 256 f_next dq ? f_prev dq ? f_ibu bapa dq ? f_flags dq ? f_data dq ? f_saiz dq ? f_ctime dq ? f_mtime dq ? f_atime dq ? tamat maya ; dBOOSHE OBYUBMSHOPZP ЪБЗТХЪУЛБ perkataan sector_per_track pada $$ label head_count byte pada $$ + 2 label disk_id byte pada $$ + 3 reboot_msg db "Tekan sebarang kekunci...",13,10,0 boot_file_name", db "boot. ; hCHCHPD UFTPLAY DS:SI MENGENAI BLTB write_str: tolak si mov ah, 0x0E @: lodsb test al, al jz @f int 0x10 jmp @b @: pop si ret ; lTYFYUEULBS PYYVLB ralat: pop si call write_str ; RETEЪБЗТХЛБ but semula: mov si, reboot_msg call write_str xor ah, ah int 0x16 jmp 0xFFFF:0 ; ъБЗТХЛБ UELFPTB DX:AX CH VHJET ES:DI load_sector: tolak dx tambah kapak, perkataan adc dx, perkataan cmp bait, 0xFF je .use_EDD tolak 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 .ralat pop si dx ret ; rPYUL ZHBKMB U YNEOEN DS:SI CH LBFBMPZE DX:AX find_file: tekan cx dx di .find: cmp ax, -1 jne @f cmp dx, -1 jne @f .not_found: ralat panggilan db "TIDAK DIJUMPA",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: tolak bx cx dx si di mov ax, word mov dx, word .load_list: cmp ax, -1 jne @f cmp dx, -1 pop_filem @f . 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, tambah si, 6 cmp ax, -1 jne @f cmp dx, -1 je .file_end @: push es mov es, bx xor di, di panggil load_sector add bx, 0x200 / 16 pop es loop .load_sector lodsw mov dx, jmp .load_list ; but fPULB CHIPDB CH OBYUBMSHOSHCHK ЪBZTHYUYL: ; oBUFTPYN UEZNEOFOSHE TEZYUFTSH jmp 0:@f @: mov ax, cs mov ds, ax mov es, ax ; oBUFTPYN UFEL mov ss, kapak 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 , ex0 dix3, ex0 mov, x3 di dalam c load_sector.error in c dh mov , dh dan cx, 111111b mov , cx .disk_detected: ; ъБЗТХЪН РТПДПМЦЭОЕ ОБИБМШОПЗП ъБЗТХЪУЛБ mov si, boot_file_name mov ax, word mov dx, word mov dx, word file bx0d load ; RETEIPDYN TENTANG RTDDPMCEOYE jmp boot2 ; rKHUFPE RTPUFTBOUFCHP Y UYZOBFKHTB rb 510 - ($ - $$) db 0x55.0xAA ; dPRPMOYFEMSHOSH DBOOSH ЪБЗТХЪУЛБ load_msg_preffix db "Memuatkan "",0 load_msg_suffix db "". ..",0 ok_msg db "OK",13,10,0 config_file_name db "boot.cfg",0 start16_msg db "Memulakan 16 bit kernel...",13,10,0 start32_msg db "Memulakan 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, perkataan mov ax, perkataan @: 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 panggilan load_file ; CHSHRPMOYN ЪБЗТХЪПУОЛКvИУОЛКvР 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 bait, "L" je .load_file ; ъБЗТХЛБ ЖБКМБ cmp bait, "S" je .start ; ъBRHUL SDTB; oEYCHEUFOBS LPNBODB mov al, mov [.cmd], ralat panggilan al db "Arahan skrip but tidak diketahui "" .cmd db ? db ""!",13,10,0 .config_end: ; rTY RTBCHYMSHOPN LPOZHYZHTBGYPOOPN ZHBKME NSCH OE DPMTSOSCH UADB RPRBUFSH; jmp but semula; ъБЗТХЛБ ЖБКМБ.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 mov perkataan, perkataan dx mov, 0 perkataan mov, 0 pop ax shr ax, 9 - 4 tambah bx, ax tambah bp, 16 pop dx jmp .parse_line ; ъBRHUL SDTB.start: ; rTPCHETYN, YuFP ЪBZTHTSEO IPFS VSC PDIO ZhBKM cmp bx, 0x9000 / 16 ja @f ralat panggilan db "TIADA KERNEL DIMUAT",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 perkataan, "16" je .start16 cmp perkataan, "32" je .start32 ;cmp word, "64" ;je start64 ; oEYCHEUFOBS TSTSDOPUFSH SDTB ralat panggilan db "Hujah arahan mula tidak sah",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 bergerak, mula32_msg call write_str ; rTPCHETYN, YuFP RTPGEUUPT OE IHTSE i386 mov ax, 0x7202 push ax popf pushf pop bx cmp ax, bx je @f ralat panggilan db "Diperlukan i386 atau lebih baik",13,10,0 @: ; ъБЗТХХЪН ЪБУУЭОЭ Ч GDTR lgdt ; ъBRTEFYN RTETSCHCHBOYS cli; RETEKDEN CH ЪBEEYEЈOOOSCHK TETSYN mov eax, cr0 atau eax, 1 mov cr0, eax ; RETEKDEN MENGENAI 32-VYFOSHCHK LPD jmp 8:start32; fBVMYGB DEULTYRFPTPCH UEZNEOFPPCH DMS 32-VYFOPZP SDTB jajaran 16 gdt32: dq 0 ; NULL - 0 dq 0x00CF9A000000FFFF ; KOD - 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 TENTANG BLTB mov byte, "! " ;

Untuk menulis sistem pengendalian, anda perlu memahami banyak butiran. Jadi izinkan saya memberi pencerahan kepada anda sedikit (tetapi mari kita bersetuju bahawa anda akan membaca mana sendiri supaya anda mempunyai sesuatu untuk dibincangkan).
Sejujurnya, terdapat banyak bahan di PM di Internet, dan iley dan pehat bercakap sedikit tentang mod ini, tetapi saya diminta untuk menerangkannya secara umum. Sekarang saya akan menggariskan teori secara ringkas (sebenarnya, Intel menulis mana khusus untuk ini), kemudian kita akan mula menulis kod.

Pengenalan kepada Mod Dilindungi.
Jadi, PM adalah jauh berbeza daripada mod sebenar (RM) yang sudah biasa kepada semua orang sejak zaman DOS. Kini anda perlu membiasakannya: tiada segmen statik 64 kilobait, tiada jadual sampukan dalam 1 kilobait, tiada alamat asas segmen dalam daftar segmen, secara amnya dunia baharu sepenuhnya.
Sekarang segmen diterangkan dalam Jadual Deskriptor Global (GDT). Jadual ini hanya boleh dalam satu salinan. Dia adalah struktur dalam ingatan. Bukan segmen! Ia boleh didapati di mana-mana dalam ingatan, tetapi alamat dan hadnya ditulis pada daftar GDTR. Berikut adalah strukturnya:

Jadual itu sendiri terdiri daripada rekod struktur berikut (by the way, rekod sifar kosong. Ini penting. Apabila mengakses memori 'diterangkan' oleh deskriptor sifar, anda akan mendapat #GP - Kesalahan Perlindungan Umum):
Mari kita lihat lebih dekat struktur ini.

1. Had Segmen:
Tujuan bidang ini jelas dari namanya, tetapi ada kehalusannya. Anjing itu dikebumikan dalam bit G (Granularity).
Jika ia tidak ditetapkan, maka memori 'dikira' dalam bait. Dalam kes ini, saiz segmen boleh berbeza dari 1 bait hingga 1 megabait setiap saiz 1 bait.
Jika kita menetapkannya kepada 1, pengalamatan memori halaman akan diperkenalkan. Kemudian kita akan dapat menangani dari 4 kilobait kepada 4 gigabait RAM dengan perubahan saiz 4 kilobait (saiz halaman). Secara umum, pengalamatan halaman adalah lebih baik (bandingkan (1MB+64Kb-16bait) dan 4GB). Mari kita bercakap tentang pengalamatan segmen sahaja dalam siaran ini. Paging patut dibincangkan secara berasingan.

2.Alamat Pangkalan:
Di sini kami menunjukkan alamat fizikal pangkalan.

3. Jenis medan:
Gabungan bit menentukan jenis segmen:

4. S (jenis deskriptor):
Dokumentasi Intel mengatakan bahawa jika bit ini tidak ditetapkan, maka deskriptor ini adalah untuk segmen sistem, jika tidak - kod atau data. Dengan sistem yang kami maksudkan LDT, TSS, Interrupt Gates dan lain-lain seperti mereka (lebih lanjut mengenainya kemudian).

5. DPL (Tahap Keistimewaan Deskriptor):
Keistimewaan segmen yang diterangkan. Semua orang tahu Rings.

6. P (segmen hadir):
Jika bit ini ditetapkan, maka pemproses 'tahu' bahawa segmen itu sudah berada dalam ingatan (walaupun lebih baik untuk mengatakan sah). Jika anda memuatkan pemilih deskriptor dengan bit P tidak ditetapkan ke dalam daftar segmen, pengecualian #NP (tidak hadir) akan berlaku. Secara umum, saya akan menerangkan maksud frasa hiasan ini sedikit kemudian.

7.D/B:
Ia ditafsirkan secara berbeza untuk segmen pelbagai jenis.
1. Untuk segmen kod:
Panjang alamat berkesan 32 atau 16 bit dan saiz operan.
(1-32; 0-16);
2. Untuk timbunan:
Penunjuk tindanan ialah 32 atau 16 bit. (1-32; 0-16);

8.G:
Mempengaruhi unit (bait, halaman) di mana had segmen diukur. Secara umum, Paging boleh didayakan apabila pergi ke PM dengan menetapkan bit 31 daftar CR0.

Beberapa maklumat lanjut:
Kami menjangka bahawa perkataan Global tidak diletakkan dengan sia-sia. Jadi ada tanda lain. Betul, ada juga Jadual Deskriptor Tempatan. Terdapat pelbagai jenis mereka. Sebagai contoh, ia boleh digunakan dalam pelaksanaan tugas, dsb. Dan di sini LDT sudah membentuk satu segmen! Jadi biasakan dengan frasa seperti 'penerangan segmen jadual deskriptor tempatan'.

Selepas kami menerangkan jadual, kami perlu memuatkannya ke dalam daftar GDTR. Ini tidak dilakukan oleh mov. GDTR diisi dengan arahan lgdt fword (nilai). Iaitu, anda perlu membuat struktur ini sendiri dan memuatkannya ke dalam daftar yang disebutkan di atas. Masih terdapat pasukan yang bekerja dengan daftar ini, tetapi kami bergerak ke seluruh Eropah.

Satu perkara lagi. Dalam PM, daftar segmen tidak menyimpan alamat asas segmen (seperti dalam RM), tetapi perkara yang dilatih khas dipanggil pemilih. Struktur mereka adalah seperti berikut:

Di sini Indeks ialah nombor ordinal deskriptor dalam jadual.
TI menunjukkan tempat untuk mencari deskriptor (dalam GDT atau LDT).

Memandangkan sudah jelas cara membina jadual, mari bercakap tentang cara pergi ke PM (perhatian, ini hanya boleh dilakukan dari RM). Secara umum... anda hanya perlu menetapkan bit 0 daripada daftar kawalan CR0. Walaupun saya berbohong. Mula-mula anda perlu melumpuhkan semua gangguan ( NMI (Gangguan Tidak Boleh Topeng) termasuk), buka baris alamat A20(supaya pengalamatan 32-bit tersedia), muat turun GDTR, dan lompat pada tanda - mulakan.

Mari gunakan pemuat (anda boleh menggunakan KOLIBRI's), yang akan memuatkan kod kami ke alamat 1000h:0 (alamat RM, saya perhatikan).
Di sini, tidak semuanya akan menjadi lancar seperti manas tersebut apabila mereka bertukar kepada PM terus daripada pemuat but. Semuanya lebih rumit sedikit. Tetapi pertama, mari kita lihat kod yang akan dimuatkan oleh bootloader (kita tulis semuanya di FASM). Ini adalah sejenis helloworld. Mari boot, pergi ke PM dan cetak ucapan. Itu sahaja.

Format binari
xor ax, ax
cli ;memulakan semula daftar segmen
mov ss, ax
xor sp,sp
sti
mov ax,3
int 10j

Jmp 1000j:r_start

Mov ax,1000h;konfigurasi semula daftar
mov ds, ax
mov es, ax

Dalam al, 0x92; dayakan A20
atau al, 2
keluar 0x92, al

Lgdt fword ;muat daftar GDTR
mov eax,cr0
atau al,1; set bit 0
mov cr0,eax;hidupkan PM

Jmp fword 08h:Startup32; lompat ke PM

Jajarkan 8 ;pemproses mengendalikan plat sejajar dengan lebih pantas
GDT:
dq 0 ;kosong
db 0FFh,0FFh,0,0,0.9Ah,0CFh,0 ;kod
db 0FFj,0FFj,0,0,0.92j,0CFj,0;data
db 0FFj,0FFj,0,80j,0Bh,92j,40j,0 ;segmen video
labelkan GDT_SIZE pada $-GDT
GDTR:
dw GDT_SIZE-1
dd GDT+10000j
; anda perlu menulis alamat 32-bit. Sekarang kita berada dalam segmen 1000j, asasnya ialah 1000j * 10j (mengikut alamat fizikal) => alamat fizikal GDTR (tag!) = 10000j (alamat fizikal pangkalan segmen) + offset

Maya ;sekarang, sebenarnya, kami mengisi ruang ke penghujung segmen
rb 10000j-$;
tamat maya
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;
guna32
org $+10000j;ini sebabnya: dalam PM kami bekerja dengan segmen Flat, dan jika kami meninggalkan kod untuk PM sebelum org, maka; alamat intrasegmen tidak akan bertepatan dengan alamat Flat. Jadi begini.

Startup32: ;titik masuk ke PM
mov ax,10h ; di sini kita menolak pemilih. Selalunya (! jangan lupa tentang nombor siri dalam
mov es,ax ;table) segmen kod pemilih - 08h. data - 10j, segmen video - 18j
mov ds, ax
mov fs, ax
mov ss, ax
mov esp,10000j;timbunan
mov ax,18j
mov gs, ax

Mov esi,hi_string ;mari tunjukkan bahawa kita telah berjaya melepasi
cetakan panggilan
jmp$

;ESI - alamat talian
cetak:
pushad
xor ebx,ebx
mov ah,07h;atribut
meletakkan:
mov al,
mov, ax
inc ebx
uji al,al
jnz meletakkan
popad
ret
hi_string db 'Selamat datang ke PM, kawan',0

Apa yang telah kita lakukan? Pemuat berjaya memuatkan kami di alamat 1000h:0, dari mana kami meneruskan pelaksanaan. Mula-mula dihidupkan A20, melumpuhkan semua gangguan, dimuatkan ke dalam GDTR nilai yang sesuai, melompat ke label entri. Saya perhatikan bahawa kami melompat ke atas
jmp fword 08h:Startup32
Iaitu, 08h ialah pemilih deskriptor kod. Membiasakan diri.

Sekarang bagaimana untuk melancarkan keajaiban ini. Secara peribadi, saya menggunakan WinImage dan VirtualBox. Kami menolak pemuat but ke dalam sektor but cakera liut dan meletakkan fail .bin dalam akar. Kami menyimpannya dalam .vfd, nyatakan laluan ke imej cakera liut dalam sifat mesin maya, lancarkannya dan lihat hasilnya.

Dalam isu seterusnya kita akan melihat gangguan, kerosakan, perangkap, pengguguran dan cara ia berfungsi, ditangkap dan dinyahpepijat. Mari kita mula bercakap tentang seni bina.

Sumber maklumat.
1) Saya ingin segera mengucapkan terima kasih kepada Phantom_84 aka ego kerana menunjukkan jalan yang betul dan membantu saya pada awalnya. Tanpa dia, lebih sukar bagi saya untuk memikirkannya.

Semua pemproses Intel, bermula dengan i80286 dan sehingga dan termasuk yang terakhir, apabila bekalan kuasa dihidupkan (selepas "set semula") awal ia beroperasi dalam mod alamat sebenar (mod sebenar). Biasanya, mod sebenar digunakan sama ada sebagai mod perantaraan untuk bertukar kepada mod dilindungi selepas memulakan sistem mikropemproses, atau untuk pelaksanaan lebih pantas program yang ditulis untuk mikropemproses. 8086 , 80186 , tetapi, berbanding dengan 8086 , 80186 , mikropemproses moden dalam mod sebenar mempunyai set arahan boleh laku yang lebih luas dan keupayaan untuk memproses operan 32-bit.
Menukar pemproses ke dalam mod dilindungi daripada mod sebenar dijalankan dengan memuatkan ke dalam CR0(Gamb. 1) perkataan dengan nilai tunggal bit PE ( Lindungi Dayakan). Untuk keserasian dengan perisian untuk 80286, bit PE juga boleh ditetapkan menggunakan arahan LMSW. Sebelum menukar, jadual deskriptor yang diperlukan mesti dimulakan dalam ingatan IDT Dan GDT. Sejurus selepas mendayakan mod dilindungi, pemproses mempunyai CPL = 0.

nasi. 1

Untuk semua pemproses 32-bit, urutan langkah berikut disyorkan untuk beralih kepada mod dilindungi:
1. Lumpuhkan sampukan boleh bertopeng dengan menetapkan semula bendera IF, dan sekat kejadian sampukan tidak boleh bertopeng dengan logik luaran. Kod program semasa "tempoh peralihan" mesti menjamin ketiadaan pengecualian dan tidak menggunakan gangguan perisian. Keperluan ini disebabkan oleh perubahan dalam mekanisme untuk memanggil pengendali gangguan.
2. Muat naik ke GDTR alamat pangkalan GDT(arahan LGDT).
3. Arahan MOV CRO tetapkan bendera PE, dan jika pengurusan memori halaman diperlukan, maka bendera PG.
4. Sejurus selepas ini, arahan lompat intersegment ( JMP Jauh) atau hubungi ( CALL Jauh) untuk mengosongkan baris gilir arahan yang dinyahkod dalam mod sebenar, dan melakukan siri pemproses. Jika paging didayakan, maka kod arahan MOV CRO Dan JMP atau PANGGILAN mesti berada dalam halaman yang alamat fizikalnya sama dengan alamat logik (untuk kod yang mana kawalan dipindahkan, keperluan ini tidak dikenakan).
5. Jika anda bercadang untuk menggunakan jadual deskriptor tempatan, arahan LLDT pemilih segmen beban untuk LDT kepada daftar LDTR
6. Arahan LTR muatkan pemilih ke dalam daftar tugas TSS untuk tugas mod terlindung awal.
7. Muat semula daftar segmen (kecuali CS), yang kandungannya masih tergolong dalam mod sebenar, atau lakukan peralihan atau panggil tugas lain (dalam kes ini, daftar akan dimuat semula secara automatik). Daftar segmen yang tidak digunakan dimuatkan dengan nilai pemilih sifar.
8. Arahan LIDT memuatkan ke dalam daftar IDTR alamat dan had IDT— jadual deskriptor gangguan mod dilindungi.
9. Benarkan gangguan perkakasan bertopeng dan tidak boleh bertopeng

Artikel ini menyediakan beberapa pengenalan kepada membangunkan program yang beroperasi dalam mod pemproses yang dilindungi. Di sini tugas utama mana-mana program yang beroperasi dalam mod dilindungi akan dinyatakan dan penyelesaiannya akan diberikan. Pada asasnya, program akan ditulis dalam bahasa FASM.

Mod pengendalian pemproses Intel 80386

Dengan kemunculan pemproses Intel 80386 seni bina timbul IA32. Ia mengandaikan kemunculan mod operasi pemproses baharu - dilindungi (" Mod Dilindungi"). Untuk keserasian dengan pemproses sebelumnya dalam barisan Intel 80x86 CPU 80386 tidak bermula serta-merta dalam mod yang dilindungi, tetapi bekerja dalam apa yang dipanggil mod sebenar (" Mod Sebenar"). Di samping itu, setiap mod mempunyai satu atau lebih submod. Mari lihatnya.

Mod sebenar

Pemproses berada dalam mod ini serta-merta selepas menekan butang " Kuasa" komputer. Akses memori dalam mod sebenar dijalankan oleh konstruk " segmen:offset", yang menerangkan alamat logik. Nilai segmen, seperti offset, berjulat dari 0 sebelum ini 0FFFFh.

Memandangkan pengalamatan hanya boleh dilakukan dalam satu segmen, saiz segmen maksimum ialah 64 kilobait Alamat fizikal, yang ditetapkan pada bas alamat pemproses, dikira mengikut formula:

alamat linear = segmen * 16 + offset

Pemproses mod sebenar 80186 Dan 8086 nilai segmen berjulat daripada 0 sebelum ini 0F000j. Oleh itu, alamat terdedah maksimum pada bas alamat ialah 0FFFFFh, yang sepadan dengan (2^20)-1 , iaitu 1 megabait.

Sudah tentu, pada mulanya jumlah memori sedemikian kelihatan sangat besar, tetapi dari masa ke masa satu megabait menjadi tidak mencukupi. Dengan kemunculan pemproses 80286 blok memori yang dipanggil tersedia U.M.B., bermula dengan alamat 0FFFFj:0010j dan diakhiri dengan alamat 0FFFFj:0FFFFj(65520 bait melebihi satu megabait). Kini anda boleh mengkonfigurasi semula sistem pengendalian MS-DOS supaya ia menduduki blok ini, membebaskan 64 kilobait dalam RAM.

Mod Dilindungi

Mod ini mempunyai reka bentuk yang kompleks berbanding dengan yang sebenar. Alamat logik diwakili oleh pembinaan " pemilih:offset". Pemilih terdiri daripada 0 sebelum ini 0FFFFh(malah, terdapat 4 kali lebih sedikit pemilih - lebih banyak mengenai perkara ini dalam artikel berikut). Offset, tidak seperti mod sebenar, adalah 32-bit, yang membolehkan anda menangani segmen 4 gigabait. Alamat logik ditukar kepada linear mengikut skema berikut:

alamat linear = asas segmen + offset

Alamat linear kemudiannya diletakkan pada bas alamat jika mod pengalamatan halaman tidak didayakan. Jika tidak, alamat linear ditukar kepada alamat fizikal, dan hanya kemudian ia diletakkan pada bas alamat. Selain itu, mod dilindungi membolehkan anda menyusun memori maya, mencapai saiz sehingga 64 terabait dan hanya bergantung pada saiz cakera keras (contohnya, fail halaman yang sama dalam Windows melaksanakan ingatan maya). Hampir semua sistem pengendalian moden beroperasi dalam mod terlindung.

Submod berbilang tugas bagi mod dilindungi

Mod ini membolehkan anda mengatur multitasking, iaitu keupayaan untuk melaksanakan beberapa tugas atau sistem berbilang pengguna secara serentak.

Mod 8086 maya

Ini juga merupakan submod Mod Dilindungi yang membolehkan anda mencipta mesin maya yang bertindak seolah-olah ia berada dalam mod sebenar, tetapi sebenarnya berjalan dalam Mod Dilindungi.

Mod tidak sebenar

Ini ialah sub-mod khas mod sebenar. Pemproses berada dalam mod sebenar, tetapi dialamatkan ke memori oleh " pemilih: offset". Dengan cara ini, memori melebihi 1 megabait tersedia. Pada masa hadapan, mod dilindungi dan submodnya akan dipertimbangkan.

Program pertama: tukar ke mod dilindungi

Peralihan kepada mod dilindungi dijalankan dengan menetapkan bit 0 mendaftar CR0. Peralihan kepada mod sebenar dijalankan dengan menetapkan semula bit sifar yang sama. Pertimbangkan program yang melaksanakan operasi ini (bahasa - Pemasang Rata):

guna16 ; Menggunakan arahan 16-bit

org 100j

Mulakan:

; Kami berada dalam mod sebenar

mov eax,cr0 ; Membaca nilai daftar CR0
atau al, 1 ; Tetapkan bit sifar
mov cr0, eax ; Tulis nilai CR0 baharu

; Kami berada dalam mod dilindungi

mov eax,cr0 ; Membaca nilai CR0
dan al, 0feh ; Tetapkan semula bit sifar kepada 0
mov cr0, eax ; Mari pergi ke mod sebenar

; Kami dalam mod sebenar

ret ; Keluar dari program

Walau bagaimanapun, program ini benar-benar mentah kerana gelung tidak dapat dilaksanakan di dalamnya. Jika anda menulis arahan seperti hlt atau jmp$, maka apabila gangguan pertama dicetuskan, komputer akan but semula.

Dalam kes kami, arahan dicetuskan dengan cepat, tetapi ada kemungkinan bahawa dalam selang antara pelaksanaan mana-mana arahan dalam program kami, gangguan masih akan mencetuskan, yang akan membawa kepada kegagalan serta-merta dan but semula. Oleh itu, anda harus menjaga gangguan. Jadi, mari kita lihat penyenaraian sekali lagi. Ini tidak boleh dipanggil program pertama (sebaliknya, ia akan pergi ke sifar), kerana ia tidak melaksanakan tindakan asas menukar kepada mod yang dilindungi. Untuk beralih sepenuhnya kepada mod dilindungi dengan tetapan minimum, anda perlu melakukan langkah berikut:

1. semak sama ada ia boleh bertukar kepada mod dilindungi;

2. mulakan jadual deskriptor;

3. nyahdayakan gangguan (boleh bertopeng dan tidak bertopeng);

4. talian terbuka A20;

5. memuatkan daftar kawalan memori;

7. berhijrah ke segmen kod 32-bit dengan mengatasi daftar CS.

Tetapi sudah cukup untuk program pertama melakukan langkah 3, 4, 5. Kemudian menggelungkannya tidak akan membawa kepada but semula komputer. Mari kita lihat setiap tindakan.

Melumpuhkan gangguan menghalang kami daripada but semula. Gangguan dibahagikan kepada kedua-dua boleh bertopeng dan tidak boleh bertopeng. Untuk melumpuhkan gangguan bertopeng, anda perlu menetapkan semula bendera JIKA mendaftar EFLAGS pasukan cli, gangguan didayakan oleh arahan sti. Gangguan tidak bertopeng dilarang dengan cara yang sedikit berbeza. Terdapat dua cara untuk melakukan ini: memprogramkan daftar pengawal gangguan (kaedah ini akan dibincangkan sedikit kemudian) atau menukar bit ketujuh port 70j: jika bit ditetapkan, maka gangguan dilumpuhkan, jika bit ditetapkan semula, gangguan boleh dilaksanakan.

Sekarang mari kita tanya diri kita apakah fungsi talian tersebut A20, Jadi apa ini. Talian A20- salah satu daripada 32 talian alamat. Apabila komputer but, talian A20 tertutup. Ini menghasilkan penjanaan alamat 20-bit (iaitu, keseluruhan ruang alamat adalah sama dengan (2^20)=1 megabait). Ini disertakan untuk keserasian pemproses. 8086 : oleh itu, cuba menulis ke alamat linear 12345678j, kami sebenarnya akan menuliskannya di 00045678h, yang boleh membawa kepada hasil yang tidak dijangka sepenuhnya. Oleh itu, untuk fungsi penuh aplikasi 32-bit, baris A20 mesti terbuka. Ini dilakukan dengan menetapkan bit 1 pelabuhan 92j, penutupan talian A20- set semula sedikit ini.

Pembaca sudah biasa dengan tindakan terakhir, dan ia sepatutnya tidak lagi menimbulkan persoalan dalam dirinya.

Jadi, mari kita lihat penyenaraian program baharu kami yang pertama, di mana kitaran kecil sudah dilaksanakan. Garisan yang ditambahkan pada penyenaraian sebelumnya ditandakan dengan asterisk (*).

org 100j

Mulakan:

; Kami berada dalam mod sebenar

cli ;*

dalam al, 70j ;*
atau al, 80j ;*
keluar 70j , al ;*

; Buka talian A20

dalam al, 92j ;*
atau al, 2 ;*
keluar 92j, al ;*

mov eax, cr0
atau al, 1
mov cr0, eax


; Gelung berganda kecil

mov cx, 20 ;*

kitaran: ;*
mov kapak, cx ;*
mov cx, 0ffffh ;*
gelung $ ;*
mov cx, kapak ;*
gelung kitaran ;*

mov eax, cr0
dan al, 0feh
mov cr0, eax

; Tutup talian A20

dalam al, 92j ;*
dan al, 0fdh ;*
keluar 92j, al ;*

dalam al, 70j ;*
dan al, 7fh ;*
keluar 70j , al ;*

sti ;*

ret ; menyelesaikan program

Anda boleh memastikan program ini berfungsi dengan menjalankan fail boleh laku daripada clean MS-DOS. Jika program keluar dengan betul, maka semuanya baik-baik saja.

Walau bagaimanapun, masalah berikut juga mungkin timbul:

1. komputer membeku";

2. komputer dimulakan semula.

Ini mungkin berlaku atas sebab-sebab berikut:

1. program ini dilancarkan dalam mod V86(mod maya 8086 );

2. program ini dilancarkan dalam mod dilindungi atau di bawah sistem pengendalian tertentu.

Oleh itu, sebelum melancarkan sebarang program yang berjalan dalam mod dilindungi, anda harus menyemak sama ada program itu boleh terus beroperasi. Ini akan dibincangkan lebih lanjut.

Menyemak kemungkinan bertukar kepada mod dilindungi

Dalam bab sebelumnya kita mengalami masalah berikut: program tidak mengenali bahawa ia berada dalam mod atau mod yang dilindungi V86, yang membawa kepada sistem membeku atau but semula. Jika kita cuba menjalankan program di bawah sistem pengendalian Windows, Itu Windows akan menangkap percubaan program untuk beralih kepada mod dilindungi dan menawarkan untuk but semula dalam mod emulasi MS-DOS(untuk platform 9x), atau menamatkan program secara paksa (platform NT).

Oleh itu, untuk memastikan bahawa kami benar-benar berada dalam mod sebenar, kami harus melakukan operasi berikut:

1. semak bit sifar daftar CR0;

2. Pastikan sistem pengendalian Windows tidak dimuatkan.

Operasi pertama dilakukan dengan membaca terus daftar CR0 dengan pemeriksaan lanjut bit sifar daftar EAX, AX atau AL. Jika bit tidak ditetapkan, maka kita berada dalam mod sebenar. Jika tidak, pelaksanaan selanjutnya program menjadi sia-sia.

Tindakan kedua dijalankan dengan memanggil fungsi 1600j menyampuk 2fj. Fungsi ini membolehkan anda mendapatkan versi semasa sistem pengendalian Windows. Jika selepas memanggil fungsi dalam daftar AL mengandungi sifar, maka sistem pengendalian tidak dimuatkan. Jika tidak, sekali lagi, tiada gunanya program kami diteruskan lagi.

Perhatikan contoh program berikut. Ia adalah pengubahsuaian program sebelumnya; semua arahan baharu ditandakan dengan asterisk (*).

Org 100j

Mulakan:

; Sediakan daftar segmen

mov kapak, cs ;*
mov ds, kapak ;*

; Memeriksa bahawa kita benar-benar berada dalam mod sebenar

mov eax,cr0 ;* semak sifar bit
ujian al, 1 ;* daftar CR0
jz no_pm ;*

mov ah, 09j ;* Fungsi DOS 09j
mov dx, pm_msg ;* keluaran baris
int 21j ;*
ret;* dan keluar

no_pm:
; Menyemak sama ada program berjalan di bawah Windows

mov kapak, 1600h ;* Fungsi pemultipleks 1600j
int 2fj ;* sampuk - dapatkan versi Windows
ujian al, al ;* jika tidak 0 - ralat
jz no_windows

; Paparkan mesej ralat

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

no_windows:
; Kami pasti berada dalam mod sebenar
; Lumpuhkan gangguan boleh bertopeng

; Lumpuhkan gangguan tidak bertopeng (NMI)

dalam al, 70j
atau al, 80j
keluar 70j, al

; Buka talian A20

dalam al, 92j
atau al, 2
keluar 92j, al

; Tukar kepada mod dilindungi

mov eax, cr0
atau al, 1
mov cr0, eax

; Sekarang kita berada dalam mod dilindungi
; Gelung berganda kecil

mov cx, 20

kitaran:
mov kapak, cx
mov cx,0ffffh
gelung $
mov cx, kapak
gelung kitaran

; Tukar kepada mod sebenar

mov eax, cr0
dan al, 0feh
mov cr0, eax

; Tutup talian A20

dalam al, 92j ;*
dan al, 0fdh ;*
keluar 92j, al ;*

; Dayakan gangguan tidak bertopeng (NMI)

dalam al, 70j ;*
dan al, 7fh ;*
keluar 70j , al ;*

; Dayakan gangguan bertopeng

sti ;*

; Kami kembali dalam mod sebenar

ret ; menyelesaikan program

; Mesej ralat

pm_msg: ;*
db "Ralat: sudah berjalan dalam mod dilindungi!$" ;*
win_msg: ;*
db "Ralat: Microsoft Windows dikesan!$" ;*
Contoh ini juga belum menunjukkan pelaksanaan arahan 32-bit. Untuk melakukan ini, anda juga harus membiasakan diri dengan bahan dalam bab seterusnya. Di samping itu, contoh mempunyai kelemahan berikut: fungsi dipanggil DOS (int 21j), yang sudah mula bercanggah dengan kebebasan program kami daripada sistem pengendalian MS-DOS. Pada masa hadapan, anda perlu menyingkirkan penggunaan fungsi sistem pengendalian dan beralih kepada menggunakan fungsi BIOS. Tetapi buat masa ini sudah cukup untuk menghadkan diri kita kepada kod ini.

Saya sedang bermain dengan x86 Assember untuk meningkatkan kemahiran pengaturcaraan tahap rendah saya. Saya sedang menghadapi masalah kecil dengan skema pengalamatan dalam mod terlindung 32-bit.

Keadaannya begini:

Saya mempunyai program yang dimuatkan pada 0x7e0 yang menukar CPU ke mod yang dilindungi dan melompat ke tanda yang sesuai dalam kod:

[...] kod untuk menukar CPU dalam Mod Terlindung [...] jmp ProtectedMode [...] bit 32 ProtectedMode: .halt: hlt jmp .halt

Setakat ini semuanya berfungsi dengan baik. "Jmp ProtectedMode" berfungsi tanpa lompat jauh yang jelas untuk mengosongkan baris gilir prefetch, kerana program ini dimuatkan pada offset 0 (org 0 pada permulaan), memaksa segmen kod untuk menghala ke tempat yang betul.

Masalah semasa saya ialah dalam pintasan "ProtectedMode" saya ingin pergi ke program lain yang dimuatkan dari 0x8000 (saya menguji ini dengan pembuangan memori, fungsi beban berfungsi dengan betul dan program dimuatkan dengan betul sehingga 0x8000).

Memandangkan CPU kini berada dalam ProtectedMode dan bukannya RealMode, skema pengalamatan adalah berbeza. ProtectedMode menggunakan deskriptor untuk mencari alamat asas dan had dalam jadual deskriptor untuk menambah offset yang diberikan dan mendapatkan alamat fizikal (seperti yang saya fahami). Oleh itu, GDT perlu dipasang sebelum ProtectedMode boleh dimasukkan.

Milik saya kelihatan seperti ini:

%ifndef __GDT_INC_INCLUDED__ %define __GDT_INC_INCLUDED__ ;********************************* ;* Jadual Deskriptor Global (GDT) * ; ********************************* NULL_DESC: dd 0 ; null deskriptor dd 0 CODE_DESC: dw 0xFFFF ; had rendah dw 0 ; asas rendah db 0 ; asas tengah db 10011010b ; capaian db 11001111b; kebutiran db 0 ; asas DATA_DESC tinggi: dw 0xFFFF ; deskriptor data dw 0 ; had rendah db 0 ; asas rendah db 10010010b ; capaian db 11001111b; kebutiran db 0 ; asas tinggi gdtr: Had dw 24 ; panjang GDT Base dd NULL_DESC ; asas GDT %endif ;__GDT_INC_INCLUDED__

dan dimuatkan ke dalam daftar GDT melalui

Lgdt

Apa yang saya masih belum faham ialah bagaimana saya sekarang pergi ke alamat fizikal 0x8000 dalam ProtectedMode menggunakan GDT?

Fikiran pertama saya adalah untuk memilih deskriptor kod (CODE_DESC) yang sepatutnya menunjuk kepada 0x7e00 (program semasa telah dimuatkan) dan menggunakan offset yang diperlukan untuk mendapatkan 0x8000 (512 bait), menghasilkan arahan lompat:

Jmp CODE_DESC:0x200

Tetapi ia tidak berfungsi.

Jmp 0x7e0:0x200

tidak berfungsi juga...

Adakah anda mempunyai sebarang idea apa yang saya hilang di sini? Saya mungkin terlepas sesuatu yang penting tentang skema pengalamatan ProtectedMode 32-bit dan penggunaan GDT.

Kod penuh:

Bit 16 org 0 ; dimuatkan dengan offset 0000 (phys addr: 0x7e00) jmp Mula Mula: xor ax, ax mov ax, cs mov ds, ax ; kemas kini segmen data cli ; sampukan jelas lgdt; muatkan GDT daripada GDTR (lihat gdt_32.inc) panggil OpenA20Gate ; buka panggilan gerbang A20 EnablePMode ; melompat ke ProtectedMode ;****************** ;* Membuka Pintu A20 * ;******************** OpenA20Gate: dalam al, 0x93 ; tukar get A20 melalui port A20 cepat 92 atau al, 2 ; set A20 Gate bit 1 dan al, ~1 ; kosongkan INIT_NOW bit out 0x92, al ret ;************************** ;* Mendayakan Mod Dilindungi * ;******** ****************** EnablePMode: mov eax, cr0 atau eax, 1 mov cr0, eax jmp ProtectedMode ; ini berfungsi (melompat ke label dan berhenti) ;jmp (CODE_DESC-NULL_DESC):ProtectedMode ; => tidak berfungsi ;jmp 08h:ProtectedMode , => tidak berfungsi ;************** ;* medan data * ;* &termasuk * ;******** ******* %include "gdt_32.inc" ;****************** ;* Mod Dilindungi * ;************** * ******* bit 32 ProtectedMode: ;di sini saya mahu melompat ke physical addr 0x8000 (elf64 asm program) .halt: hlt jmp .halt

11