ರಕ್ಷಿತ ಮೋಡ್ ಎಂದರೇನು ಮತ್ತು ಅದನ್ನು ಏನು ತಿನ್ನಲಾಗುತ್ತದೆ. ಇಂಟೆಲ್ ಪ್ರೊಸೆಸರ್‌ಗಳನ್ನು ಸಂರಕ್ಷಿತ ಮೋಡ್‌ಗೆ ಬದಲಾಯಿಸುವುದು ಸಂರಕ್ಷಿತ ಮೋಡ್ ಅಸೆಂಬ್ಲರ್‌ಗೆ ಬದಲಾಯಿಸುವುದು

rPUME OEDEMSHOPZP RETETSHCHB CHOPCHSH NPZH PVTBPCHBFSH CHBU OPCHSHCHN CHSHCHHRHULPN UCHPEK TBUUSCHMLY.

yFBL, LBL CHSH RPNOYFE, H TEBMSHOPN TETSYNE TBVPFSCH RTPGEUUPTB OBN DPUFHREO CHUEZP MYYSH 1 NEZBVBKF BDTEUOPZP RTPUFTBOUFCHBCHSPUSHPSPUSHBSHPCHY CHUEZP MY YSH 640 LYMPVBKF). fBL LFP Y VSHMP CHP ಓದುವಿಕೆ RETCHSHCHI RTPGEUUPTPCH CHTPDE 8086, OP RPUFEREOOP PVYaЈNB PRETBFICHOPK RBNSFY UFBMP OE ICHBFBFSH. h FP TSE CHTENS FTEVPCHBMPUSH UPITBOYFSH RPMOHA PVTBFOHA UPCNEUFYNPUFSH, UFPVSCH 16-TBTSDOSCHE PRETBGYPOOSCHE UYUFENSCH CHTPDE DOS UNTPZPHOOPS UNTPZBMY. rPFPNKh VSCHM CHCHEDIO OPCHSHCHK TETSYN TBVPFSCH RPGEUUPTB - BEEYEIIOOSCHK TETSYN. rPUME RETEIPDB CH OEZP DMS BDTEUBGYY YURPMSHHEFUS OE 16, B 32 YMY DBTSE 64 VYFB, B UEZNEOFSHCH UFBTPN RPOINBOY YUYUEBAF. fBLCE DPVBCHMSAFUS BEIFOSCHE NEIBOYNSCH (YNEOOP RPFPNH BEEYIIOOSCHK TETSYN), UFPVShch SDTP ಪು VShchMP YЪPMYTPCHBOOP PF RTYMPTSEOIK Y NPZMP YNY UCHPVPDOP HRTBCHMSFSH. sFP OEVPVIPDYNP MAVPK RPMOPGEOOPK NOPZPЪBDBYuOPK UYUFENE.

obYuOЈN U FPZP, UFP DPVBCHMSEFUS CH TEBMShOPN TETSYNE ಬಗ್ಗೆ RTPGEUUPTBI, LPFPTSHCHE RPDDETSYCHBAF 32-VYFOSHCHK BDTEU (i386 Y CHCHYOPCHTEU (i386 Y CHCHYOPCHTEU) - DPVBCHYOPSHTE HETOEE TBUYTSAFUS UV BTW: EAX, EBX, ECX, EDX, ESP, EBP, EIP, ESI, EDI , EFLAGS. LBL NPTsOP DPZBDBFSHUS, LFP 32-VYFOSHCHE CHETUYY PVSCHYUOSCHI TEZYUFTCH TEBMSHOPZP TETSYNB (L YNEOY TEZYUFTB DPVBCHMSEFUS "RTYUFBCHLB"). CHUE LFY 32-VYFOSHCHE TEZYUFTSHCH LTPNE EIP DPUFKHROSCH Y CH TEBMSHOPN TETSYNE, OP CH FBLPN UMHYUBE VHDHF OBOYNBFSH OB 1 VBKF ತೇಝೈಲು). RTPGEUUPTE NPMPTS 286 FY LPNBODSCH VHDHF OELPTTELFOSCH ಬಗ್ಗೆ. nSch NPTSEN, OBRTYNET, OBRYUBFSH mov eax, 0x12345678 Y RPUME LFPZP H AX VKhDEF 0x5678, RPFPNKh UFP ಆನ್ LBL VSC SCHMSEFUS "ಪ್ಲಾಪ್ನ್ ZYYUOP, AL NMBDYBS YUBUFSH AX). TEZYUFTB-PFPVTBTSEOIS UFBTYEK YUBUFY 32-VYFOSHCHI TEZYUFTCH OE UHEEUFCHHEF - NPTsOP EЈ Y'CHMEYUSH FPMSHLP U RPNPESHHA BTYZHNEFYX, URPNPESHA BTYZHNEFYX6 VYF CHRTBCHP U RPNPESHHA shr eax, 16, FPZDB H AX VKhDEF UVBTYBS RPMPCHYOB, OP UPDETTSYNPE NMBDYYI VYF VKhDEF HFETSOP ) uFP IBTBLFETOP, CH ЪBEEIЈOOPN TETSYNE OBPVPTPF, LPNBODSCH TBVPPFSHCH U 16-VYFOSHCHNY TEZYUFTBNY (OP OE 8-VYFOSHCHNY) FTEVHFYPU , UFP TBTS DOPUFSH H DCHB TBB VPMSHIE, H ЪBEEIЈOOPN TETSYNE VSHCHUFTEE CHSHCHRPMOSAFUS Y BOYNBAF NEOSHIE NEUFB YNEOOP LPNBODSCH 32 - VYFOPC BTYZHNEFILY.

fBLCE, FERETSCH H OBU OB 2 UEZNEOFOSHCHI TEZYUFTB VPMSHIE - GS TH FS. tBVPFB ಯು ONYY RPMOPUFSHHA BOBMPZYUOB DS Y ES Y CH NPTSEFE YI UCHPPVPDOP YURPMSHЪPCHBFSH CH TEBMSHOPN TETSYNE. pFMYYUYE FPMSHLP CH FPN, UFP OILBLYE LPNBODSCH YI SCHO OE RPDTB'HNECHBAF (DS YURPMSH'HEFUS RP HNPMYUBOYA RTBLFYUEULY UP CHUENY LPCHNBBTF BGYSNY , ES OELPFPTSCHNY UFTPLPCHCHNY PRETBGYSNY) Y OBDP SCHOP HLBSCCHBFSH, UFP CHSH IPFYFE PVTBEBFSHUS YUETEI. BRIGHTNET, mov ಕೊಡಲಿ, .

rPNYNP LFPZP TBUYTEOYS TEZYUFTCH, DPVBCHMSAFUS OPCHSHCHE HRTBCHMSAEIE TEZYUFTSHCH (TBOSHIE CHMYSM TETSYN TBVPFSCH RTPGEU, FTBGEUP30 TH CR4. EUFSH Y DTHZYE (OBRTYNET, PFMBDPYUOSCHE TEZYUFTSHCH), OP POY OBU UEKYUBU OE YOFETEUKHAF. yNEOOP ಯು RPNPESHA LFYI TEZYUFTCH RTPYJCHPDYFUS RETELMAYUEOYE RTPGEUUPTB H BEEYEIOOOSCHK TETSYN Y OBUFTPKLB OPCHSCHI ZHHOLGYK CHOPUPGYK CHTPUPGYTBDTE UFTBTE. DPUFKHROSCH CH TEBMSHOPN TETSYNE ಅನ್ನು ಹಾಡಿ.

ಗಂ ЪBEEIЈOOPN TETSYNE RPOSFIE UEZNEOFB YЪNEOSEFUS. FERETSH FP OE RTPUFP VBPCHSHCHK BDTEU, B OPNET LMENEOFB (DEULTYRFPTB UEZNEOFB) CH UREGIBMSHOPK FBVMYGE. fBVMYGB DEULTYRFPTPCH UEZNEOPFCH UPDBЈFUS PRETBGYPOOPK UYUFENPK Y NPTCEF UPDETTSBFSH OEPVIPDYNPE LPMYUEUFCHP PRYUBOYK UEZNEOPPZ. LBCDShCHK LMENEOF FBVMYGSHCH BOINBEF 8 VBKF Y CH UREGIBMSHOPN ZHPTNBFE PRYUSCHCHBEF VBPCHSCHK BDTEU UEZNEOFB, TBNET, RTBCHB DPUFHRB Y FD.

DCHB FIRB ಬಗ್ಗೆ UEZNEOFSCH BEEIIIOOPZP TETSYNB DEMSFUS - UEZNEOFSC LPDB Y UEZNEOFSC DBOOSCHI (UBNPN DEME EUFSH EEI CHUSLYE TSS Y LDT, OPBOSP OPNOSY OPLBTS ಕುರಿತು). h CS NPTsOP ЪBZTHTSBFSH FPMSHLP OPNETB DEULTYRFPTPCH, PRYBOOSCHI LBL UEZNEOF LPDB, Ch PUFBMSHOSHCHE UEZNEOFOSHCHE UEZNEOFOSHCHE TEZYUFTSH NPTSOP ЪSHBZMATS OSHI, FB LY LPDB. CHBTSOBS TBOYGB CH FPN, YuFP UEZNEOF LPDB NPTsOP FPMSHLP YUYFBFSH Y YURPMOSFSH, B UEZNEOF DBOOSCHI FPMSHLP YUYFBFSH ವೈ RYUBFSH. L UYBUFSHHA, UEZNEOFSHCH NPZKhF RETELTSCHCHBFSHUS CH RBNSFY, RPFPNKh NPTSOP UPDBFSH DCHB DEULTYRFPTB, UUSCHMBEUS PDYO Y FPF CE NSFYPO UPDYPO UPEDZYPO ಬಗ್ಗೆ, PMOSENSCHN, B DTHZPK DPUFHROSCHN DMS ЪBRYUY.

RPDDETZLH UEZNEOFBGYY, POB UYUYFBEFUS HUFBTECHYEK ಕುರಿತು oEUNPFTS. ಓಹ್ ವಿಂಡೋಸ್, ಓಹ್ ಲಿನಕ್ಸ್ OE YURPMSHHAF EE H RPMOPC NO, B OB PFMYUOSCHI PF x86 BTIYFELFHTSHCH (OBRTYNET, ARM) POB CHUE PFUHFUFFCHHEF. DMS TBZTBOYUEOIS DPUFHRB ಎಲ್ RBNSFY YURPMSH'HEFUS ZPTBDDP VPMEE ZYVLYK NEIBOYN UFTBOYUOPK BDTEUBGYY, LPFPTSCHK NSC TBUUNPFTYN DBMEE. uFPVSH ವೈ K TBNET BDTEUKHENPK RBNSFY CH 32-VYFOPN TETSYNE). h FBLPN UMHYUBE ZPCHPTSF, UFP NSCH CHLMAYUYMY TETSYN MYOEKOSHCHI BDTEUPCH - UNEEOYE UPPFFCHEFUFCHHEF ZHYYYYUEULPNH BDTEUKH. FP PYUEOSH KDPVOP Y S RPKDH RP FPNKh CE RHFY. oE UMEDHEF RSHCHFBFSHUS YURPMSHЪPCHBFSH UEZNEOFBGYA CH UCHPEK PRETBGYPOOPK UYUFENE - FFP UYMSHOP HUMPTOSEF LPD SDTB, SHCHLUPLZP HTPNES, SHCHLUPLZP ಎಚ್‌ಟಿಪಿಎನ್‌ಎಸ್ UEZNEOFBGYA (FP EUFSH CHSH UNPTSEFE RPMOPGEOOP RTPZTBNNNYTPCHBFSH FPMSHLP OB ಅಸೆಂಬ್ಲರ್) UYUFENH ಬಗ್ಗೆ DTHZHA BTIYFELFHTH, RPFPNH YUFPHPHECOFEDPYCOP, x86 HNEEF LFPF NEIBOYEN (Y FP, CH 64-VYFOPN TETSYNE RPMS VBCHPZP BDTEUB Y TBNETB UEZNEOFB YZ OPTYTHAFUS, B YURPMSH'HEFUS MYSH YOZHPTNBGBS PPTNBGR).

LBL S HCE ULBBM, FBVMYGB DEULTYRFPTPCH UEZNEOPHFCH ZHPTNYTHEFUS UBNPK PRETBGYPOOPK UYUFENPC. uFPVSC HLBBFSH RPGEUUPTH, ZDE POB OBIPDIFUS YURPMSHEFUUS UREGYBMSHOBS LPNBODB - lgdt (ಲೋಡ್ ಗ್ಲೋಬಲ್ ಡಿಸ್ಕ್ರಿಪ್ಟರ್ ಟೇಬಲ್). POB RTYOYNBEF 6-VBKFPCHHA RETENEOOHA CH RBNSFY. RETCHCHE HER 16 VYF UPDETTSBF TB'NET FBVMYGSHCH CH VBKFBI (FBLYN PVTBPN, NBLUINBMSHOPE LPMYYUEUFCHP DEULTYRFPTCHP - 65536 / 2EBYPUED), - 22319 = RFBYPU SHK MYOEKOSHCHK BDTEU CH RBNSFY UBNPK FBVMMYGSCH (FP EUFSH VEHYUJFB CHUEI UEZNEOPCHCH). yNEEF UNSCHUM CHSHCHTBCHOSFSH OBYUBMP FBVMYGSHCH OB 16 VBKF, RPFPNKh YUFP LFP HMHYUYBEF ULTPUFSH DPUFHRB L EY EMENEOFBN. RETCHSHCH LMENEOF FBVMYGSCH CHUEZDB DPMTSEO VSHCHFSH TBCHEO OHMA Y MAVPE YURPMSHCHCHBOYE OHMECHPZP UEMELFPTB(MeneOF FBVMYGSCH DEULTYRFPTPCH CH UEZNEOFOPN TEZYUFTE OBSCCHCHBEFUS FBL ಬಗ್ಗೆ HLBBFEMSH) RTYCHPDYF L PYYVLE. OBYUYF VPMEE-NEOE TBVPFPPURPUPVOBS FBVMYGB DEULTYRFPTPCH DPMTSOB UPDETTSBFSH IPFS VSH FTY DEULTYRFPTTB - RHUFPK, DEULTYRFPT LPDCHOPI,

ಓಹ್ UFP EEJ UFPYF TBUULBЪBFSH, RTETSDE, YUEN NSCH RPRTPVKHEN RETEKFI CH ЪBEIEIIOOSCHK TETSYN? RPTsBMHK, EEI UFPYF HRPNSOHFSH RTP HTPCHOY DPUFHRB. LPD SDTB UYUFENSCH Y LPD RTYMPSEOYK PFDEMEOSCH DTHZ PF DTHZB U FPK GEMSHHA, YuFPVSHCH SDTP NPZMP RPMOPUFSHA HRTBCHMSFSH RTPGEUUPTPN, B RTYMPTSEOIS OISHTBV CHEDSH H O BU NOPZPЪBDBYuOBS ಪು). LPD YURPMOSEFUS U PRTEDEMIOOSCHN HTPCHOYEN RTYCHYMEZYK. h x86 YI GEMSHI 4 YFKHLY - PF 0 DP 3. ". LBL Y CH UMHYUBE U UEZNEOFBGYEK, TBTBVPFYUYLY x86 RETEVPTEYMY U ZHOLGYPOBMPN Y CHUE ಪು YURPMSHHAF MYYSH DCHB HTPCHOS YY UEFSHCHTIJI BTSYCHTIJI GEUUPTB RPDDETSYCHBAF FPMSHLP YI. x LBTsDPZP UEZNEOFB CH EZP DEULTYRFPTE HLBBO ಡಿಪಿಎಲ್ (ಡಿಸ್ಕ್ರಿಪ್ಟರ್ ಸವಲತ್ತು ಮಟ್ಟ)- HTPCHEOSH DPUFHRB OEPVIPDYNSCHK DMS DBOOPZP UEZNEOFB. oERTYCHYMEZYTPCHBOOSCHK LPD OE NPTCEF RPMHYUYFSH DPUFHR L UEZNEOPH ಯು HTPCHOYEN DPUFHRB 0, B RTYCHYMEZYTPCHBOOSCHK LPD NPTCEF RPMHYUYFSH.

UEMELFPT UEZNEOFB, LPFPTSCHK UPDETCYFUS CH UEZNEOFOPN TEZYUFTE, SCHMSEFUS OE RTPUFP OPNETPN LMENEOFB CH FBVMYGE, OP Y HLBBFEMEN HTPCHOS DPUFHTSDUPBETP RTYCHYMEZYK (PF 0 DP 3), B HCE UFBTYYE OPNET UBNPK FBVMYGSCHCH. fBLYN PVBPN UEMELFPT = (YODELU_DEULTYRFPTB shl 2) + RPL. RPL- ವಿನಂತಿಸಿದ ಸವಲತ್ತು ಮಟ್ಟ - RTY LFPN RPL DPMCEO VSCFS VPMSHY YMY TBCHEO NBLUINBMSHOPNH Ъ DPL й CPL (ಪ್ರಸ್ತುತ ಸವಲತ್ತು ಮಟ್ಟ). CPL TBCHEO RPL UEMELFPTB H CS. fBLYN PVTBBPN LPD OE NPTCEF RPMKHYuYFSH DPUFHRB L UEZNEOFBN, H LPFPTSCHI HTPCHEOSH DPUFHRB CH YUYUMPCHPN CHYDE OYCE, YUEN X OEZP UBNP. s, CHETPSFOP, PRIUBM DPUFBFPYuOP BRHFBOOP, OP CHRPMOE NPTsOP PVPKFYUSH RPL = DPL, LBL NSCH Y RPUFHRIN.

rPLB NSC RYYEN FPMSHLP SDTP, NSC VKHDEN TBVPFBFSH CH OKHMECHPN LPMShGE BEIFSHCH (FBL EEI OBSCCHBAF HTPCHOY RTYCHYMEZYK), YUFPVSH YNEFSH DNEFSH.

UEZNEOFBGYS OBN O OHTSOB, RPFPNKH S OE VKHDH PUFBOBCHMYCHBFSHUS RPLB UFP ಬಗ್ಗೆ ZHPTNBFE DEULTYRFPTB, B DBN ZPFPCHSHCHE OBBYUEOYS. eUMY YOFETEUOP, NPTSEFE RPYUYFBFSH LFH UFBFSHHA. tBUUNPFTYN RTPUFEKYYK LPD RETEIPDB CH ЪBEYEIOOSCHK TETSYN.

; bBRHUL 32-TBTSDOPZP SDTB.start32: ; chShChPDYN HCHEDPNMEOYE P BRHULE 32-VYFOPZP SDTB mov si, start32_msg ಕರೆ write_str ; bztkhjn bobyueoye h GDTR lgdt; bBRTEFYN RTETSHCHCHBOYS cli; RETEKDYN H BEEYEIIOOSCHK TEZYN mov eax, cr0 ಅಥವಾ eax, 1 mov cr0, eax ; RETEKDIN ಸುಮಾರು 32-VYFOSHK LPD jmp 8: start32 ; fBVMYGB DEULTYRFPTPCH UEZNEOPFC DMS 32-VYFOPZP SDTB align 16 gdt32: dq 0; NULL - 0 dq 0x00CF9A000000FFFF ; ಕೋಡ್ - 8dq 0x00CF92000000FFFF ; ಡೇಟಾ - 16 gdtr32: dw $ - gdt32 - 1 dd gdt32 ; 32-VYFOSHK LPD ಬಳಕೆ32 start32: ; mov eax, 16 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax movzx esp, sp ; LLTBO mov ಬೈಟ್ ಬಗ್ಗೆ WHCHCHPDYN UYNCHPM, "!" ; jmp $

FFPF LPD UMEDHEF DPRYUBFSH ಎಲ್

ಮರುಪಡೆಯಲಾದ RETEIPDPN ಎಚ್ ЪBEEIOOSHK TETSYN OEPVIPDYNP BRTEFIFSH RTYYN BRRBTBFOSHCHI RTETSCHCHBOIK (LMBCHYBFHTB, NSHCHYSH, FBKNET Y DTHPPUCHYE HPPUCHYE HPPUCHYE HBKNET Y TE IPDB PUFBЈFUS OE H DEM, BCHPY PVTBVPFYUYLY NSCH EEI OE OBRYUBMY, RPFPPNH RETCHPE TS RTETSHCHCHBOYE PVTKHYYF UYUFENKH.

oERPUTEDUFCHEOOP RETEIPD H ЪBEYEIIOOSCHK TETSIN PUKHEEUFCHMSEF HUFBOPCHLB OHMECHPZP VYFB H CR0. yNEOOP LFP NSCH Y DEMBEN (RTSNPC DPUFKhR L CR0,2,3,4 OECHPЪNPTSEO FBL TSE LBL Y L UEZNEOFOSHCHN TEZYUFTBN, RPFPNKh YURPMSHEKHEN EAX). oEUNPFTS OB FP, UFP NSC HCE RETEYMY CH BEEIOOSHCHK TETSIN, LPD RTPDPMTSBEF YURPMOSFSHUS RP-RTETSOENH 16-VYFOSHCHK. dms dYTELFYCHB BUUENVMETB ಬಳಕೆ32 ZPCHPTYF ENH, UFP DBMSHOEKYK LPD CHSHCHRPMOSEFUS CH ЪBEEIЈOOPN TETSYNE Y OEEPVIPDYNP RETELMAYUYFSHUS OEEPVIPDYNP RETELMAYUYFSHUS OEPVYPOODBYP 16-VYFOPZP (YURPMSHEKHEFUS RP HNPMYUBOYA ಅವರಿಂದ) .

lPNBODB movzx TBUYTSEF CHFPTPK BTZHNEOF DP RETCHPZP. h UNSHUME, YUFP YЪ 16 VYFOPZP OBBYUEOYS SP RPMHYUBEFUS 32-VYFOPE. uFBTYYE VYFSCH PVOHMSAFUS (NBMP MY, UFP FBN VSCHMP DP OBU). rTEDRPUMEDOSS LPNBODB DENPOUFTYTHEF OBN ChPЪNPTSOPUFY ЪBEIIIOOPZP TETSYNB - NSC PVTBEBENUS RP BVUPMAFOPNKH 32-VYFOPPNKH ಎಫ್‌ವೈಎಫ್‌ಪಿಎನ್‌ಎಸ್‌ಎಫ್‌ಸಿಎಫ್‌ಡಿಟಿಇಪಿಎಚ್‌ಎಲ್‌ಬಿಡಿಟಿಇ YNB, CHSHCHPDS UINCHPM "!" CH RTBCHSHCHK OYTSOYK HZPM LTBOB (FELUFPCHSCHK LLTBO YNEEF TBTEYOYE 80 x 25 Uinchpmch, LBTsdshchk Uinchpm bboynbef Ch RBNSFY DCHB ECHBVTSHBHP - ಎಫ್ ಬಿ).

NSC VPMSHIE OE NPTSEN PVTBEBFSHUS L UETCHYUBN BIOS, FERETSH RTYYMP CHTENS OBN UFBFSH RPMOPUFSHHA UBNPUFPSFEMSHOSHCHNY Y UBNYN HRTBCHMSFSH CHUENDPCHPTKHUNDPVCHPTKHUND. RETEBZTHTSBFSHUS Y TsDBFSH OBTSBFYS ಬಗ್ಗೆ LMBCHYYH NSC RPLB OE HNEEN, RPFPNKH RTPUFP BLCHYUBEN U RPNPESHA LPNBODSCH jmp $ (ಎಫ್‌ಪಿಎನ್‌ಎಚ್‌ಎಕ್ಸ್ ಎಲ್‌ಬಿಎಚ್‌ಪಿಒಎಸ್ ಬಗ್ಗೆ ಮರುಪರಿಶೀಲನೆ - UBBYKY PODNHAX).

h ಕಾಮನ್ boot.cfg LPNBODH S64 RPLB JBNEOIN OB S32. FERETSH, EUMY CHSHCHUY RTBCHYMSHOP UDEMBMY, OBY ЪBZTKHYUYL VKHDEF ЪBCHETYBFSH UCHPA TBVPFKh ChSCHCHPDPN ChPULMYGBFEMSHOPZP CHPULMYGBFEMSHOPZP CHPULMYGBFEMSHOPZP CHBOBLBMZP ಪಿ ಟೆಸಿನ್ ಬಿ. FP FPMSHLP OBUBMP. NSCH OBLPOEG-FP RTBLFYUEULY KYMY YJ TEBMSHOPZP TETSYNB (UBNPN DEME FBN EEI PUFBMPUSH OENOZP DEM ನಲ್ಲಿ) H BEEYEIOOSCHK. rPULPMSHLKH OBY ЪBZTHYuYL CHSCHRPMOSEFUS CH OHMECHPN UEZNEOFE TEBMSHOPZP TETSYNB, CHUE UNEEOIS UPPFCHEFUFCHHAF ZHYYYUEULYN BDTEUBRENTEYES YN, RTYYMPUSH OYUEZP RETEUYUYFSHCHBFSH ಅನ್ನು ನವೀಕರಿಸಿ.

h ЪBCHETEOYE CHSHCHHRULB, RPTsBMHK, DPVBCHMA RPUMEDOYK YFTYI - RTPCHETLKH, UFP RTPGEUUPT RPDDETSYCHBEF ЪBEYEIOOSCHK TETSYN. UHFSH RTPCHETLY CH FPN, UFP OE CHUE VYFSCH ಧ್ವಜಗಳು NPTsOP YЪNEOYFSH RTPZTBNNOP. FP EUFSH TEZYUFT OE UPCHUEN 16-VYFOSHCHK. OPCHSCHI RTPGEUUPTBI DPUFHROP DMS YNEOEOYS VPMSHIE VYF Y FP NPTsOP PVOBTHTSYFSH ಬಗ್ಗೆ. TBVETYFE LPD OYCE UBNY, ULBTSH FPMSHLP, UFP LPNBODB pushf RPNEEBEF TEZYUFT ZHMBZPCH H UFEL, B popf CHCHFBMLYCHBEF UPDETSYNPE UFELP PE FGPS. fBLYN PVTBYPN EZP NPTsOP NEOSFSH GEMILPN, BOE PFDEMSHOSHCHNY LPNBODBNY. CHPF RPMOSHCHK LPD OBYEZP ЪBZTKHYULB:

ಆರ್ಗ್ 0x7C00 jmp ಬೂಟ್; bZPMCHPL 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 ? ; bZPMCHPL JBKMB ವರ್ಚುವಲ್ ನಲ್ಲಿ 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 ? ಅಂತಿಮ ವಾಸ್ತವ; DBOOSH OBJUBMSHOPZP JBZTHYULB label sector_per_track word at $$ label head_count byte at $$ + 2 label disk_id byte at $$ + 3 reboot_msg db "ಯಾವುದೇ ಕೀಲಿಯನ್ನು ಒತ್ತಿ...",13,10,0 boot_file_name. db, "0boote" ; hHCHPD UFTPLY DS: SI OB LTLBO ಬರಹ_str: ಪುಶ್ si mov ah, 0x0E @: lodsb ಟೆಸ್ಟ್ ಅಲ್, ಅಲ್ jz @f int 0x10 jmp @b @: ಪಾಪ್ ಸಿ ರೆಟ್ ; lTYFYUEULBS PYVLB ದೋಷ: ಪಾಪ್ ಸಿ ಕರೆ ರೈಟ್_ಸ್ಟ್ರರ್ ; rete_bzthlb ರೀಬೂಟ್: mov si, reboot_msg ಕರೆ write_str xor ah, ah int 0x16 jmp 0xFFFF:0 ; bZTHLB UELFPTB DX:AX H WCHET ES:DI load_sector: ಪುಶ್ dx ಆಡ್ ಏಕ್ಸ್, ವರ್ಡ್ adc dx, word cmp ಬೈಟ್, 0xFF je .use_EDD ಪುಶ್ bx cx si div mov cl, dl inc cl div mov dh, al ah mov ch, al ah 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 .error: ಕರೆ ದೋಷ db "DISK ERROR",13,10 ,0 @: pop si cx bx dx ret .use_EDD: ಪುಶ್ si mov ಬೈಟ್, 0x10 mov ಬೈಟ್, 0 mov ಪದ, 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 .ದೋಷ ಪಾಪ್ si dx ret ; rPYUL JBKMB U YNEOEN DS:SI H LBFBMPZE DX:AX find_file: ಪುಶ್ 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 ಪಾಪ್ si je .found mov ax, word mov dx, word jmp . ಕಂಡುಬಂದಿದೆ: ಪಾಪ್ ಡಿ ಡಿಎಕ್ಸ್ ಸಿಎಕ್ಸ್ ರೆಟ್ ; ъBZTHЪLB FELHEEZP ZhBKMB Ch RBNSFSH RP BDTEUKh BX:0. lPMYUEUFFCHP JBZTHCEOOOSCHI UELFPTPCH CHPCHTBEBEFUS H AX load_file_data: push bx cx dx si di mov ax, word mov dx, word .load_list: cmp ax, -1 jne @xfi jneend, -1 cmp dxd v ಏಕ್ಸ್, ಬಿಎಕ್ಸ್ ಪಾಪ್ ಬಿಎಕ್ಸ್ ಸಬ್ ಏಕ್ಸ್, ಬಿಎಕ್ಸ್ ಎಸ್ಆರ್ ಆಕ್ಸ್, 9 - 4 ರೆಟ್ @: ಎಂಓವಿ ಡಿ, 0x8000 / 16 ಕರೆ ಲೋಡ್_ಸೆಕ್ಟರ್ ಮೋವಿ ಸಿ, ಡಿ ಎಂಒವಿ ಸಿಎಕ್ಸ್, 512 / 8 - 1 .ಲೋಡ್_ಸೆಕ್ಟರ್: ಲಾಡ್‌ಸ್ವ್ ಎಂಒವಿ ಡಿಎಕ್ಸ್, ಎಸ್‌ಐ, 6 ಸಿಎಮ್‌ಪಿ ಸೇರಿಸಿ 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 ; fPYULB CHIPDB CH OBYUBMSHOSHCHK ЪBZTHYUYL ಬೂಟ್: ; oBUFTPYN WEZNEOFOSHCHE TEZYUFTSH jmp 0:@f @: mov ax, cs mov ds, ax mov es, ax ; oBUFTPYN UFEL mov ss, ax mov sp, $$ ; tbteyyn rtetschchchboys Sti; bRPNOIN OPNET bZTHЪpyuopzp DYULB mov, dl; 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 jc load_sector ಮತ್ತು c1, drh1 mov 1, derhor mov , cx .disk_detected: ; bZTHJIN RTPPMTSEOYE OBJUBMSHOPZP bBZTKHJULB mov si, boot_file_name mov ax, word mov dx, word call find_file mov bx, 0x7E00 / 16 ಕರೆ load_file_data ; RTPDPMCEOJE jmp boot2 ಕುರಿತು RETEIPDYN ; rHUFPE RTPUFTBOUFCHP Y UYZOBFHTTB rb 510 - ($ - $$) db 0x55,0xAA ; dRPMYFEMSHOSHE DBOOSHE JBZTHYULB load_msg_preffix db "ಲೋಡ್ ಆಗುತ್ತಿದೆ "",0 load_msg_suffix db "". ..",0 ok_msg db "OK",13,10,0 config_file_name db "boot.cfg",0 start16_msg db "16 ಬಿಟ್ ಕರ್ನಲ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ...",13,10,0 start32_msg db "32 ಬಿಟ್ ಕರ್ನಲ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ. ..",13,10,0 ; tBVEOYE UFTPLY DS:SI RP UYNCHPMH UMEYB split_file_name: push si @: lodsb cmp al, "/" je @f test al, al jz @f jmp @b @: mov ಬೈಟ್, 0 mov ax, si ಪಾಪ್ si ret ;bZTHJLB JBKMB U YNEOEN DS:SI N VHZET BX:0.tBNET JBKMB N UELFPTBI SPCHTBEBEFUS N AX load_file: ಪುಶ್ si mov si, load_msg_str postrix ಕರೆ ಬರೆಯಿರಿ ಪ್ರತ್ಯಯ ಕರೆ ರೈಟ್_ಸ್ಟ್ರ ಪಾಪ್ ಸಿ ಪುಶ್ ಸಿ ಬಿಪಿ ಎಂಓವಿ ಡಿಎಕ್ಸ್, ವರ್ಡ್ ಮೋವ್ ಏಕ್ಸ್, ವರ್ಡ್ @: ಪುಶ್ ಆಕ್ಸ್ ಕಾಲ್ ಸ್ಪ್ಲಿಟ್_ಫೈಲ್_ನೇಮ್ ಎಂಓವಿ ಬಿಪಿ, ಏಕ್ಸ್ ಪಾಪ್ ಏಕ್ಸ್ ಕಾಲ್ ಫೈಂಡ್_ಫೈಲ್ ಟೆಸ್ಟ್ ಬೈಟ್, 1 ಜೆಜೆಎಸ್ @ಎಫ್ ಎಂಒವಿ ಸಿ, ಬಿಪಿ ಎಂಓವಿ ಡಿಎಕ್ಸ್, ವರ್ಡ್ ಮೋವ್ ಏಕ್ಸ್, ವರ್ಡ್ ಜೆಎಂಪಿ @ಬಿ @ : ಕರೆ load_file_data mov si, ok_msg ಕರೆ ರೈಟ್_ಸ್ಟ್ರರ್ ಪಾಪ್ ಬಿಪಿ ಸಿ ರೆಟ್ ; 0x1000 / 16 ಕರೆ ಲೋಡ್_ಫೈಲ್ : mov si, dx .parse_char: lodsb ಪರೀಕ್ಷೆ al, al jz .config_end cmp al, 10 je .run_command cmp al, 13 je .run_command jmp .parse_char .run_command: mov ಬೈಟ್, 0 xchg dx, si cmp ಬೈಟ್, 0 je .parse_line ; rHUFBS UFTPLB cmp ಬೈಟ್, "#" je .parse_line ; lPNNEOFBTYK cmp ಬೈಟ್, "L" je .load_file ; bZTHJLB JBKMB cmp ಬೈಟ್, "S" je .start ; bBRHUL SDTB; oEYCHEUFOBS LPNBODB mov al, mov [.cmd], ಅಲ್ ಕರೆ ದೋಷ db "ಅಜ್ಞಾತ ಬೂಟ್ ಸ್ಕ್ರಿಪ್ಟ್ ಆಜ್ಞೆ "" .cmd db ? db ""!",13,10,0 .config_end: ; rTY RTBCHYMSHOPN LPOZHYZHTBGYPOOPN ZHBKME NSC OE DPMTSOSCH UADB RPRBUFSH; jmp ರೀಬೂಟ್; load_file: ಪುಶ್ dx inc si ಕರೆ load_file push ax mov cx, 512 mul cx mov ಪದ, ಕೊಡಲಿ mov ಪದ, dx mov ಪದ, 0 mov ಪದ, 0 mov ax, bx mov cx, 16 mul cx mov ಪದ, ax mov ಪದ, dx mov ಪದ, 0 mov ಪದ, 0 ಪಾಪ್ ಏಕ್ಸ್ shr ಕೊಡಲಿ, 9 - 4 ಸೇರಿಸಿ bx, ax add bp, 16 pop dx jmp .parse_line ; bBRHUL SDTB.start: ; rTPCHETYN, UFP ЪBZTKhTSEO IPFS VSH PYO ZHBKM cmp bx, 0x9000 / 16 ja @f ಕರೆ ದೋಷ db "ಯಾವುದೇ ಕರ್ನಲ್ ಲೋಡ್ ಆಗಿಲ್ಲ",13,10,0 @: ; bBRPMOSEN RPUMEDOIK LMENEOF URYULB JBKMPCH xor ಕೊಡಲಿ, ಕೊಡಲಿ mov cx, 16 mov di, bp rep stosw; RETEIPDYN L RTPGEDHTE YOYGYBMYYBGYY SDTB DMS OHTSOPK TBTSDOPUPY inc si cmp ಪದ, "16" je .start16 cmp ಪದ, "32" je .start32 ;cmp ಪದ, "64" ;je start64 oEYCHEUFOBS TSTSDOPUFSH SDTB ಕರೆ ದೋಷ db "ಅಮಾನ್ಯವಾದ ಪ್ರಾರಂಭ ಆಜ್ಞೆ ಆರ್ಗ್ಯುಮೆಂಟ್",13,10,0 ; bBRHUL 16-TBTSDOPZP SDTB.start16: mov si, start16_msg mov bx, 0x6000 mov dl, jmp 0x9000 ; bBRHUL 32-TBTSDOPZP SDTB.start32: ; chShChPDYN HCHEDPNMEOYE P BRHULE 32-VYFOPZP SDTB mov si, start32_msg ಕರೆ write_str ; rTPCHETYN, UFP RTPGEUUPT OE IHCE i386 mov ax, 0x7202 push ax popf pushf pop bx cmp ax, bx je @f ಕರೆ ದೋಷ db "ಅಗತ್ಯವಿದೆ i386 ಅಥವಾ ಉತ್ತಮ",13,10,0 @: ; bztkhjn bobyueoye h GDTR lgdt; bBRTEFYN RTETSHCHCHBOYS cli; RETEKDYN H BEEYEIIOOSCHK TEZYN mov eax, cr0 ಅಥವಾ eax, 1 mov cr0, eax ; RETEKDIN ಸುಮಾರು 32-VYFOSHK LPD jmp 8: start32 ; fBVMYGB DEULTYRFPTPCH UEZNEOPFC DMS 32-VYFOPZP SDTB align 16 gdt32: dq 0; NULL - 0 dq 0x00CF9A000000FFFF ; ಕೋಡ್ - 8dq 0x00CF92000000FFFF ; ಡೇಟಾ - 16 gdtr32: dw $ - gdt32 - 1 dd gdt32 ; 32-VYFOSHK LPD ಬಳಕೆ32 start32: ; mov eax, 16 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax movzx esp, sp ; LLTBO mov ಬೈಟ್ ಬಗ್ಗೆ WHCHCHPDYN UYNCHPM, "! " ; 'ನಾಲ್ಕು' jmp $

OS ಅನ್ನು ಬರೆಯಲು, ನೀವು ಅನೇಕ ವಿವರಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಬೇಕು. ಇಲ್ಲಿ, ನಾನು ನಿಮಗೆ ಸ್ವಲ್ಪ ಜ್ಞಾನೋದಯ ಮಾಡುತ್ತೇನೆ (ಆದರೆ ಮನವನ್ನು ನೀವೇ ಓದುತ್ತೀರಿ ಎಂದು ಒಪ್ಪಿಕೊಳ್ಳೋಣ, ಆದ್ದರಿಂದ ಮಾತನಾಡಲು ಏನಾದರೂ ಇದೆ).
ನಿಜ ಹೇಳಬೇಕೆಂದರೆ, ನೆಟ್‌ನಲ್ಲಿ ಬಹಳಷ್ಟು PM ಸಾಮಗ್ರಿಗಳಿವೆ, ಮತ್ತು iley ಮತ್ತು pehat ಈ ಮೋಡ್‌ನ ಬಗ್ಗೆ ಸ್ವಲ್ಪ ಮಾತನಾಡಿದ್ದಾರೆ, ಆದರೆ ಅದನ್ನು ಹೇಗಾದರೂ ಸಾಮಾನ್ಯ ಪದಗಳಲ್ಲಿ ವಿವರಿಸಲು ನನ್ನನ್ನು ಕೇಳಲಾಯಿತು. ಈಗ ನಾನು ಸಂಕ್ಷಿಪ್ತವಾಗಿ ಒಂದು ಸಿದ್ಧಾಂತವನ್ನು ನೀಡುತ್ತೇನೆ (ವಾಸ್ತವವಾಗಿ, ಇಂಟೆಲ್ ಇದಕ್ಕಾಗಿ ಮನವನ್ನು ನಿರ್ದಿಷ್ಟವಾಗಿ ಬರೆದಿದೆ), ನಂತರ ನಾವು ಕೋಡ್ ಬರೆಯಲು ಪ್ರಾರಂಭಿಸುತ್ತೇವೆ.

ಸಂರಕ್ಷಿತ ಮೋಡ್‌ಗೆ ಪರಿಚಯ.
ಆದ್ದರಿಂದ, PM DOS'a ರಿಯಲ್ ಮೋಡ್ (RM) ರಿಂದ ಪರಿಚಿತವಾಗಿರುವ ಎಲ್ಲಕ್ಕಿಂತ ಗಮನಾರ್ಹವಾಗಿ ಭಿನ್ನವಾಗಿದೆ. ಈಗ ನೀವು ಅದನ್ನು ಬಳಸಿಕೊಳ್ಳಬೇಕು: ಯಾವುದೇ ಸ್ಥಿರ, 64 ಕಿಲೋಬೈಟ್ ವಿಭಾಗಗಳಿಲ್ಲ, 1 ಕಿಲೋಬೈಟ್ನಲ್ಲಿ ಅಡ್ಡಿಪಡಿಸುವ ಕೋಷ್ಟಕಗಳು, ಸೆಗ್ಮೆಂಟ್ ರೆಜಿಸ್ಟರ್ಗಳಲ್ಲಿ ಸೆಗ್ಮೆಂಟ್ ಬೇಸ್ಗಳ ವಿಳಾಸಗಳು, ಸಾಮಾನ್ಯವಾಗಿ, ಸಂಪೂರ್ಣವಾಗಿ ಹೊಸ ಪ್ರಪಂಚ.
ವಿಭಾಗಗಳನ್ನು ಈಗ ವಿವರಿಸಲಾಗಿದೆ ಗ್ಲೋಬಲ್ ಡಿಸ್ಕ್ರಿಪ್ಟರ್ ಟೇಬಲ್ (GDT). ಈ ಕೋಷ್ಟಕವು ಕೇವಲ ಒಂದು ನಿದರ್ಶನದಲ್ಲಿರಬಹುದು. ಅವಳು ನೆನಪಿನ ರಚನೆ. ಒಂದು ವಿಭಾಗವಲ್ಲ! ಇದನ್ನು ಮೆಮೊರಿಯಲ್ಲಿ ಎಲ್ಲಿ ಬೇಕಾದರೂ ಇರಿಸಬಹುದು, ಆದರೆ ಅದರ ವಿಳಾಸ ಮತ್ತು ಮಿತಿಯನ್ನು GDTR ರಿಜಿಸ್ಟರ್‌ಗೆ ಬರೆಯಲಾಗುತ್ತದೆ. ಅದರ ರಚನೆ ಇಲ್ಲಿದೆ:

ಟೇಬಲ್ ಸ್ವತಃ ಕೆಳಗಿನ ರಚನೆಯ ನಮೂದುಗಳನ್ನು ಒಳಗೊಂಡಿದೆ (ಮೂಲಕ, ಶೂನ್ಯ ನಮೂದು ಖಾಲಿಯಾಗಿದೆ. ಇದು ಮುಖ್ಯವಾಗಿದೆ. ಶೂನ್ಯ ವಿವರಣೆಯಿಂದ 'ವಿವರಿಸಿದ' ಮೆಮೊರಿಯನ್ನು ಪ್ರವೇಶಿಸುವಾಗ, #GP - ಸಾಮಾನ್ಯ ರಕ್ಷಣೆ ದೋಷವನ್ನು ಪಡೆಯಿರಿ):
ಈ ರಚನೆಯನ್ನು ಹತ್ತಿರದಿಂದ ನೋಡೋಣ.

1. ವಿಭಾಗದ ಮಿತಿ:
ಈ ಕ್ಷೇತ್ರದ ಉದ್ದೇಶವು ಹೆಸರಿನಿಂದ ಸ್ಪಷ್ಟವಾಗಿದೆ, ಆದರೆ ಒಂದು ಸೂಕ್ಷ್ಮತೆ ಇದೆ. ನಾಯಿಯನ್ನು ಜಿ (ಗ್ರ್ಯಾನ್ಯುಲಾರಿಟಿ) ಬಿಟ್‌ನಲ್ಲಿ ಹೂಳಲಾಗಿದೆ.
ಅದನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ, ಮೆಮೊರಿಯನ್ನು ಬೈಟ್‌ಗಳಲ್ಲಿ 'ಎಣಿಸಲಾಗುತ್ತದೆ'. ಅಂತಹ ಸಂದರ್ಭದಲ್ಲಿ, ವಿಭಾಗದ ಗಾತ್ರವು 1 ಬೈಟ್‌ನಿಂದ 1 ಮೆಗಾಬೈಟ್‌ಗೆ 1 ಬೈಟ್‌ಗೆ ಬದಲಾಗಬಹುದು.
ನಾವು ಅದನ್ನು 1 ಗೆ ಹೊಂದಿಸಿದರೆ, ನಂತರ ಮೆಮೊರಿ ಪೇಜಿಂಗ್ ಅನ್ನು ಪರಿಚಯಿಸಲಾಗುತ್ತದೆ. ನಂತರ ನಾವು 4 ಕಿಲೋಬೈಟ್‌ಗಳಿಂದ 4 ಗಿಗಾಬೈಟ್‌ಗಳ RAM ಅನ್ನು 4 ಕಿಲೋಬೈಟ್‌ಗಳ ಮರುಗಾತ್ರದೊಂದಿಗೆ (ಪುಟ ಗಾತ್ರ) ಪರಿಹರಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ. ಸಾಮಾನ್ಯವಾಗಿ, ಪುಟದ ವಿಳಾಸವು ಯೋಗ್ಯವಾಗಿದೆ (ಹೋಲಿಸಿ (1Mb+64Kb-16byte) ಮತ್ತು 4Gb). ಈ ಪೋಸ್ಟ್‌ನಲ್ಲಿ ವಿಭಾಗದ ವಿಳಾಸದ ಬಗ್ಗೆ ಮಾತ್ರ ಮಾತನಾಡೋಣ. ಪೇಜಿಂಗ್ ಪ್ರತ್ಯೇಕ ಚರ್ಚೆಗೆ ಅರ್ಹವಾಗಿದೆ.

2. ಮೂಲ ವಿಳಾಸ:
ಇಲ್ಲಿ ನಾವು ಬೇಸ್ನ ಭೌತಿಕ ವಿಳಾಸವನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತೇವೆ.

3. ಪ್ರಕಾರ ಕ್ಷೇತ್ರ:
ಬಿಟ್ ಸಂಯೋಜನೆಗಳು ವಿಭಾಗದ ಪ್ರಕಾರವನ್ನು ನಿರ್ಧರಿಸುತ್ತವೆ:

4. ಎಸ್ (ಡಿಸ್ಕ್ರಿಪ್ಟರ್ ಪ್ರಕಾರ):
ಇಂಟೆಲ್ ದಾಖಲಾತಿಯು ಈ ಬಿಟ್ ಅನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ, ಈ ವಿವರಣೆಯು ಸಿಸ್ಟಮ್ ವಿಭಾಗಕ್ಕೆ, ಇಲ್ಲದಿದ್ದರೆ - ಕೋಡ್ ಅಥವಾ ಡೇಟಾ ಎಂದು ಹೇಳುತ್ತದೆ. ಸಿಸ್ಟಮ್ ಎಂದರೆ ಎಲ್‌ಡಿಟಿ, ಟಿಎಸ್‌ಎಸ್, ಇಂಟರಪ್ಟ್ ಗೇಟ್ಸ್ ಮತ್ತು ಇತರವುಗಳು (ಅವುಗಳ ಬಗ್ಗೆ ನಂತರ).

5. ಡಿಪಿಎಲ್ (ಡಿಸ್ಕ್ರಿಪ್ಟರ್ ಪ್ರಿವಿಲೇಜ್ ಲೆವೆಲ್):
ವಿವರಿಸಿದ ವಿಭಾಗದ ಸವಲತ್ತುಗಳು. ಎಲ್ಲರಿಗೂ ರಿಂಗ್ಸ್ ತಿಳಿದಿದೆ.

6. ಪಿ (ಪ್ರಸ್ತುತ ವಿಭಾಗ):
ಈ ಬಿಟ್ ಅನ್ನು ಹೊಂದಿಸಿದರೆ, ಸೆಗ್ಮೆಂಟ್ ಈಗಾಗಲೇ ಮೆಮೊರಿಯಲ್ಲಿದೆ ಎಂದು ಪ್ರೊಸೆಸರ್ 'ತಿಳಿದಿದೆ' (ಆದರೂ ಮಾನ್ಯ ಎಂದು ಹೇಳುವುದು ಉತ್ತಮ). ಸೆಗ್ಮೆಂಟ್ ರಿಜಿಸ್ಟರ್‌ಗೆ ಹೊಂದಿಸದ P ಬಿಟ್‌ನೊಂದಿಗೆ ಡಿಸ್ಕ್ರಿಪ್ಟರ್ ಸೆಲೆಕ್ಟರ್ ಅನ್ನು ನೀವು ಲೋಡ್ ಮಾಡಿದರೆ, #NP (ಇಲ್ಲ) ವಿನಾಯಿತಿ ಸಂಭವಿಸುತ್ತದೆ. ಸಾಮಾನ್ಯವಾಗಿ, ಈ ಅಲಂಕೃತ ಪದಗುಚ್ಛದ ಅರ್ಥವನ್ನು ಸ್ವಲ್ಪ ಸಮಯದ ನಂತರ ವಿವರಿಸಲಾಗುವುದು.

7.ಡಿ/ಬಿ:
ವಿಭಿನ್ನ ಪ್ರಕಾರಗಳ ವಿಭಾಗಗಳಿಗೆ, ಇದನ್ನು ವಿಭಿನ್ನವಾಗಿ ಅರ್ಥೈಸಲಾಗುತ್ತದೆ.
1. ಕೋಡ್ ವಿಭಾಗಗಳಿಗಾಗಿ:
32 ಅಥವಾ 16 ಬಿಟ್ ಪರಿಣಾಮಕಾರಿ ವಿಳಾಸ ಉದ್ದ ಮತ್ತು ಒಪೆರಾಂಡ್ ಉದ್ದ.
(1-32; 0-16);
2. ಸ್ಟಾಕ್ಗಾಗಿ:
ಸ್ಟಾಕ್ ಪಾಯಿಂಟರ್ 32 ಅಥವಾ 16 ಬಿಟ್‌ಗಳು. (1-32; 0-16);

8.ಜಿ:
ಯಾವ ಘಟಕಗಳಲ್ಲಿ (ಬೈಟ್‌ಗಳು, ಪುಟಗಳು) ವಿಭಾಗದ ಮಿತಿಯನ್ನು ಅಳೆಯಲಾಗುತ್ತದೆ ಎಂಬುದರ ಪ್ರಭಾವಗಳು. ಸಾಮಾನ್ಯವಾಗಿ, CR0 ರಿಜಿಸ್ಟರ್‌ನ ಬಿಟ್ 31 ಅನ್ನು ಹೊಂದಿಸುವ ಮೂಲಕ PM ಅನ್ನು ನಮೂದಿಸುವಾಗ ಪೇಜಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬಹುದು.

ಇನ್ನೂ ಕೆಲವು ಮಾಹಿತಿ:
ಗ್ಲೋಬಲ್ ಎಂಬ ಪದವನ್ನು ವ್ಯರ್ಥವಾಗಿ ಹಾಕಲಾಗಿಲ್ಲ ಎಂದು ನಾವು ಊಹಿಸುತ್ತೇವೆ. ಆದ್ದರಿಂದ ಇನ್ನೊಂದು ಚಿಹ್ನೆ ಇದೆ. ನಿಜ, ಸಹ ಇದೆ ಸ್ಥಳೀಯ ವಿವರಣೆ ಕೋಷ್ಟಕ. ಅವುಗಳಲ್ಲಿ ಹಲವಾರು ಇರಬಹುದು. ಉದಾಹರಣೆಗೆ, ಅವುಗಳನ್ನು ಕಾರ್ಯಗಳ ಅನುಷ್ಠಾನದಲ್ಲಿ ಬಳಸಬಹುದು, ಇತ್ಯಾದಿ. ಮತ್ತು ಇಲ್ಲಿ LDTಈಗಾಗಲೇ ಒಂದು ವಿಭಾಗವನ್ನು ಪ್ರತಿನಿಧಿಸುತ್ತದೆ! ಆದ್ದರಿಂದ 'ಲೋಕಲ್ ಡಿಸ್ಕ್ರಿಪ್ಟರ್ ಟೇಬಲ್ ಸೆಗ್ಮೆಂಟ್ ಡಿಸ್ಕ್ರಿಪ್ಟರ್' ನಂತಹ ನುಡಿಗಟ್ಟುಗಳಿಗೆ ಒಗ್ಗಿಕೊಳ್ಳಿ.

ನಾವು ಟೇಬಲ್ ಅನ್ನು ವಿವರಿಸಿದ ನಂತರ, ನಾವು ಅದನ್ನು ರಿಜಿಸ್ಟರ್‌ಗೆ ಲೋಡ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ ಜಿಡಿಟಿಆರ್. ಇದನ್ನು mov ನಿಂದ ದೂರದಲ್ಲಿ ಮಾಡಲಾಗುತ್ತದೆ. ಜಿಡಿಟಿಆರ್ತಂಡದಿಂದ ತುಂಬಿದೆ ಎಲ್ಜಿಡಿಟಿ ಫೊರ್ಡ್ (ಮೌಲ್ಯ). ಅಂದರೆ, ಈ ರಚನೆಯನ್ನು ನಿಮ್ಮದೇ ಆದ ಮೇಲೆ ರೂಪಿಸಲು ಮತ್ತು ಅದನ್ನು ಮೇಲೆ ತಿಳಿಸಿದ ರಿಜಿಸ್ಟರ್‌ಗೆ ಲೋಡ್ ಮಾಡುವುದು ಅವಶ್ಯಕ. ಈ ರಿಜಿಸ್ಟರ್‌ನೊಂದಿಗೆ ಇನ್ನೂ ತಂಡಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿವೆ, ಆದರೆ ನಾವು ಯುರೋಪ್‌ನಾದ್ಯಂತ ಓಡುತ್ತಿದ್ದೇವೆ.

ಇನ್ನೂ ಒಂದು ಕ್ಷಣ. PM ನಲ್ಲಿ, ಸೆಗ್ಮೆಂಟ್ ರೆಜಿಸ್ಟರ್‌ಗಳು ವಿಭಾಗಗಳ ಮೂಲ ವಿಳಾಸಗಳನ್ನು ಸಂಗ್ರಹಿಸುವುದಿಲ್ಲ (RM ನಲ್ಲಿರುವಂತೆ), ಆದರೆ ವಿಶೇಷವಾಗಿ ತರಬೇತಿ ಪಡೆದ ತುಣುಕುಗಳನ್ನು ಕರೆಯಲಾಗುತ್ತದೆ ಆಯ್ಕೆಗಾರರು. ಅವುಗಳ ರಚನೆ ಹೀಗಿದೆ:

ಇಲ್ಲಿ ಸೂಚ್ಯಂಕವು ಕೋಷ್ಟಕದಲ್ಲಿನ ಡಿಸ್ಕ್ರಿಪ್ಟರ್‌ನ ಆರ್ಡಿನಲ್ ಸಂಖ್ಯೆಯಾಗಿದೆ.
ಡಿಸ್ಕ್ರಿಪ್ಟರ್ ಅನ್ನು ಎಲ್ಲಿ ನೋಡಬೇಕೆಂದು TI ತೋರಿಸುತ್ತದೆ (ಇನ್ GDTಅಥವಾ LDT).

ಈಗ ಟೇಬಲ್ ಅನ್ನು ಹೇಗೆ ನಿರ್ಮಿಸುವುದು ಎಂಬುದು ಈಗಾಗಲೇ ಸ್ಪಷ್ಟವಾಗಿದೆ, PM ಗೆ ಹೇಗೆ ಬದಲಾಯಿಸುವುದು ಎಂಬುದರ ಕುರಿತು ಮಾತನಾಡೋಣ (ಇದನ್ನು RM ನಿಂದ ಮಾತ್ರ ಮಾಡಬಹುದೆಂದು ನಾನು ಗಮನಿಸುತ್ತೇನೆ). ಸಾಮಾನ್ಯವಾಗಿ... ನೀವು ಮಾಡಬೇಕಾಗಿರುವುದು ನಿಯಂತ್ರಣ ರಿಜಿಸ್ಟರ್ CR0 ನ ಬಿಟ್ 0 ಅನ್ನು ಹೊಂದಿಸುವುದು. ಆದರೂ ನಾನು ಸುಳ್ಳು ಹೇಳುತ್ತಿದ್ದೇನೆ. ಮೊದಲು ನೀವು ಎಲ್ಲಾ ಅಡಚಣೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬೇಕಾಗಿದೆ ( NMI (ಮಾಸ್ಕ್ ಮಾಡಲಾಗದ ಅಡಚಣೆಗಳು) ಸೇರಿದಂತೆ), ವಿಳಾಸ ರೇಖೆಯನ್ನು ತೆರೆಯಿರಿ A20(ಆದ್ದರಿಂದ 32-ಬಿಟ್ ವಿಳಾಸ ಲಭ್ಯವಿರುತ್ತದೆ), ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ ಜಿಡಿಟಿಆರ್, ಮತ್ತು ಮಾರ್ಕ್ ಗೆ ನೆಗೆಯುವುದನ್ನು - ಪ್ರಾರಂಭಿಸಿ.

ನಾವು ಲೋಡರ್ ಅನ್ನು ಬಳಸೋಣ (ನೀವು KOLIBRI ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು), ಇದು ನಮ್ಮ ಕೋಡ್ ಅನ್ನು 1000h: 0 ವಿಳಾಸದಲ್ಲಿ ಲೋಡ್ ಮಾಡುತ್ತದೆ (RM ಗಳು, ನಾನು ಗಮನಿಸಿ, ವಿಳಾಸ).
ಇಲ್ಲಿ, ಅವರು ಬೂಟ್‌ಲೋಡರ್‌ನಿಂದ ನೇರವಾಗಿ PM ಗೆ ಬದಲಾಯಿಸಿದಾಗ, ಆ ಮನಸ್‌ನಲ್ಲಿರುವಂತೆ ಎಲ್ಲವೂ ಸುಗಮವಾಗಿರುವುದಿಲ್ಲ. ಎಲ್ಲವೂ ಸ್ವಲ್ಪ ಹೆಚ್ಚು ಸಂಕೀರ್ಣವಾಗಿದೆ. ಆದರೆ ಮೊದಲು, ಬೂಟ್‌ಲೋಡರ್ ಲೋಡ್ ಆಗುವ ಕೋಡ್ ಅನ್ನು ನೋಡೋಣ (ನಾವು ಎಲ್ಲವನ್ನೂ FASM "e ನಲ್ಲಿ ಬರೆಯುತ್ತೇವೆ) ಇದು ಒಂದು ರೀತಿಯ ಹೆಲೋವರ್ಲ್ಡ್ ಆಗಿದೆ. ನಾವು ಬೂಟ್ ಮಾಡೋಣ, PM ಗೆ ಹೋಗಿ ಮತ್ತು ಶುಭಾಶಯವನ್ನು ಮುದ್ರಿಸೋಣ. ಅದು ಇಲ್ಲಿದೆ.

ಬೈನರಿ ಸ್ವರೂಪ
ಕ್ಸೋರಾಕ್ಸ್, ಕೊಡಲಿ
cli ; ವಿಭಾಗ ರೆಜಿಸ್ಟರ್‌ಗಳನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ
mov ss, ಕೊಡಲಿ
xorsp,sp
sti
movax,3
ಇಂಟ್ 10 ಗಂ

Jmp 1000h:r_start

Mov ax,1000h; ರೆಜಿಸ್ಟರ್‌ಗಳನ್ನು ಮರುಸಂರಚಿಸಿ
mov ds, ಕೊಡಲಿ
mov es, ಕೊಡಲಿ

ಆಲ್ನಲ್ಲಿ, 0x92; A20 ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ
ಅಥವಾ ಅಲ್, 2
ಔಟ್ 0x92,al

Lgdt fword ; GDTR ರಿಜಿಸ್ಟರ್ ಅನ್ನು ಲೋಡ್ ಮಾಡಿ
mov eax,cr0
ಅಥವಾ ಅಲ್,1; ಸೆಟ್ ಬಿಟ್ 0
mov cr0, eax; PM ಆನ್ ಮಾಡಿ

Jmp fword 08h:Startup32; PM ಗೆ ಹಾರಿ

ಅಲೈನ್ 8 ;ಪ್ರೊಸೆಸರ್ ಜೋಡಿಸಲಾದ ಪ್ಲೇಟ್ ಅನ್ನು ವೇಗವಾಗಿ ನಿಭಾಯಿಸುತ್ತದೆ
GDT:
dq 0; ಖಾಲಿ
db 0FFh,0FFh,0,0,0,9Ah,0CFh,0 ;ಕೋಡ್
db 0FFh,0FFh,0,0,0,92h,0CFh,0;ಡೇಟಾ
db 0FFh,0FFh,0,80h,0Bh,92h,40h,0 ; ವಿಡಿಯೋ ವಿಭಾಗ
$-GDT ನಲ್ಲಿ GDT_SIZE ಲೇಬಲ್
GDTR:
dw GDT_SIZE-1
ddGDT+10000h
; ನೀವು 32-ಬಿಟ್ ವಿಳಾಸವನ್ನು ಬರೆಯಬೇಕಾಗಿದೆ. ಈಗ ನಾವು 1000h ವಿಭಾಗದಲ್ಲಿರುತ್ತೇವೆ, ಅದರ ಆಧಾರವು 1000h*10h (ಮೂಲಕ; ಭೌತಿಕ ವಿಳಾಸ) => GDTR ನ ಭೌತಿಕ ವಿಳಾಸ (ಲೇಬಲ್‌ಗಳು!) = 10000h (ವಿಭಾಗದ ಬೇಸ್‌ನ ಭೌತಿಕ ವಿಳಾಸ)+ಆಫ್‌ಸೆಟ್

ವರ್ಚುವಲ್; ಈಗ, ವಾಸ್ತವವಾಗಿ, ನಾವು ವಿಭಾಗದ ಅಂತ್ಯಕ್ಕೆ ಜಾಗವನ್ನು ತುಂಬುತ್ತೇವೆ
rb 10000h-$;
ವರ್ಚುವಲ್ ಅಂತ್ಯ
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;
ಬಳಕೆ 32
org $+10000h; ಇಲ್ಲಿ ಏನು: PM ನಲ್ಲಿ ನಾವು ಫ್ಲಾಟ್ ವಿಭಾಗಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುತ್ತೇವೆ ಮತ್ತು ನಾವು ಕೋಡ್ ಅನ್ನು ಬಿಟ್ಟರೆ; org ಗಿಂತ ಮೊದಲು PM ಗಾಗಿ, ನಂತರ; ಇಂಟ್ರಾ-ಸೆಗ್ಮೆಂಟ್ ವಿಳಾಸವು ಫ್ಲಾಟ್ ವಿಳಾಸಕ್ಕೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. ಆದ್ದರಿಂದ.

Startup32: ;PM ಪ್ರವೇಶ ಬಿಂದು
mov ax,10h ;ಇಲ್ಲಿ ಆಯ್ಕೆದಾರರನ್ನು ನೂಕು. ಆಗಾಗ್ಗೆ (! ರಲ್ಲಿ ಸರಣಿ ಸಂಖ್ಯೆಯ ಬಗ್ಗೆ ಮರೆಯಬೇಡಿ
mov es,ax ;table) ಕೋಡ್ ಸೆಗ್ಮೆಂಟ್ ಸೆಲೆಕ್ಟರ್ - 08h. ಡೇಟಾ - 10ಗಂ, ವೀಡಿಯೊ ವಿಭಾಗ - 18ಗಂ
mov ds, ಕೊಡಲಿ
mov fs, ಕೊಡಲಿ
mov ss, ಕೊಡಲಿ
mov esp,10000h; ಸ್ಟಾಕ್
movax,18h
mov gs, ಕೊಡಲಿ

Mov esi,hi_string ;ನಾವು ಯಶಸ್ವಿಯಾಗಿ ಉತ್ತೀರ್ಣರಾಗಿದ್ದೇವೆ ಎಂಬುದನ್ನು ತೋರಿಸಿ
ಕರೆ ಮುದ್ರಣ
jmp $

;ಇಎಸ್ಐ - ಸ್ಟ್ರಿಂಗ್ ವಿಳಾಸ
ಮುದ್ರಿಸಿ:
ಪುಶದ್
xor ebx, ebx
mov ah,07h;ಗುಣಲಕ್ಷಣ
ಇರಿಸುತ್ತದೆ:
ಮೂವ್ ಅಲ್,
mov, ಕೊಡಲಿ
inc ebx
ಪರೀಕ್ಷೆ ಅಲ್, ಅಲ್
jnz ಇರಿಸುತ್ತದೆ
popad
ನಿವೃತ್ತ
hi_string db 'ಪ್ರಧಾನಿ ಅವರಿಗೆ ಸ್ವಾಗತ, ಡ್ಯೂಡ್',0

ನಾವೇನು ​​ಮಾಡಿದ್ದೇವೆ? ಲೋಡರ್ ನಮ್ಮನ್ನು 1000h:0 ಕ್ಕೆ ಯಶಸ್ವಿಯಾಗಿ ಲೋಡ್ ಮಾಡಿದೆ, ಅಲ್ಲಿಂದ ನಾವು ಕಾರ್ಯಗತಗೊಳಿಸುವಿಕೆಯನ್ನು ಮುಂದುವರಿಸಿದ್ದೇವೆ. ಮೊದಲು ಆನ್ ಮಾಡಿದೆ A20, ಎಲ್ಲಾ ಅಡಚಣೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ, ಲೋಡ್ ಮಾಡಲಾಗಿದೆ ಜಿಡಿಟಿಆರ್ಸೂಕ್ತವಾದ ಮೌಲ್ಯ, ಪ್ರವೇಶ ಲೇಬಲ್‌ಗೆ ಹಾರಿದೆ. ನಾವು ಜಿಗಿದಿದ್ದೇವೆ ಎಂದು ನಾನು ಗಮನಿಸುತ್ತೇನೆ
jmp fword 08h:Startup32
ಅಂದರೆ 08h - ಕೋಡ್ ಡಿಸ್ಕ್ರಿಪ್ಟರ್ ಸೆಲೆಕ್ಟರ್. ಅದಕ್ಕೆ ಒಗ್ಗಿಕೊಳ್ಳಿ.

ಈಗ ಈ ಪವಾಡವನ್ನು ಹೇಗೆ ಪ್ರಾರಂಭಿಸುವುದು. ವೈಯಕ್ತಿಕವಾಗಿ, ನಾನು WinImage ಮತ್ತು VirtualBox ಅನ್ನು ಬಳಸುತ್ತೇನೆ. ನಾವು ಬೂಟ್ಲೋಡರ್ ಅನ್ನು ಫ್ಲಾಪಿ ಬೂಟ್ ಸೆಕ್ಟರ್ಗೆ ತಳ್ಳುತ್ತೇವೆ ಮತ್ತು ರೂಟ್ನಲ್ಲಿ .bin ಫೈಲ್ ಅನ್ನು ಹಾಕುತ್ತೇವೆ. ನಾವು ಅದನ್ನು .vfd ನಲ್ಲಿ ಉಳಿಸುತ್ತೇವೆ, ವರ್ಚುವಲ್ ಯಂತ್ರದ ಗುಣಲಕ್ಷಣಗಳಲ್ಲಿ ಫ್ಲಾಪಿ ಇಮೇಜ್ಗೆ ಮಾರ್ಗವನ್ನು ಬರೆಯಿರಿ, ಅದನ್ನು ರನ್ ಮಾಡಿ ಮತ್ತು ಫಲಿತಾಂಶವನ್ನು ನೋಡಿ.

ಮುಂದಿನ ಸಂಚಿಕೆಯಲ್ಲಿ, ನಾವು ಅಡಚಣೆಗಳು, ದೋಷಗಳು, ಬಲೆಗಳು, ಸ್ಥಗಿತಗೊಳಿಸುವಿಕೆಗಳು ಮತ್ತು ಅವು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ, ಕ್ಯಾಚ್ ಮತ್ತು ಡೀಬಗ್ ಮಾಡಲಾಗಿದೆ. ವಾಸ್ತುಶಿಲ್ಪದ ಬಗ್ಗೆ ಮಾತನಾಡಲು ಪ್ರಾರಂಭಿಸೋಣ.

ಮಾಹಿತಿ ಮೂಲಗಳು.
1) ನನಗೆ ಸರಿಯಾದ ಮಾರ್ಗವನ್ನು ತೋರಿಸಿದ್ದಕ್ಕಾಗಿ ಮತ್ತು ಪ್ರಾರಂಭದಲ್ಲಿಯೇ ನನಗೆ ಸಹಾಯ ಮಾಡಿದ್ದಕ್ಕಾಗಿ ನಾನು Phantom_84 ಅಕಾ ಇಗೋಸ್‌ಗೆ ನನ್ನ ಕೃತಜ್ಞತೆಯನ್ನು ವ್ಯಕ್ತಪಡಿಸಲು ಬಯಸುತ್ತೇನೆ. ಅವನಿಲ್ಲದೆ, ಅದನ್ನು ಕಂಡುಹಿಡಿಯುವುದು ನನಗೆ ಹೆಚ್ಚು ಕಷ್ಟಕರವಾಗಿರುತ್ತದೆ.

ಎಲ್ಲಾ ಪ್ರೊಸೆಸರ್‌ಗಳು ಇಂಟೆಲ್, i80286 ರಿಂದ ಪ್ರಾರಂಭಿಸಿ ಮತ್ತು ಇತ್ತೀಚಿನವುಗಳವರೆಗೆ, ಪವರ್-ಅಪ್ ಮೇಲೆ (ಆರಂಭಿಕ "ರೀಸೆಟ್" ನಂತರ) ನೈಜ ವಿಳಾಸ ಮೋಡ್‌ನಲ್ಲಿ (ನೈಜ ಮೋಡ್) ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ. ವಿಶಿಷ್ಟವಾಗಿ, ಮೈಕ್ರೊಪ್ರೊಸೆಸರ್ ಸಿಸ್ಟಮ್‌ನ ಪ್ರಾರಂಭದ ನಂತರ ಸಂರಕ್ಷಿತ ಮೋಡ್‌ಗೆ ಬದಲಾಯಿಸಲು ಅಥವಾ ಮೈಕ್ರೊಪ್ರೊಸೆಸರ್‌ಗಳಿಗಾಗಿ ಬರೆಯಲಾದ ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ವೇಗವಾಗಿ ಕಾರ್ಯಗತಗೊಳಿಸಲು ನೈಜ ಮೋಡ್ ಅನ್ನು ಮಧ್ಯಂತರವಾಗಿ ಬಳಸಲಾಗುತ್ತದೆ. 8086 , 80186 , ಆದರೆ ಹೋಲಿಸಿದರೆ 8086 , 80186 , ನೈಜ ಕ್ರಮದಲ್ಲಿ ಆಧುನಿಕ ಮೈಕ್ರೊಪ್ರೊಸೆಸರ್‌ಗಳು ಕಾರ್ಯಗತಗೊಳಿಸಬಹುದಾದ ಸೂಚನೆಗಳ ವ್ಯಾಪಕ ಸೆಟ್ ಮತ್ತು 32-ಬಿಟ್ ಒಪೆರಾಂಡ್‌ಗಳನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಹೊಂದಿವೆ.
ನೈಜ ಮೋಡ್‌ನಿಂದ ಪ್ರೊಸೆಸರ್ ಅನ್ನು ಸಂರಕ್ಷಿತ ಮೋಡ್‌ಗೆ ಬದಲಾಯಿಸುವುದು ಬೂಟ್ ಮಾಡುವ ಮೂಲಕ ಮಾಡಲಾಗುತ್ತದೆ CR0(ಚಿತ್ರ 1) PE ಬಿಟ್‌ನ ಒಂದೇ ಮೌಲ್ಯದೊಂದಿಗೆ ಪದಗಳು ( ರಕ್ಷಿಸಿ ಸಕ್ರಿಯಗೊಳಿಸಿ) 80286 ಗಾಗಿ ಸಾಫ್ಟ್‌ವೇರ್‌ನೊಂದಿಗೆ ಹೊಂದಾಣಿಕೆಗಾಗಿ, PE ಬಿಟ್ ಅನ್ನು LMSW ಸೂಚನೆಯ ಮೂಲಕ ಹೊಂದಿಸಬಹುದು. ಮೆಮೊರಿಯಲ್ಲಿ ಬದಲಾಯಿಸುವ ಮೊದಲು, ಅಗತ್ಯ ವಿವರಣೆ ಕೋಷ್ಟಕಗಳನ್ನು ಪ್ರಾರಂಭಿಸಬೇಕು IDTಮತ್ತು GDT. ಸಂರಕ್ಷಿತ ಮೋಡ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದ ತಕ್ಷಣ, ಪ್ರೊಸೆಸರ್ ಹೊಂದಿದೆ CPL = 0.

ಅಕ್ಕಿ. 1

ಎಲ್ಲಾ 32-ಬಿಟ್ ಪ್ರೊಸೆಸರ್‌ಗಳಿಗೆ, ರಕ್ಷಿತ ಮೋಡ್‌ಗೆ ಬದಲಾಯಿಸಲು ಕೆಳಗಿನ ಕ್ರಮಗಳ ಅನುಕ್ರಮವನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ:
1. IF ಫ್ಲ್ಯಾಗ್ ಅನ್ನು ಮರುಹೊಂದಿಸುವ ಮೂಲಕ ಮಾಸ್ಕ್ ಮಾಡಬಹುದಾದ ಅಡಚಣೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ ಮತ್ತು ಬಾಹ್ಯ ತರ್ಕದಿಂದ ಮಾಸ್ಕ್ ಮಾಡಲಾಗದ ಅಡಚಣೆಗಳ ಸಂಭವವನ್ನು ನಿರ್ಬಂಧಿಸಿ. "ಪರಿವರ್ತನೆಯ ಅವಧಿ" ಸಮಯದಲ್ಲಿ ಪ್ರೋಗ್ರಾಂ ಕೋಡ್ ವಿನಾಯಿತಿಗಳ ಅನುಪಸ್ಥಿತಿಯನ್ನು ಖಾತರಿಪಡಿಸಬೇಕು ಮತ್ತು ಸಾಫ್ಟ್‌ವೇರ್ ಅಡಚಣೆಗಳನ್ನು ಬಳಸಬಾರದು. ಇಂಟರಪ್ಟ್ ಹ್ಯಾಂಡ್ಲರ್‌ಗಳಿಗೆ ಕರೆ ಮಾಡುವ ಯಾಂತ್ರಿಕ ವ್ಯವಸ್ಥೆಯಲ್ಲಿನ ಬದಲಾವಣೆಯಿಂದ ಈ ಅವಶ್ಯಕತೆ ಉಂಟಾಗುತ್ತದೆ.
2. ಗೆ ಅಪ್‌ಲೋಡ್ ಮಾಡಿ ಜಿಡಿಟಿಆರ್ಮೂಲ ವಿಳಾಸ GDT(LGDT ಸೂಚನೆಯಿಂದ).
3. ಸೂಚನೆ MOV CRO PE ಫ್ಲ್ಯಾಗ್ ಅನ್ನು ಹೊಂದಿಸಿ, ಮತ್ತು ಪೇಜಿಂಗ್ ಮೆಮೊರಿ ಅಗತ್ಯವಿದ್ದರೆ, ನಂತರ PG ಫ್ಲ್ಯಾಗ್.
4. ಇದರ ನಂತರ ತಕ್ಷಣವೇ, ಇಂಟರ್-ಸೆಗ್ಮೆಂಟ್ ಜಂಪ್ ಕಮಾಂಡ್ ( JMP ದೂರ) ಅಥವಾ ಕರೆ ( ದೂರಕ್ಕೆ ಕರೆ ಮಾಡಿ) ರಿಯಲ್-ಮೋಡ್ ಡಿಕೋಡ್ ಮಾಡಿದ ಸೂಚನೆಗಳ ಸರದಿಯನ್ನು ತೆರವುಗೊಳಿಸಲು ಮತ್ತು CPU ಧಾರಾವಾಹಿಯನ್ನು ನಿರ್ವಹಿಸಲು. ಪೇಜಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಸೂಚನಾ ಸಂಕೇತಗಳು MOV CROಮತ್ತು JMPಅಥವಾ ಕರೆ ಮಾಡಿಭೌತಿಕ ವಿಳಾಸವು ತಾರ್ಕಿಕ ಒಂದಕ್ಕೆ ಹೊಂದಿಕೆಯಾಗುವ ಪುಟದಲ್ಲಿರಬೇಕು (ನಿಯಂತ್ರಣವನ್ನು ವರ್ಗಾಯಿಸುವ ಕೋಡ್‌ಗಾಗಿ, ಈ ಅಗತ್ಯವನ್ನು ವಿಧಿಸಲಾಗಿಲ್ಲ).
5. ನೀವು ಸ್ಥಳೀಯ ಡಿಸ್ಕ್ರಿಪ್ಟರ್ ಟೇಬಲ್ ಅನ್ನು ಬಳಸಲು ಯೋಜಿಸಿದರೆ, ಸೂಚನೆ LLDTಲೋಡ್ ಸೆಗ್ಮೆಂಟ್ ಸೆಲೆಕ್ಟರ್ LDTನೋಂದಾಯಿಸಲು LDTR
6. ಸೂಚನೆ LTRಟಾಸ್ಕ್ ರಿಜಿಸ್ಟರ್ ಸೆಲೆಕ್ಟರ್‌ಗೆ ಲೋಡ್ ಮಾಡಿ ಟಿಎಸ್ಎಸ್ಆರಂಭಿಕ ಸಂರಕ್ಷಿತ ಮೋಡ್ ಕಾರ್ಯಕ್ಕಾಗಿ.
7. ಸೆಗ್ಮೆಂಟ್ ರೆಜಿಸ್ಟರ್‌ಗಳನ್ನು ಮರುಲೋಡ್ ಮಾಡಿ (CS ಹೊರತುಪಡಿಸಿ), ಅದರ ವಿಷಯಗಳು ಇನ್ನೂ ನೈಜ ಮೋಡ್‌ಗೆ ಸೇರಿವೆ, ಅಥವಾ ಪರಿವರ್ತನೆಯನ್ನು ನಿರ್ವಹಿಸಿ ಅಥವಾ ಇನ್ನೊಂದು ಕಾರ್ಯಕ್ಕೆ ಕರೆ ಮಾಡಿ (ಈ ಸಂದರ್ಭದಲ್ಲಿ, ರೆಜಿಸ್ಟರ್‌ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮರುಲೋಡ್ ಮಾಡಲಾಗುತ್ತದೆ). ಬಳಕೆಯಾಗದ ವಿಭಾಗದ ರೆಜಿಸ್ಟರ್‌ಗಳನ್ನು ಆಯ್ಕೆ ಶೂನ್ಯದೊಂದಿಗೆ ಲೋಡ್ ಮಾಡಲಾಗಿದೆ.
8. ಸೂಚನೆ LIDTನೋಂದಾಯಿಸಲು ಅಪ್ಲೋಡ್ ಮಾಡಿ IDTRವಿಳಾಸ ಮತ್ತು ಮಿತಿ IDT- ಸಂರಕ್ಷಿತ ಮೋಡ್ ಅಡಚಣೆ ವಿವರಣೆ ಕೋಷ್ಟಕಗಳು.
9. ಮಾಸ್ಕ್ ಮಾಡಬಹುದಾದ ಮತ್ತು ಮಾಸ್ಕ್ ಮಾಡಲಾಗದ ಹಾರ್ಡ್‌ವೇರ್ ಅಡಚಣೆಗಳನ್ನು ಅನುಮತಿಸಿ

ಪ್ರೊಸೆಸರ್ನ ಸಂರಕ್ಷಿತ ಕ್ರಮದಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುವ ಕಾರ್ಯಕ್ರಮಗಳ ಅಭಿವೃದ್ಧಿಗೆ ಈ ಲೇಖನವು ಕೆಲವು ಪರಿಚಯವನ್ನು ಒದಗಿಸುತ್ತದೆ. ಸಂರಕ್ಷಿತ ಕ್ರಮದಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುವ ಯಾವುದೇ ಪ್ರೋಗ್ರಾಂನ ಮುಖ್ಯ ಕಾರ್ಯಗಳನ್ನು ಇಲ್ಲಿ ಹೊಂದಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಅವುಗಳ ಪರಿಹಾರಗಳನ್ನು ನೀಡಲಾಗುತ್ತದೆ. ಮೂಲಭೂತವಾಗಿ, ಕಾರ್ಯಕ್ರಮಗಳನ್ನು ಭಾಷೆಯಲ್ಲಿ ಬರೆಯಲಾಗುತ್ತದೆ FASM.

ಇಂಟೆಲ್ 80386 ಪ್ರೊಸೆಸರ್‌ನ ಆಪರೇಟಿಂಗ್ ಮೋಡ್‌ಗಳು

ಪ್ರೊಸೆಸರ್ ಆಗಮನದೊಂದಿಗೆ ಇಂಟೆಲ್ 80386ವಾಸ್ತುಶಿಲ್ಪ ಹೊರಹೊಮ್ಮಿತು IA32. ಪ್ರೊಸೆಸರ್ನ ಹೊಸ ಕಾರ್ಯಾಚರಣೆಯ ವಿಧಾನದ ಹೊರಹೊಮ್ಮುವಿಕೆಯನ್ನು ಇದು ಊಹಿಸಿದೆ - ಸಂರಕ್ಷಿತ (" ಸಂರಕ್ಷಿತ ಮೋಡ್ಸಾಲಿನಲ್ಲಿ ಹಿಂದಿನ ಪ್ರೊಸೆಸರ್‌ಗಳೊಂದಿಗೆ ಹೊಂದಾಣಿಕೆಗಾಗಿ ಇಂಟೆಲ್ 80x86 CPU 80386 ಸಂರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ತಕ್ಷಣವೇ ಪ್ರಾರಂಭಿಸಲಿಲ್ಲ, ಆದರೆ ನಿಜವಾದ ಮೋಡ್ ಎಂದು ಕರೆಯಲ್ಪಡುವ (" ನೈಜ ಮೋಡ್"). ಜೊತೆಗೆ, ಪ್ರತಿ ಮೋಡ್ ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಉಪ-ವಿಧಾನಗಳನ್ನು ಹೊಂದಿದೆ. ಅವುಗಳನ್ನು ವಿಶ್ಲೇಷಿಸೋಣ.

ನಿಜವಾದ ಮೋಡ್

ಈ ಕ್ರಮದಲ್ಲಿ, ಪ್ರೊಸೆಸರ್ ಒತ್ತಿದ ತಕ್ಷಣ "" ಶಕ್ತಿ"ಕಂಪ್ಯೂಟರ್. ರಿಯಲ್-ಮೋಡ್ ಮೆಮೊರಿಯನ್ನು ವಿನ್ಯಾಸದ ಮೂಲಕ ಪ್ರವೇಶಿಸಲಾಗುತ್ತದೆ" ವಿಭಾಗ:ಆಫ್ಸೆಟ್", ಇದು ತಾರ್ಕಿಕ ವಿಳಾಸವನ್ನು ವಿವರಿಸುತ್ತದೆ. ವಿಭಾಗದ ಮೌಲ್ಯವು ಆಫ್‌ಸೆಟ್‌ನಂತೆಯೇ ಇರುತ್ತದೆ 0 ಮೊದಲು 0FFFFh.

ನೀವು ಒಂದು ವಿಭಾಗದೊಳಗೆ ಮಾತ್ರ ವಿಳಾಸ ಮಾಡಬಹುದಾದ್ದರಿಂದ, ಗರಿಷ್ಠ ವಿಭಾಗದ ಗಾತ್ರ 64 ಕಿಲೋಬೈಟ್. ಪ್ರೊಸೆಸರ್‌ನ ವಿಳಾಸ ಬಸ್‌ನಲ್ಲಿ ಹೊಂದಿಸಲಾದ ಭೌತಿಕ ವಿಳಾಸವನ್ನು ಸೂತ್ರದಿಂದ ಲೆಕ್ಕಹಾಕಲಾಗುತ್ತದೆ:

ರೇಖೀಯ ವಿಳಾಸ = ವಿಭಾಗ * 16 + ಆಫ್‌ಸೆಟ್

ರಿಯಲ್ ಮೋಡ್ ಪ್ರೊಸೆಸರ್‌ಗಳು 80186 ಮತ್ತು 8086 ವಿಭಾಗದ ಮೌಲ್ಯವು ವ್ಯಾಪ್ತಿಯಾಗಿದೆ 0 ಮೊದಲು 0F000h. ಹೀಗಾಗಿ, ವಿಳಾಸ ಬಸ್‌ನಲ್ಲಿ ಗರಿಷ್ಠ ಬಹಿರಂಗ ವಿಳಾಸ 0FFFFFh, ಇದು ಅನುರೂಪವಾಗಿದೆ (2^20)-1 , ಅಂದರೆ 1 ಮೆಗಾಬೈಟ್.

ಸಹಜವಾಗಿ, ಮೊದಲಿಗೆ ಅಂತಹ ಸ್ಮರಣೆಯ ಪ್ರಮಾಣವು ಬೃಹತ್ ಪ್ರಮಾಣದಲ್ಲಿ ಕಾಣುತ್ತದೆ, ಆದರೆ ಕಾಲಾನಂತರದಲ್ಲಿ, ಒಂದು ಮೆಗಾಬೈಟ್ ಸಾಕಾಗಲಿಲ್ಲ. ಪ್ರೊಸೆಸರ್ ಆಗಮನದೊಂದಿಗೆ 80286 ಮೆಮೊರಿ ಬ್ಲಾಕ್ ಎಂದು ಕರೆಯಲ್ಪಡುವಿಕೆಯು ಲಭ್ಯವಾಯಿತು UMB, ವಿಳಾಸದಿಂದ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ 0FFFFh:0010hಮತ್ತು ವಿಳಾಸದೊಂದಿಗೆ ಕೊನೆಗೊಳ್ಳುತ್ತದೆ 0FFFFh:0FFFFh(ಒಂದು ಮೆಗಾಬೈಟ್ ಮೀರಿ 65520 ಬೈಟ್‌ಗಳು). ಈಗ ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್ ಅನ್ನು ಮರುಸಂರಚಿಸಲು ಸಾಧ್ಯವಾಯಿತು MS-DOSಆದ್ದರಿಂದ ಇದು ಈ ಬ್ಲಾಕ್ ಅನ್ನು ಆಕ್ರಮಿಸುತ್ತದೆ, RAM ನಲ್ಲಿ 64 ಕಿಲೋಬೈಟ್ಗಳನ್ನು ಮುಕ್ತಗೊಳಿಸುತ್ತದೆ.

ಸಂರಕ್ಷಿತ ಮೋಡ್

ನೈಜತೆಗೆ ಹೋಲಿಸಿದರೆ ಈ ಮೋಡ್ ಸಂಕೀರ್ಣ ರಚನೆಯನ್ನು ಹೊಂದಿದೆ. ತಾರ್ಕಿಕ ವಿಳಾಸವನ್ನು ರಚನೆಯಿಂದ ಪ್ರತಿನಿಧಿಸಲಾಗುತ್ತದೆ " ಆಯ್ಕೆಗಾರ:ಆಫ್ಸೆಟ್". ಸೆಲೆಕ್ಟರ್ ನಡುವೆ ಇದೆ 0 ಮೊದಲು 0FFFFh(ವಾಸ್ತವವಾಗಿ, 4 ಪಟ್ಟು ಕಡಿಮೆ ಆಯ್ಕೆದಾರರು ಇದ್ದಾರೆ - ಮುಂದಿನ ಲೇಖನಗಳಲ್ಲಿ ಇದರ ಕುರಿತು ಇನ್ನಷ್ಟು). ಆಫ್‌ಸೆಟ್, ನೈಜ ಮೋಡ್‌ಗಿಂತ ಭಿನ್ನವಾಗಿ, 32-ಬಿಟ್ ಆಗಿದೆ, ಇದು 4 ಗಿಗಾಬೈಟ್ ವಿಭಾಗಗಳನ್ನು ತಿಳಿಸಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. ಕೆಳಗಿನ ಯೋಜನೆಯ ಪ್ರಕಾರ ತಾರ್ಕಿಕ ವಿಳಾಸವನ್ನು ರೇಖೀಯ ವಿಳಾಸಕ್ಕೆ ಪರಿವರ್ತಿಸಲಾಗುತ್ತದೆ:

ರೇಖೀಯ ವಿಳಾಸ = ಸೆಗ್ಮೆಂಟ್ ಬೇಸ್ + ಆಫ್ಸೆಟ್

ಪೇಜಿಂಗ್ ಮೋಡ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸದ ಹೊರತು ರೇಖೀಯ ವಿಳಾಸವನ್ನು ವಿಳಾಸ ಬಸ್‌ಗೆ ಹೊಂದಿಸಲಾಗಿದೆ. ಇಲ್ಲದಿದ್ದರೆ, ರೇಖೀಯ ವಿಳಾಸವನ್ನು ಭೌತಿಕ ಒಂದಕ್ಕೆ ಪರಿವರ್ತಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಅದರ ನಂತರ ಮಾತ್ರ ಅದನ್ನು ವಿಳಾಸ ಬಸ್ಗೆ ಹೊಂದಿಸಲಾಗುತ್ತದೆ. ಹೆಚ್ಚುವರಿಯಾಗಿ, ರಕ್ಷಿತ ಮೋಡ್ ನಿಮಗೆ ವರ್ಚುವಲ್ ಮೆಮೊರಿಯನ್ನು ಸಂಘಟಿಸಲು ಅನುಮತಿಸುತ್ತದೆ, 64 ಟೆರಾಬೈಟ್‌ಗಳವರೆಗೆ ಗಾತ್ರವನ್ನು ತಲುಪುತ್ತದೆ ಮತ್ತು ಹಾರ್ಡ್ ಡಿಸ್ಕ್‌ನ ಗಾತ್ರವನ್ನು ಮಾತ್ರ ಅವಲಂಬಿಸಿರುತ್ತದೆ (ಉದಾಹರಣೆಗೆ, ರಲ್ಲಿ ಅದೇ ಪೇಜಿಂಗ್ ಫೈಲ್ ವಿಂಡೋಸ್ವರ್ಚುವಲ್ ಮೆಮೊರಿಯನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುತ್ತದೆ). ಬಹುತೇಕ ಎಲ್ಲಾ ಆಧುನಿಕ ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಂಗಳು ರಕ್ಷಿತ ಕ್ರಮದಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ.

ಬಹುಕಾರ್ಯಕ ರಕ್ಷಿತ ಮೋಡ್ ಸಬ್ಮೋಡ್

ಬಹುಕಾರ್ಯಕವನ್ನು ಸಂಘಟಿಸಲು ಈ ಮೋಡ್ ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ, ಅಂದರೆ, ಏಕಕಾಲದಲ್ಲಿ ಹಲವಾರು ಕಾರ್ಯಗಳನ್ನು ನಿರ್ವಹಿಸುವ ಸಾಮರ್ಥ್ಯ ಅಥವಾ ಬಹು-ಬಳಕೆದಾರ ವ್ಯವಸ್ಥೆ.

ವರ್ಚುವಲ್ 8086 ಮೋಡ್

ಇದು ರಕ್ಷಿತ ಮೋಡ್‌ನ ಉಪ-ಮೋಡ್ ಆಗಿದ್ದು ಅದು ನೈಜ ಮೋಡ್‌ನಲ್ಲಿರುವಂತೆ ಕಾರ್ಯನಿರ್ವಹಿಸುವ ವರ್ಚುವಲ್ ಯಂತ್ರವನ್ನು ರಚಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ, ಆದರೆ ವಾಸ್ತವವಾಗಿ ರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ಚಾಲನೆಯಲ್ಲಿದೆ.

ಅವಾಸ್ತವ ಮೋಡ್

ಇದು ನೈಜ ಮೋಡ್‌ನ ವಿಶೇಷ ಉಪ-ವಿಧಾನವಾಗಿದೆ. ಪ್ರೊಸೆಸರ್ ನೈಜ ಕ್ರಮದಲ್ಲಿದೆ, ಆದರೆ ಇದು ನಿರ್ಮಿಸುವ ಮೂಲಕ ಮೆಮೊರಿಯನ್ನು ಪರಿಹರಿಸುತ್ತದೆ ಆಯ್ಕೆಗಾರ: ಆಫ್ಸೆಟ್". ಹೀಗಾಗಿ, 1 ಮೆಗಾಬೈಟ್‌ಗಿಂತ ಹೆಚ್ಚಿನ ಮೆಮೊರಿ ಲಭ್ಯವಿದೆ. ಭವಿಷ್ಯದಲ್ಲಿ, ಸಂರಕ್ಷಿತ ಮೋಡ್ ಮತ್ತು ಅದರ ಸಬ್‌ಮೋಡ್‌ಗಳನ್ನು ಪರಿಗಣಿಸಲಾಗುತ್ತದೆ.

ಮೊದಲ ಪ್ರೋಗ್ರಾಂ: ಸಂರಕ್ಷಿತ ಮೋಡ್‌ಗೆ ಬದಲಾಯಿಸುವುದು

ಬಿಟ್ ಅನ್ನು ಹೊಂದಿಸುವ ಮೂಲಕ ಸಂರಕ್ಷಿತ ಮೋಡ್‌ಗೆ ಬದಲಾಯಿಸುವುದು ಮಾಡಲಾಗುತ್ತದೆ 0 ನೋಂದಣಿ CR0. ಅದೇ ಶೂನ್ಯ ಬಿಟ್ ಅನ್ನು ಮರುಹೊಂದಿಸುವ ಮೂಲಕ ನೈಜ ಮೋಡ್ಗೆ ಪರಿವರ್ತನೆಯನ್ನು ಕೈಗೊಳ್ಳಲಾಗುತ್ತದೆ. ಈ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ನಿರ್ವಹಿಸುವ ಪ್ರೋಗ್ರಾಂ ಅನ್ನು ಪರಿಗಣಿಸಿ (ಭಾಷೆ - ಫ್ಲಾಟ್ ಅಸೆಂಬ್ಲರ್):

ಬಳಕೆ 16 ; 16-ಬಿಟ್ ಸೂಚನೆಗಳನ್ನು ಬಳಸಲಾಗುತ್ತದೆ

org 100ಗಂ

ಆರಂಭ:

; ನಾವು ನೈಜ ಸಮಯದಲ್ಲಿ ಇದ್ದೇವೆ

mov eax,cr0 ; ರಿಜಿಸ್ಟರ್ CR0 ನ ಮೌಲ್ಯವನ್ನು ಓದಿ
ಅಥವಾಅಲ್, 1 ; ಶೂನ್ಯ ಬಿಟ್ ಹೊಂದಿಸಿ
mov cr0, eax ; CR0 ಗೆ ಹೊಸ ಮೌಲ್ಯವನ್ನು ಬರೆಯಿರಿ

; ನಾವು ಸುರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿದ್ದೇವೆ

mov eax,cr0 ; CR0 ಮೌಲ್ಯವನ್ನು ಓದುವುದು
ಮತ್ತುಅಲ್, 0feh ; ಶೂನ್ಯ ಬಿಟ್ ಅನ್ನು 0 ಗೆ ಮರುಹೊಂದಿಸಿ
mov cr0, eax ; ನೈಜ ಮೋಡ್‌ಗೆ ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ

; ನಾವು ನೈಜ ಸಮಯದಲ್ಲಿ ಇದ್ದೇವೆ

ನಿವೃತ್ತ ; ಕಾರ್ಯಕ್ರಮದಿಂದ ನಿರ್ಗಮಿಸಲಾಗುತ್ತಿದೆ

ಆದಾಗ್ಯೂ, ಈ ಪ್ರೋಗ್ರಾಂ ಸಾಕಷ್ಟು "ಕಚ್ಚಾ" ಏಕೆಂದರೆ ಅದರಲ್ಲಿ ಲೂಪಿಂಗ್ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಲಾಗುವುದಿಲ್ಲ. ನೀವು ಆಜ್ಞೆಗಳನ್ನು ಬರೆದರೆ hltಅಥವಾ jmp $, ನಂತರ ಮೊದಲ ಅಡಚಣೆಯನ್ನು ಪ್ರಚೋದಿಸಿದಾಗ, ಕಂಪ್ಯೂಟರ್ ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ.

ನಮ್ಮ ಸಂದರ್ಭದಲ್ಲಿ, ಆಜ್ಞೆಗಳು ಸಾಕಷ್ಟು ವೇಗವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ, ಆದರೆ ನಮ್ಮ ಪ್ರೋಗ್ರಾಂನ ಯಾವುದೇ ಆಜ್ಞೆಗಳ ಕಾರ್ಯಗತಗೊಳಿಸುವಿಕೆಯ ನಡುವಿನ ಮಧ್ಯಂತರದಲ್ಲಿ, ಅಡಚಣೆಯು ಇನ್ನೂ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ, ಇದು ತ್ವರಿತ ಕ್ರ್ಯಾಶ್ ಮತ್ತು ರೀಬೂಟ್ಗೆ ಕಾರಣವಾಗುತ್ತದೆ. ಆದ್ದರಿಂದ, ನೀವು ಅಡಚಣೆಗಳ ಬಗ್ಗೆ ಕಾಳಜಿ ವಹಿಸಬೇಕು. ಆದ್ದರಿಂದ, ಮತ್ತೊಮ್ಮೆ ಪಟ್ಟಿಯನ್ನು ನೋಡೋಣ. ಇದನ್ನು ಮೊದಲ ಪ್ರೋಗ್ರಾಂ ಎಂದು ಕರೆಯಲಾಗುವುದಿಲ್ಲ (ಬದಲಿಗೆ, ಇದು ಶೂನ್ಯಕ್ಕೆ ಹೋಗುತ್ತದೆ), ಏಕೆಂದರೆ ಇದು ಸಂರಕ್ಷಿತ ಮೋಡ್‌ಗೆ ಬದಲಾಯಿಸುವ ಮುಖ್ಯ ಕ್ರಿಯೆಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ. ಕನಿಷ್ಠ ಸೆಟ್ಟಿಂಗ್‌ಗಳೊಂದಿಗೆ ಸಂರಕ್ಷಿತ ಮೋಡ್‌ಗೆ ಸಂಪೂರ್ಣವಾಗಿ ಬದಲಾಯಿಸಲು, ನೀವು ಈ ಕೆಳಗಿನ ಹಂತಗಳನ್ನು ನಿರ್ವಹಿಸಬೇಕಾಗಿದೆ:

1. ಸಂರಕ್ಷಿತ ಮೋಡ್‌ಗೆ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವೇ ಎಂದು ಪರಿಶೀಲಿಸಿ;

2. ಡಿಸ್ಕ್ರಿಪ್ಟರ್ ಕೋಷ್ಟಕಗಳನ್ನು ಪ್ರಾರಂಭಿಸಿ;

3. ಅಡೆತಡೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ (ಮರೆಮಾಚುವ ಮತ್ತು ಮುಖವಾಡ ಮಾಡಲಾಗದ ಎರಡೂ);

4. ತೆರೆದ ಸಾಲು A20;

5. ಮೆಮೊರಿ ನಿರ್ವಹಣೆ ರೆಜಿಸ್ಟರ್ಗಳನ್ನು ಲೋಡ್ ಮಾಡಿ;

7. CS ರಿಜಿಸ್ಟರ್ ಅನ್ನು ಅತಿಕ್ರಮಿಸುವ ಮೂಲಕ 32-ಬಿಟ್ ಕೋಡ್ ವಿಭಾಗಕ್ಕೆ ಹೋಗಿ.

ಆದರೆ ಮೊದಲ ಪ್ರೋಗ್ರಾಂಗೆ 3, 4, 5 ಹಂತಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಸಾಕು. ನಂತರ ಅದರ ಲೂಪಿಂಗ್ ಕಂಪ್ಯೂಟರ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸುವುದಿಲ್ಲ. ಪ್ರತಿಯೊಂದು ಹಂತವನ್ನು ನೋಡೋಣ.

ಅಡಚಣೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುವುದರಿಂದ ರೀಬೂಟ್ ಮಾಡುವುದನ್ನು ತಡೆಯುತ್ತದೆ. ಅಡಚಣೆಗಳನ್ನು ಮಾಸ್ಕ್ ಮಾಡಬಹುದಾದ ಮತ್ತು ನಾನ್-ಮಾಸ್ಕಬಲ್ ಎಂದು ವಿಂಗಡಿಸಲಾಗಿದೆ. ಮಾಸ್ಕ್ ಮಾಡಬಹುದಾದ ಅಡಚಣೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು, ಫ್ಲ್ಯಾಗ್ ಅನ್ನು ತೆರವುಗೊಳಿಸಿ IFನೋಂದಣಿ ಧ್ವಜಗಳುತಂಡ cli, ಅಡೆತಡೆಗಳನ್ನು ಆಜ್ಞೆಯಿಂದ ಸಕ್ರಿಯಗೊಳಿಸಿದಾಗ sti. ಮುಖವಾಡ ಮಾಡಲಾಗದ ಅಡಚಣೆಗಳನ್ನು ಸ್ವಲ್ಪ ವಿಭಿನ್ನ ರೀತಿಯಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಇದನ್ನು ಮಾಡಲು ಎರಡು ಮಾರ್ಗಗಳಿವೆ: ಇಂಟರಪ್ಟ್ ಕಂಟ್ರೋಲರ್ ರೆಜಿಸ್ಟರ್‌ಗಳನ್ನು ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಮಾಡುವುದು (ಈ ವಿಧಾನವನ್ನು ಸ್ವಲ್ಪ ಸಮಯದ ನಂತರ ಚರ್ಚಿಸಲಾಗುವುದು) ಅಥವಾ ಪೋರ್ಟ್‌ನ ಏಳನೇ ಬಿಟ್ ಅನ್ನು ಬದಲಾಯಿಸುವುದು 70ಗಂ: ಬಿಟ್ ಅನ್ನು ಹೊಂದಿಸಿದರೆ, ಅಡಚಣೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ, ಬಿಟ್ ಸ್ಪಷ್ಟವಾಗಿದ್ದರೆ, ಅಡಚಣೆಗಳನ್ನು ನಿರ್ವಹಿಸಬಹುದು.

ಈಗ ರೇಖೆಯ ಕಾರ್ಯವೇನು ಎಂದು ನಮ್ಮನ್ನು ಕೇಳಿಕೊಳ್ಳೋಣ A20, ಹಾಗಾದರೆ ಇದು ಏನು. ಸಾಲು A20- 32 ವಿಳಾಸ ಸಾಲುಗಳಲ್ಲಿ ಒಂದು. ಕಂಪ್ಯೂಟರ್ ಬೂಟ್ ಮಾಡಿದಾಗ, ಸಾಲು A20ಮುಚ್ಚಲಾಗಿದೆ. ಇದು 20-ಬಿಟ್ ವಿಳಾಸಗಳ ಉತ್ಪಾದನೆಗೆ ಕಾರಣವಾಗುತ್ತದೆ (ಅಂದರೆ, ಸಂಪೂರ್ಣ ವಿಳಾಸ ಸ್ಥಳವು ಸಮಾನವಾಗಿರುತ್ತದೆ (2^20)=1 ಮೆಗಾಬೈಟ್). ಪ್ರೊಸೆಸರ್ನೊಂದಿಗೆ ಹೊಂದಾಣಿಕೆಗಾಗಿ ಇದನ್ನು ಪರಿಚಯಿಸಲಾಗಿದೆ 8086 : ಹೀಗೆ ರೇಖೀಯ ವಿಳಾಸಕ್ಕೆ ಬರೆಯಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದೆ 12345678ಗಂ, ನಾವು ವಾಸ್ತವವಾಗಿ ವಿಳಾಸಕ್ಕೆ ಬರೆಯುತ್ತೇವೆ 00045678ಗಂ, ಇದು ಸಂಪೂರ್ಣವಾಗಿ ಅನಿರೀಕ್ಷಿತ ಫಲಿತಾಂಶಗಳಿಗೆ ಕಾರಣವಾಗಬಹುದು. ಆದ್ದರಿಂದ, 32-ಬಿಟ್ ಅಪ್ಲಿಕೇಶನ್‌ನ ಪೂರ್ಣ ಕಾರ್ಯನಿರ್ವಹಣೆಗಾಗಿ, ಲೈನ್ A20ತೆರೆದಿರಬೇಕು. ಬಿಟ್ ಅನ್ನು ಹೊಂದಿಸುವ ಮೂಲಕ ಇದನ್ನು ಮಾಡಲಾಗುತ್ತದೆ 1 ಬಂದರು 92ಗಂ, ಸಾಲು ಮುಚ್ಚುವಿಕೆ A20- ಈ ಬಿಟ್ ಅನ್ನು ಮರುಹೊಂದಿಸಿ.

ಕೊನೆಯ ಕ್ರಿಯೆಯೊಂದಿಗೆ ಓದುಗರಿಗೆ ಈಗಾಗಲೇ ಪರಿಚಿತವಾಗಿದೆ ಮತ್ತು ಅದು ಇನ್ನು ಮುಂದೆ ಅವನಿಗೆ ಪ್ರಶ್ನೆಗಳನ್ನು ಉಂಟುಮಾಡಬಾರದು.

ಆದ್ದರಿಂದ, ನಮ್ಮ ಹೊಸ, ಮೊದಲ, ಪ್ರೋಗ್ರಾಂನ ಪಟ್ಟಿಯನ್ನು ನೋಡೋಣ, ಇದರಲ್ಲಿ ಸಣ್ಣ ಲೂಪ್ ಅನ್ನು ಈಗಾಗಲೇ ಅಳವಡಿಸಲಾಗಿದೆ. ಹಿಂದಿನ ಪಟ್ಟಿಗೆ ಸೇರಿಸಲಾದ ಸಾಲುಗಳನ್ನು ನಕ್ಷತ್ರ ಚಿಹ್ನೆಯಿಂದ (*) ಗುರುತಿಸಲಾಗಿದೆ.

org 100ಗಂ

ಆರಂಭ:

; ನಾವು ನೈಜ ಸಮಯದಲ್ಲಿ ಇದ್ದೇವೆ

cli ;*

ಒಳಗೆಅಲ್, 70ಗಂ;*
ಅಥವಾಅಲ್, 80ಗಂ ;*
ಹೊರಗೆ 70ಗಂ, ಅಲ್;*

; ತೆರೆದ ಸಾಲು A20

ಒಳಗೆಅಲ್, 92ಗಂ;*
ಅಥವಾಅಲ್, 2 ;*
ಹೊರಗೆ 92ಗಂ, ಅಲ್;*

mov eax,cr0
ಅಥವಾಅಲ್, 1
mov cr0, eax


; ಸಣ್ಣ ಡಬಲ್ ಸೈಕಲ್

mov cx, 20 ;*

ಸೈಕಲ್: ;*
movಕೊಡಲಿ, cx;*
mov cx, 0ffffh ;*
ಲೂಪ್ $ ;*
mov cx, ಕೊಡಲಿ ;*
ಲೂಪ್ಸೈಕಲ್ ;*

mov eax,cr0
ಮತ್ತುಅಲ್, 0feh
mov cr0, eax

; A20 ಸಾಲು ಮುಚ್ಚಿ

ಒಳಗೆಅಲ್, 92ಗಂ;*
ಮತ್ತುಅಲ್, 0fdh ;*
ಹೊರಗೆ 92ಗಂ, ಅಲ್;*

ಒಳಗೆಅಲ್, 70ಗಂ;*
ಮತ್ತುಅಲ್, 7fh ;*
ಹೊರಗೆ 70ಗಂ, ಅಲ್;*

sti ;*

ನಿವೃತ್ತ ; ಕಾರ್ಯಕ್ರಮವನ್ನು ಪೂರ್ಣಗೊಳಿಸಿ

ಕಾರ್ಯಗತಗೊಳಿಸಬಹುದಾದ ಫೈಲ್ ಅನ್ನು ಕ್ಲೀನ್‌ನಿಂದ ಚಲಾಯಿಸುವ ಮೂಲಕ ಪ್ರೋಗ್ರಾಂ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ ಎಂದು ನೀವು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಬಹುದು MS-DOS. ಪ್ರೋಗ್ರಾಂ ಸರಿಯಾಗಿ ಕೊನೆಗೊಂಡರೆ, ಎಲ್ಲವೂ ಕ್ರಮದಲ್ಲಿದೆ.

ಆದಾಗ್ಯೂ, ಈ ಕೆಳಗಿನ ಸಮಸ್ಯೆಗಳು ಸಹ ಸಂಭವಿಸಬಹುದು:

1. ಕಂಪ್ಯೂಟರ್ ಹೆಪ್ಪುಗಟ್ಟುತ್ತದೆ";

2. ಕಂಪ್ಯೂಟರ್ ಮರುಪ್ರಾರಂಭಿಸುತ್ತದೆ.

ಈ ಕೆಳಗಿನ ಕಾರಣಗಳಿಂದ ಇದು ಸಂಭವಿಸಬಹುದು:

1. ಪ್ರೋಗ್ರಾಂ ಚಾಲನೆಯಲ್ಲಿದೆ V86(ವಾಸ್ತವ 8086 );

2. ಪ್ರೋಗ್ರಾಂ ಸಂರಕ್ಷಿತ ಕ್ರಮದಲ್ಲಿ ಅಥವಾ ನಿರ್ದಿಷ್ಟ ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಂ ಅಡಿಯಲ್ಲಿ ಚಾಲನೆಯಲ್ಲಿದೆ.

ಆದ್ದರಿಂದ, ಸಂರಕ್ಷಿತ ಕ್ರಮದಲ್ಲಿ ಚಾಲನೆಯಲ್ಲಿರುವ ಯಾವುದೇ ಪ್ರೋಗ್ರಾಂ ಅನ್ನು ಪ್ರಾರಂಭಿಸುವ ಮೊದಲು, ಪ್ರೋಗ್ರಾಂನ ಮುಂದಿನ ಕೆಲಸದ ಸಾಧ್ಯತೆಯನ್ನು ನೀವು ಪರಿಶೀಲಿಸಬೇಕು. ಇದನ್ನು ಮುಂದೆ ಚರ್ಚಿಸಲಾಗುವುದು.

ಸಂರಕ್ಷಿತ ಮೋಡ್‌ಗೆ ಬದಲಾಯಿಸುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ

ಹಿಂದಿನ ಅಧ್ಯಾಯದಲ್ಲಿ, ನಾವು ಈ ಕೆಳಗಿನ ಸಮಸ್ಯೆಯನ್ನು ಹೊಂದಿದ್ದೇವೆ: ಪ್ರೋಗ್ರಾಂ ಇದು ಸಂರಕ್ಷಿತ ಕ್ರಮದಲ್ಲಿದೆ ಎಂದು ಗುರುತಿಸುವುದಿಲ್ಲ ಅಥವಾ V86, ಇದು ಸಿಸ್ಟಮ್ ಅನ್ನು ಸ್ಥಗಿತಗೊಳಿಸಲು ಅಥವಾ ರೀಬೂಟ್ ಮಾಡಲು ಕಾರಣವಾಗುತ್ತದೆ. ನಾವು ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್ ಅಡಿಯಲ್ಲಿ ಪ್ರೋಗ್ರಾಂ ಅನ್ನು ಚಲಾಯಿಸಲು ಪ್ರಯತ್ನಿಸಿದರೆ ವಿಂಡೋಸ್, ಅದು ವಿಂಡೋಸ್ಸಂರಕ್ಷಿತ ಮೋಡ್‌ಗೆ ಬದಲಾಯಿಸಲು ಪ್ರೋಗ್ರಾಂನ ಪ್ರಯತ್ನವನ್ನು ಹಿಡಿಯುತ್ತದೆ ಮತ್ತು ಎಮ್ಯುಲೇಶನ್ ಮೋಡ್‌ನಲ್ಲಿ ರೀಬೂಟ್ ಮಾಡಲು ನಿಮ್ಮನ್ನು ಕೇಳುತ್ತದೆ MS-DOS(ವೇದಿಕೆಗಾಗಿ 9x), ಅಥವಾ ಬಲವಂತವಾಗಿ ಕಾರ್ಯಕ್ರಮವನ್ನು ಅಂತ್ಯಗೊಳಿಸಿ (ವೇದಿಕೆ NT).

ಆದ್ದರಿಂದ, ನಾವು ನಿಜವಾಗಿಯೂ ನೈಜ ಮೋಡ್‌ನಲ್ಲಿದ್ದೇವೆ ಎಂದು ಪರಿಶೀಲಿಸಲು, ನಾವು ಈ ಕೆಳಗಿನ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ನಿರ್ವಹಿಸಬೇಕು:

1. ನೋಂದಾವಣೆಯ ಶೂನ್ಯ ಬಿಟ್ ಪರಿಶೀಲಿಸಿ CR0;

2. ವಿಂಡೋಸ್ ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್ ಲೋಡ್ ಆಗಿಲ್ಲ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.

ರಿಜಿಸ್ಟರ್ ಅನ್ನು ನೇರವಾಗಿ ಓದುವ ಮೂಲಕ ಮೊದಲ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ಮಾಡಲಾಗುತ್ತದೆ CR0ರಿಜಿಸ್ಟರ್‌ನ ಶೂನ್ಯ ಬಿಟ್ ಅನ್ನು ಮತ್ತಷ್ಟು ಪರಿಶೀಲಿಸುವುದರೊಂದಿಗೆ EAX, AXಅಥವಾ AL. ಬಿಟ್ ಹೊಂದಿಸದಿದ್ದರೆ, ನಾವು ನಿಜವಾದ ಮೋಡ್‌ನಲ್ಲಿದ್ದೇವೆ. ಇಲ್ಲದಿದ್ದರೆ, ಕಾರ್ಯಕ್ರಮದ ಮತ್ತಷ್ಟು ಕಾರ್ಯಗತಗೊಳಿಸುವಿಕೆಯು ಅರ್ಥಹೀನವಾಗುತ್ತದೆ.

ಕಾರ್ಯವನ್ನು ಕರೆಯುವ ಮೂಲಕ ಎರಡನೇ ಕ್ರಿಯೆಯನ್ನು ನಡೆಸಲಾಗುತ್ತದೆ 1600ಗಂಅಡ್ಡಿಪಡಿಸುತ್ತದೆ 2fh. ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಂನ ಪ್ರಸ್ತುತ ಆವೃತ್ತಿಯನ್ನು ಪಡೆಯಲು ಈ ಕಾರ್ಯವು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ ವಿಂಡೋಸ್. ರಿಜಿಸ್ಟರ್‌ನಲ್ಲಿ ಕಾರ್ಯವನ್ನು ಕರೆದ ನಂತರ ALಶೂನ್ಯವನ್ನು ಹೊಂದಿದೆ, ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್ ಅನ್ನು ಲೋಡ್ ಮಾಡಲಾಗಿಲ್ಲ. ಇಲ್ಲದಿದ್ದರೆ, ಮತ್ತೊಮ್ಮೆ, ಯಾವುದೇ ಮುಂದಿನ ಕ್ರಮಗಳನ್ನು ಮುಂದುವರಿಸಲು ನಮ್ಮ ಪ್ರೋಗ್ರಾಂಗೆ ಅರ್ಥವಿಲ್ಲ.

ಕೆಳಗಿನ ಕಾರ್ಯಕ್ರಮದ ಉದಾಹರಣೆಯನ್ನು ಪರಿಗಣಿಸಿ. ಇದು ಹಿಂದಿನ ಪ್ರೋಗ್ರಾಂನ ಮಾರ್ಪಾಡು, ಎಲ್ಲಾ ಹೊಸ ಸೂಚನೆಗಳನ್ನು ನಕ್ಷತ್ರ ಚಿಹ್ನೆಯಿಂದ ಗುರುತಿಸಲಾಗಿದೆ (*).

ಆರ್ಗ್ 100 ಗಂ

ಆರಂಭ:

; ಸೆಗ್ಮೆಂಟ್ ರೆಜಿಸ್ಟರ್‌ಗಳನ್ನು ಹೊಂದಿಸಿ

movಕೊಡಲಿ, cs;*
movಡಿಎಸ್, ಕೊಡಲಿ ;*

; ನಾವು ನಿಜವಾಗಿಯೂ ನೈಜ ಮೋಡ್‌ನಲ್ಲಿದ್ದೇವೆ ಎಂದು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ

mov eax,cr0 ;* ಶೂನ್ಯ ಬಿಟ್ ಪರಿಶೀಲನೆ
ಪರೀಕ್ಷೆಅಲ್, 1 ;* CR0 ಅನ್ನು ನೋಂದಾಯಿಸಿ
jz no_pm ;*

movಆಹ್, 09 ಗಂ ;* ಡಾಸ್ ಕಾರ್ಯ 09 ಗಂ
mov dx, pm_msg ;* ಸ್ಟ್ರಿಂಗ್ ಔಟ್‌ಪುಟ್
ಇಂಟ್ 21ಗಂ;*
ನಿವೃತ್ತ;* ಮತ್ತು ನಿರ್ಗಮಿಸಿ

no_pm:
; ಪ್ರೋಗ್ರಾಂ ವಿಂಡೋಸ್ ಅಡಿಯಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ

movಕೊಡಲಿ, 1600ಗಂ ;* ಕಾರ್ಯ 1600h ಮಲ್ಟಿಪ್ಲೆಕ್ಸರ್
ಇಂಟ್ 2fh ;* ಅಡಚಣೆಗಳು - ವಿಂಡೋಸ್ ಆವೃತ್ತಿಯನ್ನು ಪಡೆಯಿರಿ
ಪರೀಕ್ಷೆಅಲ್, ಅಲ್ ;* ಇಲ್ಲದಿದ್ದರೆ 0 - ದೋಷ
jz no_windows

; ದೋಷ ಸಂದೇಶವನ್ನು ಪ್ರದರ್ಶಿಸಿ

movಆಹ್, 09ಗಂ ;*
mov dx, win_msg ;*
ಇಂಟ್ 21ಗಂ;*
ನಿವೃತ್ತ ;*

no_windows:
; ನಾವು ಖಂಡಿತವಾಗಿಯೂ ನೈಜ ಸಮಯದಲ್ಲಿ ಇದ್ದೇವೆ.
; ಮಾಸ್ಕ್ ಮಾಡಬಹುದಾದ ಅಡಚಣೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ

; ಮುಖವಾಡ ಮಾಡಲಾಗದ ಅಡಚಣೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ (NMI)

ಒಳಗೆಅಲ್, 70ಗಂ
ಅಥವಾಅಲ್, 80 ಗಂ
ಹೊರಗೆ 70ಗಂ ಅಲ್

; ತೆರೆದ ಸಾಲು A20

ಒಳಗೆಅಲ್, 92 ಗಂ
ಅಥವಾಅಲ್, 2
ಹೊರಗೆ 92ಗಂ ಅಲ್

; ಸಂರಕ್ಷಿತ ಮೋಡ್‌ಗೆ ಬದಲಿಸಿ

mov eax,cr0
ಅಥವಾಅಲ್, 1
mov cr0, eax

; ಈಗ ನಾವು ಸಂರಕ್ಷಿತ ಕ್ರಮದಲ್ಲಿದ್ದೇವೆ
; ಸಣ್ಣ ಡಬಲ್ ಸೈಕಲ್

mov cx, 20

ಚಕ್ರ:
movಕೊಡಲಿ, cx
mov cx, 0fffh
ಲೂಪ್ $
mov cx, ಕೊಡಲಿ
ಲೂಪ್ಸೈಕಲ್

; ನೈಜ ಮೋಡ್‌ಗೆ ಬದಲಿಸಿ

mov eax,cr0
ಮತ್ತುಅಲ್, 0feh
mov cr0, eax

; A20 ಸಾಲು ಮುಚ್ಚಿ

ಒಳಗೆಅಲ್, 92ಗಂ;*
ಮತ್ತುಅಲ್, 0fdh ;*
ಹೊರಗೆ 92ಗಂ, ಅಲ್;*

; ಮುಖವಾಡ ಮಾಡಲಾಗದ ಅಡಚಣೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ (NMI)

ಒಳಗೆಅಲ್, 70ಗಂ;*
ಮತ್ತುಅಲ್, 7fh ;*
ಹೊರಗೆ 70ಗಂ, ಅಲ್;*

; ಮಾಸ್ಕ್ ಮಾಡಬಹುದಾದ ಅಡಚಣೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ

sti ;*

; ನಾವು ನೈಜ ಸಮಯದಲ್ಲಿ ಹಿಂತಿರುಗಿದ್ದೇವೆ

ನಿವೃತ್ತ ; ಕಾರ್ಯಕ್ರಮವನ್ನು ಪೂರ್ಣಗೊಳಿಸಿ

; ದೋಷ ಸಂದೇಶಗಳು

pm_msg: ;*
db "ದೋಷ: ಈಗಾಗಲೇ ರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ಚಾಲನೆಯಲ್ಲಿದೆ!$" ;*
win_msg: ;*
db "ದೋಷ: ಮೈಕ್ರೋಸಾಫ್ಟ್ ವಿಂಡೋಸ್ ಪತ್ತೆ!$" ;*
ಈ ಉದಾಹರಣೆಯು ಇನ್ನೂ 32-ಬಿಟ್ ಆಜ್ಞೆಗಳ ಅನುಷ್ಠಾನವನ್ನು ತೋರಿಸುವುದಿಲ್ಲ. ಇದನ್ನು ಮಾಡಲು, ಮುಂದಿನ ಅಧ್ಯಾಯದ ವಸ್ತುಗಳೊಂದಿಗೆ ನೀವೇ ಪರಿಚಿತರಾಗಿರಬೇಕು. ಹೆಚ್ಚುವರಿಯಾಗಿ, ಉದಾಹರಣೆಯು ಈ ಕೆಳಗಿನ ಅನನುಕೂಲತೆಯನ್ನು ಹೊಂದಿದೆ: ಕಾರ್ಯಗಳನ್ನು ಕರೆಯಲಾಗುತ್ತದೆ ಡಾಸ್ (ಇಂಟ್ 21 ಗಂ), ಇದು ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್‌ನಿಂದ ನಮ್ಮ ಪ್ರೋಗ್ರಾಂನ ಸ್ವಾತಂತ್ರ್ಯವನ್ನು ಈಗಾಗಲೇ ವಿರೋಧಿಸಲು ಪ್ರಾರಂಭಿಸಿದೆ MS-DOS. ಭವಿಷ್ಯದಲ್ಲಿ, ನೀವು ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಂನ ಕಾರ್ಯಗಳನ್ನು ಬಳಸುವುದನ್ನು ತೊಡೆದುಹಾಕಬೇಕು ಮತ್ತು ಕಾರ್ಯಗಳನ್ನು ಬಳಸಲು ಮುಂದುವರಿಯಬೇಕು BIOS. ಆದರೆ ಸದ್ಯಕ್ಕೆ ಅಂತಹ ಕೋಡ್‌ಗೆ ನಮ್ಮನ್ನು ನಾವು ನಿರ್ಬಂಧಿಸಿದರೆ ಸಾಕು.

ನನ್ನ ಕಡಿಮೆ ಮಟ್ಟದ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಕೌಶಲ್ಯಗಳನ್ನು ಸುಧಾರಿಸಲು ನಾನು ಪ್ರಸ್ತುತ x86 ಅಸೆಂಬ್ಲರ್‌ನೊಂದಿಗೆ ಆಡುತ್ತಿದ್ದೇನೆ. ನಾನು ಪ್ರಸ್ತುತ 32-ಬಿಟ್ ಸಂರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ಅಡ್ರೆಸಿಂಗ್ ಸ್ಕೀಮ್‌ನಲ್ಲಿ ಸಣ್ಣ ಸಮಸ್ಯೆಯನ್ನು ಎದುರಿಸುತ್ತಿದ್ದೇನೆ.

ಪರಿಸ್ಥಿತಿ ಹೀಗಿದೆ:

ನಾನು 0x7e0 ನಲ್ಲಿ ಲೋಡ್ ಮಾಡಲಾದ ಪ್ರೋಗ್ರಾಂ ಅನ್ನು ಹೊಂದಿದ್ದೇನೆ ಅದು CPU ಅನ್ನು ಸಂರಕ್ಷಿತ ಮೋಡ್‌ಗೆ ಬದಲಾಯಿಸುತ್ತದೆ ಮತ್ತು ಕೋಡ್‌ನಲ್ಲಿ ಸೂಕ್ತವಾದ ಲೇಬಲ್‌ಗೆ ಜಿಗಿಯುತ್ತದೆ:

[...] ಸಂರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ಸಿಪಿಯು ಬದಲಾಯಿಸಲು ಕೋಡ್ [...] jmp ಪ್ರೊಟೆಕ್ಟೆಡ್ ಮೋಡ್ [...] ಬಿಟ್‌ಗಳು 32 ಪ್ರೊಟೆಕ್ಟೆಡ್ ಮೋಡ್: .ಹಾಲ್ಟ್: ಎಚ್‌ಎಲ್‌ಟಿ ಜೆಎಂಪಿ .ಹಾಲ್ಟ್

ಇಲ್ಲಿಯವರೆಗೆ ಎಲ್ಲವೂ ಉತ್ತಮವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿದೆ. "Jmp ProtectedMode" ಪ್ರಿಫೆಚ್ ಕ್ಯೂ ಅನ್ನು ತೆರವುಗೊಳಿಸಲು ಸ್ಪಷ್ಟವಾದ ದೂರದ ಜಿಗಿತವಿಲ್ಲದೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ, ಏಕೆಂದರೆ ಈ ಪ್ರೋಗ್ರಾಂ ಆಫ್‌ಸೆಟ್ 0 (ಆರ್ಗ್ 0 ಪ್ರಾರಂಭದಲ್ಲಿ) ನಲ್ಲಿ ಲೋಡ್ ಆಗುತ್ತದೆ, ಕೋಡ್ ವಿಭಾಗವನ್ನು ಸರಿಯಾದ ಸ್ಥಳಕ್ಕೆ ಸೂಚಿಸಲು ಒತ್ತಾಯಿಸುತ್ತದೆ.

ನನ್ನ ಪ್ರಸ್ತುತ ಸಮಸ್ಯೆ ಏನೆಂದರೆ, "ಪ್ರೊಟೆಕ್ಟೆಡ್ ಮೋಡ್" ಶಾರ್ಟ್‌ಕಟ್‌ನಲ್ಲಿ, ನಾನು 0x8000 ನಿಂದ ಲೋಡ್ ಮಾಡಲಾದ ಮತ್ತೊಂದು ಪ್ರೋಗ್ರಾಂಗೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಲು ಬಯಸುತ್ತೇನೆ (ನಾನು ಇದನ್ನು ಮೆಮೊರಿ ಡಂಪ್‌ನೊಂದಿಗೆ ಪರಿಶೀಲಿಸಿದ್ದೇನೆ, ಲೋಡ್ ಕಾರ್ಯವು ಸರಿಯಾಗಿ ಕೆಲಸ ಮಾಡಿದೆ ಮತ್ತು ಪ್ರೋಗ್ರಾಂ 0x8000 ವರೆಗೆ ಸರಿಯಾಗಿ ಲೋಡ್ ಆಗಿದೆ).

CPU ಈಗ RealMode ಬದಲಿಗೆ ProtectedMode ನಲ್ಲಿರುವ ಕಾರಣ, ವಿಳಾಸದ ಯೋಜನೆಯು ವಿಭಿನ್ನವಾಗಿದೆ. ಪ್ರೊಟೆಕ್ಟೆಡ್‌ಮೋಡ್ ಮೂಲ ವಿಳಾಸವನ್ನು ನೋಡಲು ಡಿಸ್ಕ್ರಿಪ್ಟರ್‌ಗಳನ್ನು ಬಳಸುತ್ತದೆ ಮತ್ತು ನೀಡಲಾದ ಆಫ್‌ಸೆಟ್ ಅನ್ನು ಸೇರಿಸಲು ಮತ್ತು ಭೌತಿಕ ವಿಳಾಸವನ್ನು ಪಡೆಯಲು ಡಿಸ್ಕ್ರಿಪ್ಟರ್ ಟೇಬಲ್‌ನಲ್ಲಿ ಮಿತಿಯನ್ನು (ನಾನು ಅರ್ಥಮಾಡಿಕೊಂಡಂತೆ). ಆದ್ದರಿಂದ, ProtectedMode ಅನ್ನು ಪ್ರವೇಶಿಸುವ ಮೊದಲು GDT ಅನ್ನು ಹೊಂದಿಸುವುದು ಅಗತ್ಯವಾಗಿತ್ತು.

ನನ್ನದು ಈ ರೀತಿ ಕಾಣುತ್ತದೆ:

%ifndef __GDT_INC_INCLUDED__ % ವ್ಯಾಖ್ಯಾನಿಸಿ __GDT_INC_INCLUDED__ ;************************************* ;* ಗ್ಲೋಬಲ್ ಡಿಸ್ಕ್ರಿಪ್ಟರ್ ಟೇಬಲ್ (GDT) * ; ******************************* NULL_DESC: dd 0 ; ಶೂನ್ಯ ವಿವರಣೆ dd 0 CODE_DESC: dw 0xFFFF ; ಮಿತಿ ಕಡಿಮೆ dw 0 ; ಬೇಸ್ ಕಡಿಮೆ ಡಿಬಿ 0; ಮೂಲ ಮಧ್ಯಮ db 10011010b; ಪ್ರವೇಶ db 11001111b ; ಗ್ರಾನ್ಯುಲಾರಿಟಿ ಡಿಬಿ 0; ಬೇಸ್ ಹೈ DATA_DESC: dw 0xFFFF ; ಡೇಟಾ ಡಿಸ್ಕ್ರಿಪ್ಟರ್ dw 0 ; ಕಡಿಮೆ ಡಿಬಿ 0 ಮಿತಿ; ಮೂಲ ಕಡಿಮೆ db 10010010b; ಪ್ರವೇಶ db 11001111b ; ಗ್ರಾನ್ಯುಲಾರಿಟಿ ಡಿಬಿ 0; ಬೇಸ್ ಹೈ ಜಿಡಿಟಿಆರ್: ಮಿತಿ dw 24 ; GDT ಬೇಸ್ dd NULL_DESC ನ ಉದ್ದ; GDT %endif ನ ಆಧಾರ ;__GDT_INC_INCLUDED__

ಮತ್ತು ಮೂಲಕ GDT ರಿಜಿಸ್ಟರ್‌ಗೆ ಲೋಡ್ ಮಾಡಲಾಗಿದೆ

ಎಲ್ಜಿಡಿಟಿ

GDT ಬಳಸಿಕೊಂಡು ಸಂರಕ್ಷಿತ ಮೋಡ್‌ನಲ್ಲಿ ಭೌತಿಕ ವಿಳಾಸ 0x8000 ಗೆ ನಾನು ಈಗ ಹೇಗೆ ಬದಲಾಯಿಸುವುದು ಎಂಬುದು ನನಗೆ ಇನ್ನೂ ಅರ್ಥವಾಗುತ್ತಿಲ್ಲ?

ನನ್ನ ಮೊದಲ ಆಲೋಚನೆಗಳು ಕೋಡ್ ಡಿಸ್ಕ್ರಿಪ್ಟರ್ (CODE_DESC) ಅನ್ನು 0x7e00 ಗೆ ಸೂಚಿಸಬೇಕು (ಪ್ರಸ್ತುತ ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗಿದೆ) ಮತ್ತು 0x8000 (512 ಬೈಟ್‌ಗಳು) ಪಡೆಯಲು ಅಗತ್ಯವಿರುವ ಆಫ್‌ಸೆಟ್ ಅನ್ನು ಬಳಸಬೇಕು, ಇದು ಜಂಪ್ ಕಮಾಂಡ್‌ಗೆ ಕಾರಣವಾಗುತ್ತದೆ:

jmp CODE_DESC:0x200

ಆದರೆ ಇದು ಕೆಲಸ ಮಾಡುವುದಿಲ್ಲ.

jmp 0x7e0:0x200

ಕೆಲಸವೂ ಇಲ್ಲ...

ನಾನು ಇಲ್ಲಿ ಏನು ಕಳೆದುಕೊಂಡಿದ್ದೇನೆ ಎಂದು ನಿಮಗೆ ಏನಾದರೂ ಕಲ್ಪನೆ ಇದೆಯೇ? ಬಹುಶಃ 32-ಬಿಟ್ ಪ್ರೊಟೆಕ್ಟೆಡ್‌ಮೋಡ್ ಅಡ್ರೆಸ್ಸಿಂಗ್ ಸ್ಕೀಮ್ ಮತ್ತು ಜಿಡಿಟಿಯ ಬಳಕೆಯಲ್ಲಿ ನನಗೆ ಗಮನಾರ್ಹವಾದದ್ದೇನಾದರೂ ಅರ್ಥವಾಗಲಿಲ್ಲ.

ಪೂರ್ಣ ಕೋಡ್:

ಬಿಟ್ಗಳು 16 org 0 ; ಆಫ್‌ಸೆಟ್‌ನೊಂದಿಗೆ ಲೋಡ್ ಮಾಡಲಾಗಿದೆ 0000 (phys addr: 0x7e00) jmp ಪ್ರಾರಂಭ ಪ್ರಾರಂಭ: xor ax, ax mov ax, cs mov ds, ax ; ಡೇಟಾ ವಿಭಾಗವನ್ನು ನವೀಕರಿಸಿ cli ; ಸ್ಪಷ್ಟ ಅಡಚಣೆಗಳು lgdt; GDTR ನಿಂದ GDT ಅನ್ನು ಲೋಡ್ ಮಾಡಿ (gdt_32.inc ನೋಡಿ) OpenA20Gate ಕರೆ ; A20 ಗೇಟ್ ಕರೆಯನ್ನು ತೆರೆಯಿರಿ EnablePMode ; ProtectedMode ಗೆ ಜಿಗಿತಗಳು ;****************** ;* A20 ಗೇಟ್ ತೆರೆಯುತ್ತದೆ * ;****************** OpenA20Gate: ರಲ್ಲಿ ಅಲ್, 0x93 ; ವೇಗದ A20 ಪೋರ್ಟ್ 92 ಅಥವಾ ಅಲ್, 2 ಮೂಲಕ A20 ಗೇಟ್ ಬದಲಿಸಿ; ಸೆಟ್ A20 ಗೇಟ್ ಬಿಟ್ 1 ಮತ್ತು ಅಲ್, ~ 1 ; INIT_NOW ಬಿಟ್ ಔಟ್ 0x92, ಅಲ್ ರೆಟ್ ;****************************** ;* ರಕ್ಷಿತ ಮೋಡ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ * ;**** **** ********************** EnablePMode: mov eax, cr0 ಅಥವಾ eax, 1 mov cr0, eax jmp ProtectedMode ; ಇದು ಕೆಲಸ ಮಾಡುತ್ತದೆ (ಲೇಬಲ್‌ಗೆ ಜಿಗಿಯುತ್ತದೆ ಮತ್ತು ಸ್ಥಗಿತಗೊಳ್ಳುತ್ತದೆ) ;jmp (CODE_DESC-NULL_DESC):ProtectedMode ; => ಕೆಲಸ ಮಾಡುವುದಿಲ್ಲ ;jmp 08h:ProtectedMode , => ಕೆಲಸ ಮಾಡುವುದಿಲ್ಲ ;*************** ;* ಡೇಟಾ ಕ್ಷೇತ್ರಗಳು * ;* &ಒಳಗೊಂಡಿದೆ * ;********** ******* %include "gdt_32.inc" ;****************** ;* ರಕ್ಷಿತ ಮೋಡ್ * ;************* ******* ಬಿಟ್‌ಗಳು 32 ಪ್ರೊಟೆಕ್ಟೆಡ್‌ಮೋಡ್: ;ಇಲ್ಲಿ ನಾನು ಭೌತಿಕ ಆಡ್‌ಆರ್ 0x8000 (elf64 asm ಪ್ರೋಗ್ರಾಂ) ಗೆ ಹೋಗಲು ಬಯಸುತ್ತೇನೆ .halt: hlt jmp .halt

11