ما هو الوضع المحمي وماذا يأتي معه؟ تحويل معالجات Intel إلى الوضع المحمي التبديل إلى الوضع المحمي للمجمع

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

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

حول FPZP، UFP DPVBCHMSEFUS CH TEBMSHOPN TETSYNE حول RTPGEUUPTBBI، LPFPTSHCHE RPDDETSYCHBAF 32-VYFOSCHK BDTEU (i386 Y CHCHYE) - DPVBCHMSAFUS OPCHSHHE TEZYUFTSHCH، CHETOEEE TBU YTSAFUS UVBTSCHE: EAX، EBX EC، ​​X، EDX، ESP، EBP، EIP، ESI، EDI، الأعلام. lBL NPTsOP DPZBDBFSHUS, LFP 32-VYFOSCH CHETUY PVSHYUOSCHI TEZYUFTPCH TEBMSHOPZP TETSINB (LYNEOY TEZYUFTB DPVBCHMSEFUS RTYUFBCHLB "E"). Chue 32-in-in- Chief Tezyufts LTPNE EIP DPUFHROSHSHEN TBMShopn TETCNEN، OP FLPN UMHUB VHDHF KOBNBFSh حوالي 1 VBKF VPMSHYY (L ON DPVBCHMSEFUS UREGYBMSHSHSHKOK). حول RTPGEUUPTE NMPPTSE 286 FY LPNBODSCH VHDHF OELPTTELFOSCH. nsch NPTsEN, OBRTYNET, OBRYUBFSH mov eax, 0x12345678 Y RPUME bfpzp h AX VHDEF 0x5678, RPFPNH YuFP ON LBL VSH SCHMSEFUS "PLOPN" h NMBDIKHA YUBUFSH TEZYUFTB EAX (BOBMPZYUOP, AL NMBDIBS YBUFSH AX). TEZYUFTB-PFPVTBTSEOYS UFBTYEK YUBUFY 32-VYFOSCHI TEZYUFTPC OE UHEEUFCHHEF - NPTsOP EI YYCHMEYUSH FPMSHLP U RPNPESH BTYZHNEFYLY (OBRTYNET، UDCHOHFSH EAX حوالي 16 VYF BChP U RPNPESHA shr eax، 16 ، 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 حول FP, YuFP TB ЪTSDOPUFSH CH DCHB TBBB VPMSHYE, CH ЪBEEYEЈOOPN TETSYNE VSCHUFTEE CHSHRPMOSAFUS Y ЪBOINBAF NEOSHIE NEUFB YNEOOOP LPNBODSCH 32 - فيفوبك بتيزهنفيلي.

fBLCE, FERTSH KH OBU O 2 UEZNEOFOSCHI TEZYUFTB VPMSHYE - GS Y FS. tBVPFB U OYNY RPMOPUFSHHA BOBMPZYUOB DS Y ES Y CHSH NPTSEFE YI UCHPVPDOP YURPMSHЪPCHBFSH CH TEBMSHOPN TETSINE. PFMYUYE FPMSHLP CH FPN، YuFP OILBLYE LPNBODSCH YI SCHOPE RPDTBHNECHBAF (DS YURPMSH'HEFUS RP KHNPMYUBOYA RTBLFYUEULY CHUENY LPNBODBNY Y OELPFPTSHNY UFTPLPCCHNY PR TBGYSNY، ES OELPFPTSHNY UFTPLPCCHNY PRTBGYSNY) وOBDP SCHOP خلبيشبفسش، YUFP CHSH IPFYFE PVTBEBFSHUS YUETE OYI. oBRTYNET، mov ax، .

rPNYNP bFPZP TBUYYTEOYS TEZYUFTPC، DPVBCHMSAFUS OPCHCCHHE HRTBCHMSAEYE TEZYUFTSH (TBOSHYE CHMYSM حول TETSYN TBVPFSH RTPGEUUPTB FPMSHLP FLAGS) - CR0 و CR2 و CR3 و 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. غناء 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 ABOUT DCHB FIRB - UEZNEOFSH LPDB Y UEZNEOFSH DBOOSCHI (ABOUT 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 ЪBZTHTSBFSH MAVSCHE UEZNEOFSH - LBL DBOSHI F BL Y LPDB . chBTSOBS TBJOYGB CH FPN، YuFP UEZNEOF LPDB NPTsOP FPMSHLP YUYFBFSH Y YURPMOSFSH، B UEZNEOF DBOOSHI FPMSHLP YUYFBFSH Y RYUBFSH. l UYUBUFSHA، UEZNEOFSH NPZKhF RETELTSHCHBFSHUS CH RBNSFY، RPFPNH NPTsOP UPJDBFSH DCHB DEULTYRFPTB، UUSCHMBAEYEUS ABOUT PDYO Y FPF TSE TEZYPO RBNSFY، OP PDYO YY UDEMB FSH YURPMOSENSHCHN، B DTHZPK DPUFK HROSCHN DMS ЪBRYUY.

oEUNPFTS حول RPDDETSLH UEZNEOFBGYY، POB UYFBEFUS KHUFBTECHYEK. OH Windows، OH Linux OE YURPMSHJHAF EЈ CH RPMOPC NETE، B حول 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Ъ LPFPTSHCHK BDTEU 0، B TBNET 4 نجوم BMSHOSCHK TBNET BDTEUKHENPK RBNSFY CH 32-VYFOPN TETSYNE). h FBLPN UMKHYUBE ZPCHPTSF، YuFP NSCH CHLMAYUYUMY TETSYN MYOEKOSCHI BDTEUPCH - UNEEOOYE UPPFCHEFUFCHHEF ZHJYYUEULPNH BDTEUKH. lFP PYUEOSH HDPVOP Y S RPKDH RP FPNH TSE RKhFY. OE UMEDHEF RSCHFBFSHUS YURPMSHЪPCHBFSH UEZNEOFBGYA CH UPEC PRETBGYPOOPK UYUFENE - LFP UYMSHOP HUMPTSOSEF LPD SDTB, SJSCHLY CHSHUPLPZP KhTPCHOS (OBRTYNET, u YMY u++) OE RPDDET TSYCHBAF UEZNEOFBGYA (FP EUFSH CHCH UNPTSEFE RPMOPGEOOOP RTPZTBNNNYTPCHBFSH FPMSHLP حول المجمع) Y، OBLPOEG، CHCH OE UNPTSEFE RETEOUFY UYUFENKH حول DTHZHA BTIIFELFHTH، RPFPNKH YuFP x86 EDYOUFCHEOOBS، LPFPTBS KHNEEF LFPF NEIBOYN (Y FP، CH 64-VYFOPN TETSYNE RPMS VBCHPZP BDTEUB Y TBNETB UEZNEOFB YZOPTYTHAFUS، B YURPMSH'HEFUS MYYSH YOZHPTNBGY SP RTBCHBI DPUFHRB).

lBL S HCE ULBBM، FBVMYGB DEULTYRFPTPCH UEZNEOFPCH ZHTNYTHHEFUS UBNPK PRETBGYPOOPK UYUFENPK. YuFPVSH KHLBBBFSH RTPGEUUPTH, ZDE POB OBIPDFUS YURPMSH'HEFUS UREGYBMSHOBS LPNBODB - lgdt (تحميل جدول الواصف العالمي). pOB RTOYNBEF 6-VBKFPCHHA RETENEOOKHA CH RBNSFY. RETCCHHE EЈ 16 VYF UPDETSBF TBNET FBVMYGSHCH VBKFBI (FBLYN PVTBBBPN, NBLUINBMSHOPE LPMYUUEUFCHP DEULTYRFPTPCH - 65536 / 8 = 8192)، RPUMEDHAEYE 32 VYFB - VB ЪПЧШЧК MYOEKOSHCHK BDTEU CH RBNSFY UBNPK FBVMYGSHCH (FP EUFSH VEЪ HYuЈFB CHUEI UEZNEOFPCH). yNEEF UNSHUM CHSTTBCHOSFSH OBYUBMP FBVMYGSHCH ABOUT 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 حول 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 nopzpъbdbuobs pu). LPD YURPMOSEFUS U PRTEDEMIOOSCHN خبتتشوين ريتشيميزيك. h x86 YI GEMSHCHI 4 YFHLY - PF 0 DP 3. oKHMECHPK HTPCHEOSH UBNSCHK RTYCHYMEZYTPCHBOOSCHK (NPTSEF CHSHPRMOSFSH MAVSHCH LPNBODSCH Y NEOSFSH TETSYNSCH TBVPFSH RTPGEUUPTB)، FTEFYK UBNSHCHK "VE "URTBCHOSCHK." lBL Y CH UMKHYUBE U UEZNEOFBGYEK, TBTBVPFYUYLY x86 RETEVPTEYMY U ZHKHOLGYPOBMPN Y CHUE PU YURPMSHJHAF MYYSH DCHB HTPCHOS YYUEFSHCHTI CHPNPTSOSCHI, B DTHZIE BTIYFELF HTSCH RTPGEUUPTB RPDDETSYCHBAF FPMSHLP YI. x LBTSDPZP UEZNEOFB CH EZP DEULTYRFPTE KHLBBO DPL (مستوى امتياز الواصف)- HTPCHEOSH DPUFHRB OEPVIPDYNSCHK DMS DBOOZP UEZNEOFB. OERTYCHYMEZYTPCHBOOSCHK LPD OE NPTsEF RPMKHYUFSH DPUFHR L UEZNEOFKH U HTPCHOEN DPUFKHRB 0, B RTYCHYMEZYTPCHBOOSCHK LPD NPTsEF RPMKHYUFSH DPUFHR LP CHUEN UEZNEOFBN.

UEMELFPT UEZNEOFB، LPFPTSCHK UPDETSYFUS CH UEZNEOFOPN TEZYUFTE، SCHMSEFUS OE RTPUFP OPNETPN BMENEOFB CH FBVMYGE، OP Y KHLBBBFEMEN HTPCHOS DPUFHRB - NMBDYE 2 VYFB BF HTPCHEOSH RTYCHYMEZYK (PF 0 DP 3 ) ، B HCE UFBTYE OPNET UBNPK FBVMYGSHCH. fBLYN PVTBBN UEMELFPT = (YODELU_DEULTYRFPTB shl 2) + RPL. ربل- مستوى الامتياز المطلوب - ЪBRTBYCHBENSCHK HTPCHEOSH RTYCHYMEZYK. rTY LFPN RPL DPMTSEO VSHFSH VPMSHYE YMY TBCHEO NBLUINBMSHOPNH YЪ DPL Y CPL (مستوى الامتياز الحالي). CPL TBCHEO RPL UEMELFPTB CH CS. fBLYN PVTBBBPN LPD OE NPTSEF RPMKHYUFSH DPUFKHRB L UEZNEOFBN, KH LPFPTSCHI KHTPCHEOSH DPUFKHRB CH YUYUMPCHPN CHYDE OITSE, YUEN X OEZP UBNPZP. s، CHETPSFOP، PRYUBM DPUFBFPYuOP ЪBRKHFBOOP، OP CHRPMOE NPTsOP PVPKFYUSH RPL = DPL, LBL NSCH Y RPUFHRIN.

rPLB NSCH RYYEN FPMSHLP SDTP، NSCH VHDEN TBVPFBFSH CH OHMECHPN LPMSHGE ЪBEIFSH (FBL EEЈ OBSCHCHBAF KhTPCHOY RTYCHYMEZYK)، YUFPVSH YNEFSH RPMOSCHHK DPUFHR L BRRBTBFKHTE.

UEZNEOFBGYS OBNOE OHTSOB, RPPFPNH S OE VHDH PUFBOBCHMYCHBFSHUS RPLB UFP حول ZHTNBFE DEULTYRFPTB, B DBN ZPFPCHSCHHE 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 أو eax, 1 mov cr0, eax ; RETEKDEN حوالي 32-VYFOSHCHK LPD jmp 8:start32; fBVMYGB DEULTYRFPTPCH UEZNEOFPPCH DMS 32-VYFOPZP SDTB محاذاة 16 gdt32: dq 0 ; NULL - 0 دق 0x00CF9A000000FFFF ; الكود - 8 دق 0x00CF92000000FFFF ; البيانات - 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 حول BLTB mov byte، "!" ; ББЧТЭТІІе jmp $

ьFPF LPD UMEDHEF DPRYUBFSH L OBYENH OBYUBMSHOPNH ЪBZTHYUYLH.

RETED RETEIPPDPN CH ЪBEEYEOOSHK TETSYN OEPVIPDYNP ЪBRTEFIFSH RTYEN BRRBTBFOSCHI RTETSCHCHBOYK (LMBCHYBFKHTB، NSHCHYSH، FBKNET Y DTHZIE KHUFTPKUFCHB)، RPFPNH YuFP BIOS RPUM RETEIPDB PUFBЈFUS OE X DEM، B UCHPY TBVPFYUYLY NSCH EEЈ OE OBRYUBMY, RPFPNKH RETCHPE TSE RTETSCHCHBOIE PVTKHYYF UYUFENKH.

oERPUTEDUFCHOOOP RETEIPD CH ЪBEEYEЈOOOSCHK TETSYN PUHEEUFCHMSEF KHUFBOPCHLB OHMECHPZP VYFB CH CR0. ynEOOP LFP NSCH Y DEMBEN (RTSNPK DPUFHR L CR0,2,3,4 OECHPNPTSEO FBL TSE LBL Y LUEZNEOFOSCHN TEZYUFTBN, RPFPNH YURPMSHJKHEN EAX). oEUNPFTS حول FP، YuFP NSCH HCE RETEYMY CH ЪBEEYEOOOSCHK TETSYN، LPD RTDPDPMTSBEF YURPMOSFSHUS RP-RTETSOENH 16-VYFOSHCHK. dMS PLPOYUBFEMSHOPZP RETEIPDB OBN OHTSOP PVOPCHYFSH UPDETSYNPE UEZNEOFOSCHI TEZYUFTPC. DYTELFYCHB BUUENVMETB use32 ZPCHPTYF ENKH, YuFP DBMSHOEKYK LPD CHSHRPMOSEFUS CH ЪBEEYEOOOPN TETSINE Y OEPVIPDYNP RETELMAYUFSHUS CH TETSIN ZEOETBGYY LPNBOD DMS OEZP, B OE 16-V YFOPZP (PO YURPMSH'HEFUS RP KHNP ميوبويا).

lPNBODB movzx TBUYYTSEF CHFPTPC 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 ЪBEEYEOOOPZP TETSYNB - NSCH PVTBEBENUS RP BVUPMAFOPNH 32-VYFOPNH BDTEUKH L CHYDEP-RBNSFY FELUFPCHPZP TETSYNB، CH SCCHPDS UYNCHPPM "!" CH RTBCHSHCHK OYTSOYK KHZPM LBOBOB (FELUFPCHSHCHK LLTBO JNEEF TBTEYOEYE 80 x 25 UYNCHPMPCH، LBTSDSCHK UYNCHPM ЪBOYNBEF CH RBNSFY DCHB VBKFB - LPD UYNCHPMB Y EZP BFTYVKhFSH G CHEFB).

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

h OBYEN boot.cfg LPNBODH S64 RPLB ЪBNEOYN حول S32. FERETSH، EUMY CHU CHU RTBCHYMSHOP UDEMBMY، OBY ЪBZTHYUYL VKhDEF ЪBCHETYBFSH UCHPA TBVPFKH CHCHCHPDPN CHPULMYGBFEMSHOPZP OBBLB CH KHZPM LBOB YЪ ЪBEEYEOOZP TETSY NB. bFP FPMSHLP OBYBMP. nsch OBLPOEG-FP RTBLFYUEULY KHYMY YY TEBMSHOPZP TETSYNB (حول UBNPN DEM FBN EEЈ PUFBMPUSH OENOPZP DEM) CH ЪBEEYEЈOOSHCHK. rPULPMSHLH OBZTHYUYL CHSHRPMOSEFUS CH OHMECHPN UEZNEOFE TEBMSHOPZP TETSINB، CHUE UNEEEOYS UPPFCHEFUFCHHAF ZHIJYUEULYN BDTEUBN Y RTY RETEEIPDE CH ЪBEEYOOOSCHK TE TsYN، OBN O RTYYMPUSH OYUEZP RETEUUYFSHCH بفش.

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. حول 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 التمهيد ; ъБЗПМПЧПЛ ListFS محاذاة 4 fs_magic dd ? fs_version د؟ fs_flags د؟ fs_base دق؟ fs_size دق؟ fs_map_base دق؟ fs_map_size دق؟ fs_first_file دق؟ fs_uid دق؟ fs_block_size ي د؟ ; ъБЗПМПЧПЛ ЖБКМБ Virtual at 0x800 f_info: f_name rb 256 f_next dq ? f_prev دقة ؟ f_parent دق؟ f_flags دق؟ f_data دق؟ f_size دق؟ f_ctime دق؟ f_mtime دق؟ f_atime دي كيو؟ النهاية الافتراضية ; dBOOSHE OBYUBMSHOPZP ЪБЗТХЪУЛБ، قم بتسمية كلمة Sector_per_track عند $$، قم بتسمية head_count بايت عند $$ + 2 بايت تسمية disk_id عند $$ + 3 reboot_msg db "اضغط على أي مفتاح..."،13،10،0 boot_file_name db "boot.bin"،0 ; hCHCHPD UFTPLAY DS:SI حول BLTB write_str: Push si mov ah, 0x0E @: lodsb test al, al jz @f int 0x10 jmp @b @: pop si ret ; خطأ lTYFYUEULBS PYYVLB: استدعاء pop si 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:DIload_sector: دفع dx إضافة الفأس، كلمة adc dx، كلمة cmp بايت، 0xFF je .use_EDD دفع bx cx si div mov cl، dl inc cl div mov dh، ah mov ch، al mov 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 .خطأ: خطأ في الاتصال db "خطأ في القرص"،13,10 ,0 @: pop si cx bx dx ret .use_EDD: دفع 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: خطأ في الاتصال db "لم يتم العثور عليه"، 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 . البوب ​​دي dx cx ريت ; ъБЗТХЛБ FELHEEZP ZHBKMB CH RBNSFSH RP BDTEUKH BX:0. lPMYUEUFCHP ЪБЗТХЦЕОШИ UELFPTPCH CHPCHTBEBEFUS CH AX Load_file_data: دفع bx cx dx si di mov ax، word mov dx، word .load_list: cmp ax، -1 jne @f cmp dx، -1 jne @f .file_end: pop di si dx cx mov 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 callload_sector add bx, 0x200 / 16 pop es حلقة .load_sector lodsw mov dx, jmp .load_list ; التمهيد fPULB CHIPDB CH OBYUBMSHOSHCHK ЪBZTHYUYL: ; oBUFTPYN UEZNEOFOSHE TEZYUFTSH jmp 0:@f @: mov ax, cs mov ds, axe mov es, ax ; oBUFTPYN UFEL mov ss, axe mov sp, $$ ; TBTEYIN RTETSCHCHBOYS sti؛ ъBRPNOYN OPNET ЪБЗТХЪПУОПЗП ДИУЛБ mov, dl; prtedemyn RBTBNEFTSH ЪБЗТХЪПУОПЗП mov ah, 0x41 mov bx, 0x55AA int 0x13 jc @f mov byte, 0xFF jmp .disk_detected @: mov ah, 0x08 xor di, di Push es int 0x13 pop es شركة جي سي دي إتش موف، دي إتش آند سي إكس، 111111 بي mov , cx .disk_detected: ; ъБЗТХЪН РТПДПМЦЭОЕ ОБИБМШОПЗП ъБЗТХЪУЛБ mov si, boot_file_name mov ax, word mov dx, Word call find_file mov bx, 0x7E00 / 16 call Load_file_data ; RETEIPDYN حول RTPDPMCEOYE jmp boot2; rKHUFPE RTPUFTBOUFCHP Y UYZOBFKHTB rb 510 - ($ - $$) ديسيبل 0x55.0xAA؛ dPRPMOYFEMSHOSH DBOOSH ЪБЗТХЪУЛБload_msg_preffix db "Loading ""،0load_msg_suffix db "". .."،0 ok_msg db "OK"،13,10,0 config_file_name db "boot.cfg",0 start16_msg db "بدء تشغيل kernel 16 بت..."،13,10,0 start32_msg db "بدء تشغيل kernel 32 بت. .."،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, 0 mov ax، si pop si ret ؛ ix call write_str pop si Push si bp mov dx، word mov ax، word @: دفع ax call Split_file_name mov bp، ax pop ax call find_file test byte، 1 jz @f mov si، bp mov dx ، كلمة mov ax، كلمة jmp @b @: استدعاء Load_file_data mov si، ok_msg call write_str pop bp si ret؛ 000 / 16 callload_file ; .config_end cmp al، 10 je .run_command cmp al، 13 je .run_command jmp .parse_char .run_command: mov byte، 0 xchg dx، si cmp byte، 0 je .parse_line ؛ rHUFBS UFTPLB cmp بايت، "#" je .parse_line ; lPNNEOFBTYK cmp بايت، "L" هو .load_file ; ъБЗТХЛБ ЖБКМБ cmp بايت، "S" je .start ; ÊBRHUL SDTB; oEYCHEUFOBS LPNBODB mov al, mov [.cmd], al استدعاء خطأ db "أمر برنامج تشغيل غير معروف "" .cmd db ? db ""!",13,10,0 .config_end: ; rTY RTBCHYMSHOPN LPOZHYZHTBGYPOOPN ZHBKME NSCH OE DPMTSOSCH UADB RPRBUFSH; إعادة تشغيل JMP؛ ъБЗТХЛБ ЖБКМБ.load_file: دفع dx inc si استدعاء Load_file دفع الفأس mov cx، 512 mul cx mov word، ax mov word، dx mov word، 0 mov word، 0 mov ax، bx mov cx، 16 mul cx mov word، ax mov كلمة، dx mov كلمة، 0 كلمة mov، 0 pop ax shr ax، 9 - 4 add bx، ax add bp، 16 pop dx jmp .parse_line ؛ BRHUL SDTB.start: ; rTPCHETYN, YuFP ЪBZTHTSEO IPFS VSC PDIO ZhBKM cmp bx, 0x9000 / 16 ja @f خطأ في الاتصال 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 خطأ في الاتصال db "وسيطة أمر البدء غير صالحة"،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 دفع الفأس popf Pushf pop bx cmp ax، bx je @f خطأ الاتصال db "مطلوب i386 أو أفضل"،13,10,0 @: ; ъБЗТХХЪН ЪБУУЭОЭ Ч GDTR lgdt ; ъBRTEFYN RTETSCHCHBOYS cli; RETEKDEN CH ЪBEEYEЈOOOSCHK TETSYN mov eax, cr0 أو eax, 1 mov cr0, eax ; RETEKDEN حوالي 32-VYFOSHCHK LPD jmp 8:start32; fBVMYGB DEULTYRFPTPCH UEZNEOFPPCH DMS 32-VYFOPZP SDTB محاذاة 16 gdt32: dq 0 ; NULL - 0 دق 0x00CF9A000000FFFF ; الكود - 8 دق 0x00CF92000000FFFF ; البيانات - 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 حول BLTB mov byte، "! " ;

من أجل كتابة نظام التشغيل، عليك أن تفهم الكثير من التفاصيل. لذلك اسمحوا لي أن أنيركم قليلاً (ولكن دعنا نتفق على أنك ستقرأ المانا بنفسك حتى يكون لديك شيء تتحدث عنه).
لأكون صادقًا، هناك الكثير من المواد الخاصة بـ PM على الإنترنت، وتحدث إيلي وبيهات قليلًا عن هذا الوضع، لكن طُلب مني وصفه بعبارات عامة على أي حال. الآن سألخص النظرية بإيجاز (في الواقع، كتبت Intel Mana خصيصًا لهذا الغرض)، ثم سنبدأ في كتابة التعليمات البرمجية.

مقدمة إلى الوضع المحمي.
لذلك، يختلف PM بشكل كبير عن الوضع الحقيقي (RM) الذي كان مألوفًا لدى الجميع منذ أيام DOS. الآن عليك أن تعتاد على ذلك: لا توجد مقاطع ثابتة بحجم 64 كيلو بايت، ولا توجد جداول مقاطعة بحجم 1 كيلو بايت، ولا توجد عناوين أساسية للمقاطع في سجلات المقاطع، بشكل عام، عالم جديد تمامًا.
الآن تم وصف الأجزاء في جدول الواصف العالمي (GDT). يمكن أن يكون هذا الجدول في نسخة واحدة فقط. إنها بنية في الذاكرة. ليس شريحة! يمكن أن يكون موجودًا في أي مكان في الذاكرة، ولكن يتم كتابة عنوانه وحدوده في سجل GDTR. وهنا هيكلها:

يتكون الجدول نفسه من سجلات بالبنية التالية (بالمناسبة، السجل الصفري فارغ. وهذا مهم. عند الوصول إلى الذاكرة "الموصوفة" بواسطة واصف صفر، سوف تحصل على #GP - خطأ حماية عام):
دعونا نلقي نظرة فاحصة على هذا الهيكل.

1. حد القطاع:
الغرض من هذا المجال واضح من الاسم، ولكن هناك دقة. تم دفن الكلب في الجزء G (التفاصيل).
إذا لم يتم ضبطه، فسيتم "احتساب" الذاكرة بالبايت. في هذه الحالة، يمكن أن يختلف حجم المقطع من 1 بايت إلى 1 ميغا بايت لكل حجم 1 بايت.
إذا قمنا بضبطه على 1، فسيتم تقديم معالجة ذاكرة الصفحة. بعد ذلك سنتمكن من معالجة 4 كيلو بايت إلى 4 جيجا بايت من ذاكرة الوصول العشوائي (RAM) مع تغيير الحجم بمقدار 4 كيلو بايت (حجم الصفحة). بشكل عام، يُفضل عنونة الصفحة (قارن (1 ميجا بايت + 64 كيلو بايت - 16 بايت) و4 جيجا بايت). دعونا نتحدث فقط عن معالجة الشريحة في هذا المنشور. الترحيل يستحق مناقشة منفصلة.

2. العنوان الأساسي:
نشير هنا إلى العنوان الفعلي للقاعدة.

3.نوع الحقل:
تحدد مجموعات البت نوع المقطع:

4. S (نوع الواصف):
تشير وثائق Intel إلى أنه إذا لم يتم تعيين هذا البت، فإن هذا الواصف مخصص لقطاع النظام، وإلا فهو رمز أو بيانات. نعني بالنظام LDT وTSS وInterrupt Gates وغيرهم مثلهم (المزيد عنها لاحقًا).

5. DPL (مستوى امتياز الواصف):
امتيازات الشريحة الموصوفة. الجميع يعرف الخواتم.

6. P (الجزء موجود):
إذا تم تعيين هذا البت، فإن المعالج "يعرف" أن المقطع موجود بالفعل في الذاكرة (على الرغم من أنه سيكون من الأفضل القول بأنه صالح). إذا قمت بتحميل محدد واصف مع عدم تعيين البت P في سجل المقطع، فسيحدث استثناء #NP (غير موجود). بشكل عام سأشرح معنى هذه العبارة المزخرفة بعد قليل.

7.د/ب:
يتم تفسيره بشكل مختلف لشرائح من أنواع مختلفة.
1. بالنسبة لقطاعات التعليمات البرمجية:
طول العنوان الفعال وحجم المعامل 32 أو 16 بت.
(1-32; 0-16);
2. للمكدس:
مؤشر المكدس هو 32 أو 16 بت. (1-32؛ 0-16)؛

8.ز:
يؤثر على الوحدات (البايت والصفحات) التي يتم قياس حد المقطع بها. بشكل عام، يمكن تمكين الترحيل عند الانتقال إلى PM عن طريق تعيين البت 31 من سجل CR0.

بعض مزيد من المعلومات:
نعتقد أن كلمة "عالمي" لم توضع هناك عبثا. لذلك هناك علامة أخرى. هذا صحيح، هناك أيضا جدول الواصف المحلي. يمكن أن يكون هناك مجموعة كبيرة ومتنوعة منهم. على سبيل المثال، يمكن استخدامها في تنفيذ المهام، وما إلى ذلك. و هنا LDTيشكل بالفعل شريحة! لذا اعتد على عبارات مثل "واصف شريحة جدول الواصف المحلي".

بعد أن وصفنا الجدول، نحتاج إلى تحميله في السجل GDTR. لا يتم ذلك بواسطة mov. GDTRتم ملؤها بواسطة الأمر كلمة lgdt (القيمة). أي أنك تحتاج إلى إنشاء هذا الهيكل بنفسك وتحميله في السجل المذكور أعلاه. لا تزال هناك فرق تعمل بهذا السجل، لكننا نركض عبر أوروبا.

شيء اخر. في PM، لا تخزن سجلات المقاطع العناوين الأساسية للقطاعات (كما هو الحال في RM)، بل تخزن أشياء مدربة خصيصًا تسمى محددات. هيكلهم هو كما يلي:

هنا الفهرس هو الرقم الترتيبي للواصف في الجدول.
يُظهر TI مكان البحث عن الواصف (في التوقيت العالميأو LDT).

الآن بعد أن أصبحت كيفية إنشاء جدول واضحة، فلنتحدث عن كيفية الانتقال إلى PM (لاحظ أن هذا لا يمكن القيام به إلا من RM). بشكل عام... كل ما عليك فعله هو ضبط البت 0 في سجل التحكم CR0. على الرغم من أنني أكذب. تحتاج أولاً إلى تعطيل جميع المقاطعات ( نمي (انقطاعات غير قابلة للإخفاء) بما في ذلك)، افتح سطر العنوان أ20(بحيث تتوفر معالجة 32 بت)، قم بالتنزيل GDTR، واقفز على العلامة - ابدأ.

دعونا نستخدم المُحمل (يمكنك استخدام KOLIBRI)، والذي سيقوم بتحميل الكود الخاص بنا إلى العنوان 1000h:0 (عنوان RM، كما ألاحظ).
هنا، لن يكون كل شيء سلسًا كما هو الحال في تلك العناصر عند التبديل إلى PM مباشرةً من أداة تحميل التشغيل. كل شيء أكثر تعقيدًا بعض الشيء. لكن أولاً، دعونا نلقي نظرة على الكود الذي سيقوم محمل الإقلاع بتحميله (نكتب كل شيء على FASM. هذا نوع من helloworld، نذهب إلى PM ونطبع التحية).

تنسيق ثنائي
اكسور الفأس، الفأس
cli ؛ إعادة تهيئة سجلات القطاع
موف سس، الفأس
xor sp,sp
sti
حركة الفأس،3
كثافة العمليات 10H

Jmp 1000h:r_start

Mov ax,1000h;إعادة تكوين السجلات
موف س، الفأس
التحرك وفاق، الفأس

في آل، 0x92؛ تمكين A20
أو آل، 2
خارج 0x92، آل

Lgdt fword؛ قم بتحميل سجل GDTR
موف إيكس، كر0
أو آل،1؛ تعيين بت 0
mov cr0,eax;قم بتشغيل PM

Jmp fword 08h:Startup32; انتقل إلى PM

محاذاة 8؛ يعالج المعالج اللوحة المحاذاة بشكل أسرع
التوقيت العالمي:
دق 0 ؛ فارغ
ديسيبل 0FFh، 0FFh، 0،0،0.9Ah، 0CFh، 0؛ كود
ديسيبل 0FFh، 0FFh، 0،0،0.92h، 0CFh، 0؛ البيانات
ديسيبل 0FFh، 0FFh، 0،80h، 0Bh، 92h، 40h، 0؛ مقطع الفيديو
تسمية GDT_SIZE بسعر $-GDT
GDTR:
dw GDT_SIZE-1
دد جي دي تي + 10000 ساعة
; تحتاج إلى كتابة عنوان 32 بت. نحن الآن في مقطع 1000h، وقاعدته 1000h * 10h (حسب العنوان الفعلي) => العنوان الفعلي لـ GDTR (العلامات!) = 10000h (العنوان الفعلي لقاعدة المقطع) + الإزاحة

افتراضيًا، الآن، في الواقع، نقوم بملء المساحة حتى نهاية المقطع
10000 ريال عماني-$;
نهاية الظاهرية
;;;;;;;;;;;;;;;;;;;;;;;دخول PM32;;;;;;;;;;;; ؛؛
use32
org $+10000h;هذا هو السبب: في PM نعمل مع المقاطع المسطحة، وإذا تركنا رمز PM قبل org، إذن؛لن يتطابق عنوان intrasegment مع العنوان المسطح. حتى هنا هو عليه.

Startup32: ؛ نقطة الدخول إلى PM
mov ax,10h ; هنا ندفع المحددات. في كثير من الأحيان (! لا تنسى الرقم التسلسلي الموجود في
mov es,ax ;table) مقطع كود المحدد - 08h. البيانات - 10 ساعات، مقطع الفيديو - 18 ساعة
موف س، الفأس
حركة خ، الفأس
موف سس، الفأس
mov esp,10000h;stack
حركة الفأس، 18 ساعة
موف جي إس، الفأس

Mov esi,hi_string ;دعونا نظهر أننا عبرنا بنجاح
طباعة المكالمة
jmp$

؛ESI - عنوان السطر
مطبعة:
com.pushad
إكسور إبكس، إبكس
mov ah,07h;attribute
يضع:
موف آل,
حركة، فأس
شركة إبكس
اختبار آل، آل
يضع jnz
com.popad
متقاعد
hi_string db "مرحبًا بك في PM يا صاح"،0

ماذا فعلنا؟ نجح المُحمل في تحميلنا على العنوان 1000h:0، ومن هناك واصلنا التنفيذ. تم تشغيله أولاً أ20، تعطيل جميع المقاطعات، وتحميلها في GDTRالقيمة المناسبة، قفزت إلى تسمية الإدخال. وألاحظ أننا قفزنا
جمب fword 08h:Startup32
أي أن 08h هو محدد واصف الكود. اعتد عليه.

الآن كيفية إطلاق هذه المعجزة. أنا شخصياً أستخدم WinImage و VirtualBox. نقوم بدفع أداة تحميل التشغيل إلى قطاع التمهيد بالقرص المرن ونضع ملف .bin في الجذر. نقوم بحفظه بصيغة .vfd، ونحدد المسار إلى صورة القرص المرن في خصائص الجهاز الظاهري، ونقوم بتشغيله ونرى النتيجة.

في العدد القادم سوف نلقي نظرة على المقاطعات، والأخطاء، والفخاخ، والإحباطات وكيفية عملها، وكيفية اكتشافها وتصحيح أخطائها. لنبدأ بالحديث عن الهندسة المعمارية.

مصدر المعلومات.
1) أود أن أعرب على الفور عن امتناني لـ Phantom_84 المعروف أيضًا باسم egos لأنه أشار إلى الطريق الصحيح وساعدني في البداية. بدونه سيكون الأمر أكثر صعوبة بالنسبة لي لمعرفة ذلك.

جميع المعالجات شركة انتل، بدءًا من i80286 وحتى آخرها، عند تشغيل مصدر الطاقة (بعد "إعادة الضبط" الأولي) فإنها تعمل في وضع العنوان الحقيقي (الوضع الحقيقي). عادةً، يتم استخدام الوضع الحقيقي إما كوضع وسيط للتبديل إلى الوضع المحمي بعد تهيئة نظام المعالجات الدقيقة، أو للتنفيذ الأسرع للبرامج المكتوبة للمعالجات الدقيقة 8086 , 80186 ، ولكن بالمقارنة 8086 , 80186 تحتوي المعالجات الدقيقة الحديثة في الوضع الحقيقي على مجموعة أوسع من التعليمات القابلة للتنفيذ والقدرة على معالجة معاملات 32 بت.
يتم تحويل المعالج إلى الوضع المحمي من الوضع الحقيقي عن طريق التحميل إلى CR0(الشكل 1) كلمات ذات قيمة واحدة للبتة PE ( تمكين الحماية). للتوافق مع برنامج 80286، يمكن أيضًا ضبط بت PE باستخدام تعليمات LMSW. قبل التبديل، يجب تهيئة جداول الواصفات الضرورية في الذاكرة IDTو التوقيت العالمي. مباشرة بعد تمكين الوضع المحمي، قام المعالج تكلفة العميل المحتمل = 0.

أرز. 1

بالنسبة لكافة المعالجات 32 بت، يوصى باتباع التسلسل التالي من الخطوات للتبديل إلى الوضع المحمي:
1. قم بتعطيل المقاطعات القابلة للإخفاء عن طريق إعادة تعيين علامة IF، وحظر حدوث المقاطعات غير القابلة للقناع باستخدام المنطق الخارجي. يجب أن يضمن رمز البرنامج خلال "الفترة الانتقالية" عدم وجود استثناءات وعدم استخدام المقاطعات البرمجية. يحدث هذا المتطلب بسبب تغيير في آلية استدعاء معالجات المقاطعة.
2. تحميل إلى GDTRالعنوان الأساسي التوقيت العالمي(تعليمات LGDT).
3. التعليمات موف كروقم بتعيين علامة PE، وإذا كانت إدارة ذاكرة الصفحة مطلوبة، فقم بعلامة PG.
4. بعد ذلك مباشرة، يتم إصدار أمر الانتقال بين المقاطع ( أحزاب اللقاء المشترك البعيدة) أو أتصل ( اتصل بعيدًا) لمسح قائمة انتظار التعليمات التي تم فك تشفيرها في الوضع الحقيقي، وإجراء تسلسل المعالج. إذا تم تمكين الترحيل، ثم رموز التعليمات موف كروو أحزاب اللقاء المشتركأو يتصليجب أن يكون في صفحة يكون عنوانها الفعلي هو نفس العنوان المنطقي (بالنسبة للكود الذي يتم نقل التحكم إليه، لا يتم فرض هذا المطلب).
5. إذا كنت تخطط لاستخدام جدول واصف محلي، فإن التعليمات إل دي تيمحدد شريحة التحميل لـ LDTإلى السجل LDTR
6. التعليمات لترتحميل محدد في سجل المهام خدمات الدعم التقنيلمهمة الوضع المحمي الأولية.
7. قم بإعادة تحميل سجلات المقاطع (باستثناء CS)، التي لا تزال محتوياتها تنتمي إلى الوضع الحقيقي، أو قم بإجراء انتقال أو استدعاء مهمة أخرى (في هذه الحالة، سيتم إعادة تحميل السجلات تلقائيًا). يتم تحميل تسجيلات المقاطع غير المستخدمة بقيمة محدد صفر.
8. التعليمات ليدتتحميل في التسجيل IDTRالعنوان والحد IDT- جداول واصفات مقاطعة الوضع المحمي.
9. السماح بمقاطعات الأجهزة القابلة للإخفاء وغير القابلة للإخفاء

توفر هذه المقالة بعض المقدمة حول تطوير البرامج التي تعمل في وضع المعالج المحمي. هنا سيتم ذكر المهام الرئيسية لأي برنامج يعمل في الوضع المحمي وسيتم تقديم حلولها. في الأساس، سيتم كتابة البرامج باللغة فاسم.

أوضاع تشغيل معالج Intel 80386

مع ظهور المعالج إنتل 80386نشأت الهندسة المعمارية IA32. لقد افترض ظهور وضع تشغيل جديد للمعالج - محمي (" وضع حماية"). للتوافق مع المعالجات السابقة في السطر إنتل 80x86وحدة المعالجة المركزية 80386 لم يبدأ على الفور في الوضع المحمي، ولكنه عمل في ما يسمى بالوضع الحقيقي (" الوضع الحقيقي"). بالإضافة إلى ذلك، يحتوي كل وضع على وضع فرعي واحد أو أكثر. دعونا نلقي نظرة عليهم.

الوضع الحقيقي

يصبح المعالج في هذا الوضع مباشرة بعد الضغط على الزر " قوة" الكمبيوتر. يتم الوصول إلى الذاكرة في الوضع الحقيقي من خلال البناء " الجزء: إزاحة"، الذي يصف العنوان المنطقي. وتتراوح قيمة المقطع، مثل الإزاحة، من 0 قبل 0FFFFh.

نظرًا لأنه لا يمكن إجراء المعالجة إلا ضمن مقطع واحد، فإن الحد الأقصى لحجم المقطع هو 64 كيلو بايت يتم حساب العنوان الفعلي، الذي تم تعيينه على ناقل عنوان المعالج، وفقًا للصيغة:

العنوان الخطي = القطعة * 16 + الإزاحة

معالجات الوضع الحقيقي 80186 و 8086 تراوحت قيمة المقطع من 0 قبل 0F000h. وبالتالي، فإن الحد الأقصى للعنوان المكشوف في ناقل العناوين هو 0FFFFh، والذي يتوافق مع (2^20)-1 ، أي. 1 ميجا بايت.

بالطبع، في البداية بدا حجم هذه الذاكرة هائلا، ولكن بمرور الوقت أصبح ميغابايت واحدا قليلا. مع ظهور المعالج 80286 أصبحت ما يسمى كتلة الذاكرة متاحة يو إم بي.، بدءًا من العنوان 0FFFFh:0010hوتنتهي بالعنوان 0FFFFh:0FFFFh(65520 بايت أكثر من ميجا بايت). الآن يمكنك إعادة تكوين نظام التشغيل مس-دوسبحيث يحتل هذه الكتلة، مما يحرر 64 كيلو بايت من ذاكرة الوصول العشوائي.

وضع حماية

يتميز هذا الوضع بتصميم معقد مقارنة بالتصميم الحقيقي. يتم تمثيل العنوان المنطقي بالبناء " محدد: إزاحة". يتراوح المحدد من 0 قبل 0FFFFh(في الواقع، هناك محددات أقل بأربع مرات - المزيد عن هذا في المقالات التالية). الإزاحة، على عكس الوضع الحقيقي، هي 32 بت، مما يسمح لك بمعالجة مقاطع بحجم 4 جيجابايت. يتم تحويل العنوان المنطقي إلى خطي وفقًا للمخطط التالي:

العنوان الخطي = قاعدة القطعة + الإزاحة

يتم بعد ذلك وضع العنوان الخطي على ناقل العناوين إذا لم يتم تمكين وضع عنونة الصفحة. وبخلاف ذلك، يتم تحويل العنوان الخطي إلى عنوان فعلي، وعندها فقط يتم وضعه على ناقل العناوين. بالإضافة إلى ذلك، يسمح لك الوضع المحمي بتنظيم الذاكرة الافتراضية، حيث يصل حجمها إلى 64 تيرابايت ويعتمد فقط على حجم القرص الصلب (على سبيل المثال، نفس ملف ترحيل الصفحات في شبابيكتنفذ الذاكرة الافتراضية). تعمل جميع أنظمة التشغيل الحديثة تقريبًا في الوضع المحمي.

الوضع الفرعي متعدد المهام للوضع المحمي

يتيح لك هذا الوضع تنظيم المهام المتعددة، أي القدرة على أداء عدة مهام في وقت واحد أو نظام متعدد المستخدمين.

الوضع الظاهري 8086

يعد هذا أيضًا وضعًا فرعيًا للوضع المحمي الذي يسمح لك بإنشاء جهاز افتراضي يعمل كما لو كان في الوضع الحقيقي، ولكنه يعمل بالفعل في الوضع المحمي.

وضع غير واقعي

هذا وضع فرعي خاص للوضع الحقيقي. المعالج في الوضع الحقيقي، ولكن يتم توجيهه إلى الذاكرة عن طريق " المحدد: إزاحة". بهذه الطريقة، تتوفر ذاكرة تزيد عن 1 ميغا بايت. وفي المستقبل، سيتم النظر في الوضع المحمي وأوضاعه الفرعية.

البرنامج الأول: التبديل إلى الوضع المحمي

يتم الانتقال إلى الوضع المحمي عن طريق ضبط البت 0 يسجل CR0. يتم الانتقال إلى الوضع الحقيقي عن طريق إعادة تعيين نفس البت الصفري. فكر في برنامج يقوم بهذه العملية (اللغة - المجمع المسطح):

استخدام16 ; يستخدم تعليمات 16 بت

ORG 100 ساعة

يبدأ:

; نحن في الوضع الحقيقي

movإياكس، CR0 ; قراءة قيمة السجل CR0
أوآل، 1 ; تعيين بت الصفر
mov CR0، إياكس ; اكتب قيمة CR0 الجديدة

; نحن في الوضع المحمي

movإياكس، CR0 ; قراءة قيمة CR0
وآل، 0FEH ; أعد تعيين البت صفر إلى 0
mov CR0، إياكس ; دعنا نذهب إلى الوضع الحقيقي

; نحن في الوضع الحقيقي

متقاعد ; اخرج من البرنامج

ومع ذلك، فإن هذا البرنامج خام تمامًا لأنه لا يمكن تنفيذ الحلقات فيه. إذا كتبت أوامر مثل hltأو jmp$، ثم عند تشغيل المقاطعة الأولى، سيتم إعادة تشغيل الكمبيوتر.

في حالتنا، يتم تشغيل الأوامر بسرعة كبيرة، ولكن من الممكن أنه في الفترة الفاصلة بين تنفيذ أي أوامر في برنامجنا، ستظل المقاطعة تعمل، مما سيؤدي إلى فشل فوري وإعادة التشغيل. لذلك عليك الاهتمام بالمقاطعات. لذلك، دعونا ننظر إلى القائمة مرة أخرى. لا يمكن أن يسمى هذا البرنامج الأول (بدلا من ذلك، سيتجاوز الصفر)، لأنه لا ينفذ الإجراءات الأساسية للتبديل إلى الوضع المحمي. للتبديل بشكل كامل إلى الوضع المحمي بأقل الإعدادات، يتعين عليك تنفيذ الخطوات التالية:

1. تحقق مما إذا كان من الممكن التبديل إلى الوضع المحمي؛

2. تهيئة الجداول الواصفة؛

3. تعطيل المقاطعات (سواء القابلة للإخفاء أو غير القابلة للإخفاء)؛

4. الخط المفتوح A20؛

5. سجلات التحكم في ذاكرة التحميل؛

7. الترحيل إلى مقطع التعليمات البرمجية 32 بت عن طريق تجاوز سجل CS.

ولكن يكفي أن يقوم البرنامج الأول بتنفيذ الخطوات 3، 4، 5. ثم لن يؤدي تكراره إلى إعادة تشغيل الكمبيوتر. دعونا ننظر في كل عمل.

تعطيل المقاطعات يمنعنا من إعادة التشغيل. تنقسم المقاطعات إلى قابلة للإخفاء وغير قابلة للإخفاء. لتعطيل المقاطعات القابلة للإخفاء، تحتاج إلى إعادة تعيين العلامة لويسجل الأعلامفريق cli، يتم تمكين المقاطعات بواسطة الأمر sti. المقاطعات غير القابلة للإخفاء محظورة بطريقة مختلفة قليلاً. هناك طريقتان للقيام بذلك: برمجة سجلات وحدة تحكم المقاطعة (ستتم مناقشة هذه الطريقة لاحقًا) أو تغيير البت السابع للمنفذ 70 ساعة: إذا تم تعيين البت، فسيتم تعطيل المقاطعات، وإذا تمت إعادة تعيين البت، فيمكن تنفيذ المقاطعات.

والآن دعونا نسأل أنفسنا ما هي وظيفة الخط أ20، فما هذا. خط أ20- واحد من 32 سطر عنوان. عندما يقوم الكمبيوتر بالتمهيد، الخط أ20مغلق. وينتج عن ذلك إنشاء عناوين ذات 20 بت (أي أن مساحة العنوان بأكملها تساوي (2^20)=1 ميغا بايت). يتم تضمين هذا لتوافق المعالج. 8086 : وبالتالي، تحاول الكتابة إلى عنوان خطي 12345678 ح، سوف نكتبها بالفعل في 00045678ح، والتي يمكن أن تؤدي إلى نتائج غير متوقعة تماما. لذلك، من أجل التشغيل الكامل لتطبيق 32 بت، يجب استخدام السطر أ20يجب أن تكون مفتوحة. يتم ذلك عن طريق ضبط البت 1 ميناء 92 ساعة، إغلاق الخط أ20- إعادة تعيين هذا الشيء.

أصبح القارئ على دراية بالفعل بالإجراء الأخير، ولا ينبغي أن يثير أسئلة فيه بعد الآن.

لذلك، دعونا نلقي نظرة على قائمة برنامجنا الأول الجديد، حيث يتم بالفعل تنفيذ دورة صغيرة. يتم تمييز الأسطر التي تمت إضافتها إلى القائمة السابقة بعلامة النجمة (*).

ORG 100 ساعة

يبدأ:

; نحن في الوضع الحقيقي

cli ;*

فيآل، 70 ساعة؛*
أوآل، 80 ساعة؛*
خارج 70 ساعة آل ;*

; فتح الخط A20

فيآل، 92 ساعة؛*
أوآل، 2؛*
خارج 92ح, آل ;*

movإياكس، CR0
أوآل، 1
mov CR0، إياكس


; حلقة مزدوجة صغيرة

movسكس، 20؛*

دورة: ؛*
movالفأس، سي إكس؛*
movمكس، 0ffffh ;*
حلقة $ ;*
movسي إكس، فأس؛*
حلقةدورة ؛*

movإياكس، CR0
وآل، 0FEH
mov CR0، إياكس

; إغلاق الخط A20

فيآل، 92 ساعة؛*
وآل، 0فد؛*
خارج 92ح, آل ;*

فيآل، 70 ساعة؛*
وآل، 7فح؛*
خارج 70 ساعة آل ;*

sti ;*

متقاعد ; أكمل البرنامج

يمكنك التأكد من أن البرنامج يعمل عن طريق تشغيل الملف القابل للتنفيذ من ملف نظيف مس-دوس. إذا خرج البرنامج بشكل صحيح، فكل شيء على ما يرام.

ومع ذلك، قد تنشأ المشاكل التالية أيضًا:

1. يتجمد الكمبيوتر";

2. تتم إعادة تشغيل الكمبيوتر.

قد يحدث هذا للأسباب التالية:

1. يتم تشغيل البرنامج في الوضع V86(الوضع الافتراضي 8086 );

2. يتم تشغيل البرنامج في الوضع المحمي أو ضمن نظام تشغيل محدد.

لذلك، قبل تشغيل أي برنامج يعمل في الوضع المحمي، يجب عليك التحقق من إمكانية استمرار البرنامج في العمل. سيتم مناقشة هذا بمزيد من التفصيل.

التحقق من إمكانية التبديل إلى الوضع المحمي

في الفصل السابق واجهنا المشكلة التالية: البرنامج لا يتعرف على أنه في الوضع المحمي أو الوضع المحمي V86مما يؤدي إلى تجميد النظام أو إعادة التشغيل. إذا حاولنا تشغيل البرنامج تحت نظام التشغيل شبابيك، الذي - التي شبابيكسوف يكتشف محاولة البرنامج للتبديل إلى الوضع المحمي ويعرض إعادة التشغيل في وضع المحاكاة مس-دوس(للمنصة 9x)، أو قم بإنهاء البرنامج بالقوة (platform NT).

لذا، للتأكد من أننا في الوضع الحقيقي بالفعل، يجب علينا إجراء العمليات التالية:

1. تحقق من البت الصفري للسجل CR0;

2. تأكد من عدم تحميل نظام التشغيل Windows.

يتم تنفيذ العملية الأولى عن طريق قراءة السجل مباشرة CR0مع مزيد من التحقق من البت صفر من السجل إياكس, فأسأو ال. إذا لم يتم تعيين البت، فنحن في الوضع الحقيقي. خلاف ذلك، يصبح تنفيذ المزيد من البرنامج لا طائل منه.

يتم تنفيذ الإجراء الثاني عن طريق استدعاء الوظيفة 1600 ساعةيقاطع 2fh. تتيح لك هذه الوظيفة الحصول على الإصدار الحالي من نظام التشغيل شبابيك. إذا بعد استدعاء الوظيفة في السجل اليحتوي على صفر، ثم لم يتم تحميل نظام التشغيل. وبخلاف ذلك، مرة أخرى، لا فائدة من مواصلة برنامجنا أكثر من ذلك.

النظر في مثال البرنامج التالي. وهو عبارة عن تعديل للبرنامج السابق، ويتم تمييز جميع التعليمات الجديدة بعلامة النجمة (*).

المنظمة 100 ساعة

يبدأ:

; إعداد سجلات القطاع

movالفأس، خدمات العملاء؛*
movس، الفأس؛*

; التحقق من أننا حقا في الوضع الحقيقي

movإياكس، CR0 ؛* تحقق من وجود صفر بت
امتحانآل، 1؛* سجل CR0
jz no_pm ;*

movآه، 09h؛* وظيفة DOS 09h
mov dx،pm_msg؛* إخراج الخط
كثافة العمليات 21 ساعة ;*
متقاعد؛* والخروج

no_pm:
; التحقق مما إذا كان البرنامج يعمل تحت نظام التشغيل Windows

movالفأس، 1600 ساعة ؛* وظيفة معدد الإرسال 1600 ساعة
كثافة العمليات 2fh ؛* المقاطعات - احصل على إصدار Windows
امتحانآل، آل ؛* إن لم يكن 0 - خطأ
jz no_windows

; عرض رسالة خطأ

movاه، 09 ح ؛*
movدي إكس، win_msg؛*
كثافة العمليات 21 ساعة ;*
متقاعد ;*

no_windows:
; نحن بالتأكيد في الوضع الحقيقي
; تعطيل المقاطعات القابلة للإخفاء

; تعطيل المقاطعات غير القابلة للإخفاء (NMI)

فيآل، 70 ح
أوآل، 80 ح
خارج 70 ساعة، آل

; فتح الخط A20

فيآل، 92 ح
أوآل، 2
خارج 92 ح، آل

; التبديل إلى الوضع المحمي

movإياكس، CR0
أوآل، 1
mov CR0، إياكس

; الآن نحن في الوضع المحمي
; حلقة مزدوجة صغيرة

movسي اكس، 20

دورة:
movالفأس، سي إكس
mov cx,0ffffh
حلقة $
movسي إكس، الفأس
حلقةدورة

; التبديل إلى الوضع الحقيقي

movإياكس، CR0
وآل، 0FEH
mov CR0، إياكس

; إغلاق الخط A20

فيآل، 92 ساعة؛*
وآل، 0فد؛*
خارج 92ح, آل ;*

; تمكين المقاطعات غير القابلة للإخفاء (NMI)

فيآل، 70 ساعة؛*
وآل، 7فح؛*
خارج 70 ساعة آل ;*

; تمكين المقاطعات القابلة للإخفاء

sti ;*

; لقد عدنا إلى الوضع الحقيقي

متقاعد ; أكمل البرنامج

; رسائل خاطئة

مساء_الرسالة: ;*
ديسيبل "خطأ: يعمل بالفعل في الوضع المحمي!$" ;*
win_msg: ;*
ديسيبل "خطأ: تم اكتشاف نظام التشغيل Microsoft Windows!$" ;*
هذا المثال أيضًا لا يُظهر بعد تنفيذ أوامر 32 بت. للقيام بذلك، يجب عليك أيضًا التعرف على المواد الموجودة في الفصل التالي. بالإضافة إلى ذلك، يحتوي المثال على العيب التالي: يتم استدعاء الوظائف دوس (كثافة العمليات 21H)، والذي بدأ بالفعل يتعارض مع استقلال برنامجنا عن نظام التشغيل مس-دوس. في المستقبل، سيتعين عليك التخلص من استخدام وظائف نظام التشغيل والتحول إلى استخدام الوظائف BIOS. لكن في الوقت الحالي يكفي أن نقتصر على هذا الرمز.

ألعب حاليًا مع x86 Assember لتحسين مهاراتي في البرمجة ذات المستوى المنخفض. أواجه حاليًا مشكلة صغيرة في نظام العنونة في الوضع المحمي 32 بت.

الوضع هو هذا:

لدي برنامج تم تحميله على 0x7e0 يقوم بتحويل وحدة المعالجة المركزية إلى الوضع المحمي وينتقل إلى العلامة المناسبة في الكود:

[...] رمز لتبديل وحدة المعالجة المركزية في الوضع المحمي [...] jmp ProtectedMode [...] بت 32 ProtectedMode: .halt: hlt jmp .halt

حتى الآن كل شيء يعمل بشكل رائع. يعمل "Jmp ProtectedMode" بدون قفزة بعيدة واضحة لمسح قائمة انتظار الجلب المسبق، حيث يتم تحميل هذا البرنامج عند الإزاحة 0 (org 0 في البداية)، مما يجبر مقطع التعليمات البرمجية على الإشارة إلى المكان الصحيح.

مشكلتي الحالية هي أنه في اختصار "ProtectedMode" أريد الانتقال إلى برنامج آخر تم تحميله من 0x8000 (لقد اختبرت ذلك باستخدام تفريغ ذاكرة، وعملت وظيفة التحميل بشكل صحيح وتم تحميل البرنامج بشكل صحيح حتى 0x8000).

نظرًا لأن وحدة المعالجة المركزية الآن في وضع ProtectedMode بدلاً من RealMode، فإن نظام العنونة مختلف. يستخدم ProtectedMode الواصفات للبحث عن العنوان الأساسي والحد في جدول الواصف لإضافة الإزاحة المحددة والحصول على العنوان الفعلي (كما أفهمه). لذلك، كان لا بد من تثبيت GDT قبل الدخول إلى الوضع المحمي.

الألغام تبدو مثل هذا:

%ifndef __GDT_INC_INCLUDED__ %define __GDT_INC_INCLUDED__ ;********************************* ;* جدول الواصف العالمي (GDT) * ; ******************************** NULL_DESC: dd 0 ; واصف فارغ dd 0 CODE_DESC: dw 0xFFFF ; الحد المنخفض dw 0 ؛ قاعدة منخفضة ديسيبل 0؛ القاعدة الوسطى ديسيبل 10011010b؛ الوصول إلى ديسيبل 11001111ب؛ التفاصيل ديسيبل 0؛ قاعدة DATA_DESC عالية: dw 0xFFFF؛ واصف البيانات dw 0 ; الحد المنخفض ديسيبل 0 ; قاعدة منخفضة ديسيبل 10010010b؛ الوصول إلى ديسيبل 11001111ب؛ التفاصيل ديسيبل 0؛ قاعدة عالية GDTR: الحد dw 24؛ طول قاعدة GDT dd NULL_DESC ؛ قاعدة GDT %endif ;__GDT_INC_INCLUDED__

وتحميلها في سجل GDT عبر

إل جي دي تي

ما لم أفهمه بعد هو كيف يمكنني الآن الانتقال إلى العنوان الفعلي 0x8000 في ProtectedMode باستخدام GDT؟

كانت أفكاري الأولى هي تحديد واصف التعليمات البرمجية (CODE_DESC) الذي يجب أن يشير إلى 0x7e00 (تم تحميل البرامج الحالية) واستخدام الإزاحة اللازمة للحصول على 0x8000 (512 بايت)، مما يؤدي إلى أمر القفز:

Jmp CODE_DESC:0x200

لكنها لا تعمل.

جمب 0x7e0:0x200

لا يعمل ايضا...

هل لديك أي فكرة عما أفتقده هنا؟ ربما فاتني شيء مهم حول نظام معالجة ProtectedMode 32 بت واستخدام GDT.

الكود الكامل:

بتات 16 منظمة 0 ; محملة بالإزاحة 0000 (phys addr: 0x7e00) jmp Start Start: xor ax, ax mov ax, cs mov ds, ax ; تحديث مقطع البيانات CLI ; مقاطعة واضحة lgdt ; قم بتحميل GDT من GDTR (انظر gdt_32.inc) اتصل بـ OpenA20Gate؛ افتح بوابة A20 واتصل بـ EnablePMode؛ ينتقل إلى الوضع المحمي ;****************** ;* يفتح بوابة A20 * ;****************** OpenA20Gate: في آل، 0x93؛ قم بتبديل بوابة A20 عبر منفذ A20 السريع 92 أو al, 2؛ تعيين بوابة A20 بت 1 و آل، ~1 ; قم بمسح INIT_NOW bit out 0x92، Al ret ;*************************** ;* تمكين الوضع المحمي * ;********* ****************** EnablePMode: mov eax، cr0 أو eax، 1 mov cr0، eax jmp ProtectedMode؛ يعمل هذا (ينتقل إلى التسمية ويتوقف) ;jmp (CODE_DESC-NULL_DESC):ProtectedMode ; => لا يعمل ;jmp 08h:ProtectedMode , => لا يعمل ;*************** ;* حقول البيانات * ;* &includes * ;********* ******* %include "gdt_32.inc" ;****************** ;* الوضع المحمي * ;************ * ******* بت 32 ProtectedMode: ؛ هنا أريد الانتقال إلى addr الفعلي 0x8000 (برنامج elf64 asm).halt: hlt jmp .halt

11