എന്താണ് സംരക്ഷിത മോഡ്, അതിൽ എന്താണ് വരുന്നത്? ഇൻ്റൽ പ്രോസസറുകൾ സംരക്ഷിത മോഡിലേക്ക് മാറ്റുന്നു അസംബ്ലർ പരിരക്ഷിത മോഡിലേക്ക് മാറുന്നു

rPUME ഒഎദെംഷൊപ്ജ്പ് രെതെത്സ്ഛ്ബ് ഛൊപ്ഛ്ശ് ന്പ്ജ്ഹ് പ്വ്ത്ബ്ദ്പ്ച്ബ്ഫ്ഷ് ച്ബു ഒപ്ച്സ്ഛ്ന് ച്സ്ച്ര്ഖുല്പ്ന് ഉഛ്പെക് ത്ബുഉസ്ഛ്മ്ല്യ്.

yFBL, LBL CHSH RPNOIFE, CH TEBMSHOPN TETSYNE TBVPFSCH RTPGEUUPTB OBN DPUFHREO CHUEZP MYYSH 1 NEZBVBKF BDTEUOPZP RTPUFTBOUFCHBSE CHUEZP MYYSH 640 LYMPVBKF). fBL LFP Y VSHMP PE CHTENEOB RETCHSCHI RTPGEUUPTPCH CHTPDE 8086, OP RPUFEREOOP PVIENB PRETBFYCHOPK RBNSFY UFBMP OE ICHBFBFSH. h FP CE CHTENS FTEVPCHBMPUSH UPITBOIFSH RPMOHA PVTBFOKHA UPCHNEUFYNPUFSH, YUFPVSHCH 16-TBTSDOSH PRETBGYPOOSCH UYUFENSCH CHTPDE ഡോസ് UNPZMY HOPFSHPDBMS. 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 പു VShchMP YЪPMYTPCHBOOP PF RTYMPTSEOYK Y NPZMP YNY UCHPVPDOP HRTBCHMSFSH. lFP OEPVIPDYNP MAVPK RPMOPGEOOOPK NOPZPBBDBUOPK UYUFEN.

FPZP-യെ കുറിച്ച്, RTPGEUUPTBBI-യെക്കുറിച്ചുള്ള UFP DPVBCHMSEFUS CH TEBMSHOPN TETSYNE BU YTSAFUS UVBTSHE: EAX, EBX, ECX, EDX, ESP, EBP, EIP, ESI, EDI, EFLAGS. lBL NPTsOP DPZBDBFSHUS, LFP 32-VYFOSCH CHETUY PVSHYUOSCHI TEZYUFTPCH TEBMSHOPZP TETSINB (LYNEOY TEZYUFTB DPVBCHMSEFUS RTYUFBCHLB"). Chue 32-ine-in-chief Tezyufts LTPNE EIP DPUFHROSHSHEN TBMShopn TETCNEN, OP FLPN UMHUB VHDHF KOBNBFSh ഏകദേശം 1 VBKF VPMSHYY (L ON DPVBCHMSEFUS URESHKBB). RTPGEUUPTE NMPPTSE 286 FY LPNBODSCH VHDHF OELPTTELFOSCH-നെ കുറിച്ച്. nsch NPTsEN, OBRTYNET, OBRYUBFSH mov eax, 0x12345678 Y RPUME bfpzp h AX VHDEF 0x5678, RPFPNH YuFP ഓൺ LBL VSH SCHMSEFUS "PLOPN" h NMBUBDIKHA OP, AL NMBDIBS YBUFSH AX). TEZYUFTB-PFPVTBTSEOYS UFBTYEK YUBUFY 32-VYFOSCHI TEZYUFTPC OE UHEEUFCHHEF - NPTsOP EI YYCHMEYUSH FPMSHLP U RPNPESH BTYZNEFC1 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 യു.എച്ച്.എഫ്.ടി.എഫ് ബി ЪTSDOPUFSH CH DCHB TBBB VPMSHYE, CH ЪBEEEЈOOPN TETSYNE VSCHUFTEE CHSHRPMOSAFUS Y ЪBOINBAF NEOSHIE NEUFB YNEOOOP LPNBODSCH 32 - VYFOPK BTYZHNEFILY.

fBLCE, FERTSH KH OBU O 2 UEZNEOFOSCHI TEZYUFTB VPMSHYE - GS Y FS. tBVPFB യു OYNY RPMOPUFSHHA BOBMPZYUOB DS Y ES Y CHSH NPTSEFE YI UCHPVPDOP YURPMSHЪPCHBFSH CH TEBMSHOPN ടെറ്റ്സൈൻ. PFMYUYE FPMSHLP CH FPN, YuFP OILBLYE LPNBODSCH YI സ്കോപ്പ് RPDTBHNECHBAF (DS YURPMSH'HEFUS RP KHNPMYUBOYA RTBLFYUEULY CHUENY LPNBODPNY SNY, ES OELPFPTSHNY UFTPLPCCHNY PRTBGYSNY) Y OBDP SCHOP KHLBYSCHBFSH, YUFP CHSH IPFYFE PVTBEBFSHUS YUETE OYI. oBRTYNET, mov ax, .

rPNYNP bFPZP TBUYYTEOYS TEZYUFTPC, DPVBCHMSAFUS OPCHCHE HRTBCHMSAEYE TEZYUFTSH (TBOSHYE CHMYSM - TETSYN TBVPFSH RTPGEUPMS, FCRP20 CR4. eUFSH Y DTHZYE (OBRTYNET, PFMBDPUOSCH TEZYUFTSHCH), OP Sing OBU UEKUB OE YOFETEUHAF. yNEOOOP യു RPNPESHA LFYI TEZYUFTPC RTPYCHPDYFUS RETELMAYUEOYE RTPGEUUPTB CH ЪBEEYEЈOOOSCHK TETSYN Y OBUFTPKLB OPCHSHI ZHKHOLGYTPUKBD. DPUFHROSCH CH TEBMSHOPN TETSINE പാടുക.

മ Ъ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. LBTSDSCHK BMENEOF FBVMYGSH ЪBOYNBEF 8 VBKF Y CH UREGYBMSHOPN ZHTNBFE PRYUSCHCHBEF VBPCHSHCH BDTEU UEZNEOFB, TBNET, RTBCHB DPUFHRB Y F.

UEZNEOFSH ЪBEEYEOOOPZP TETSYNB DEMSFUS DCHB FIRB-നെ കുറിച്ച് - UEZNEOFSH LPDB Y UEZNEOFSH DBOOSCHI (UBNPN DEM EUFSH EE CHUSLYE TSS Y LDT, OP RPLBTS. h CS NPTsOP ЪБЗТХЦБФШ FПМШЛП OPNETB DEULTYRFPTCH, PRYUBOOSCHI LBL UEZNEOF LPDB, എച്ച് ZNEOFSH - LBL DBOSI 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, PDYO Y FPF RBTE യെ കുറിച്ച് യു.എസ്.എച്ച്.എം.ബി.ഇ.എസ് OSENSHCHN, B DTHZPK DPUFKHROSCHN DMS ЪBRYUY.

RPDDETSLH UEZNEOFBGYY, POB UYFBEFUS KHUFBTECHYEK എന്നിവയെക്കുറിച്ചുള്ള oEUNPFTS. OH വിൻഡോസ്, OH Linux OE YURPMSHJHAF EЈ CH RPMOPC NETE, B കുറിച്ച് PFMUOSCHI PF x86 BTIYFELFHTSCH (OBRTYNET, ARM) POB CHCHUE PFUHFUFCHHEF. dMS TBZTBOYUEOYS DPUFKHRB എൽ RBNSFY YURPMSH'HEFUS ZPTBJDP VPMEE ZYVLYK NEIBOYN UFTBOYUOPK BDTEUBGYY, LPFPTSCHK NSCH TBUUNPFTY. YuFPVSH YЪVBCHYFSHUS PF UEZNEOFBGYY PU RTPUFP PRYUSCHCHBEF FBVMYGH YЪ DCHHI DEULTYRFPTPCH, KH LBTSDPZP YЪ LPFPTSHCHK BDTEU 0, BDTEU 4CH TBTNEU BNSFY CH 32-VYFOPN TETSYNE). മ ഫ്ബ്ല്പ്ന് ഉംഖ്ഹ്യുബെ ZPCHPTSF, യുഎഫ്പി NSCH ച്ല്മയുയുമ്യ് തെത്സ്യ്ന് മ്യൊഎകൊസ്ഛ്യ് ബ്ദ്തെഉപ്ഛ് - ഉനെഒഒയെ ഉപ്പ്ഫ്ഫ്ഛെഫുഫ്ഛെഫ് ജ്ഹ്ജ്യ്യുഎഉല്പ്ന്ഹ് ബ്ദ്തെഉഖ്. lFP PYUEOSH HDPVOP Y S RPKDH RP FPNH TSE RKhFY. OE UMEDHEF RSCHFBFSHUS YURPMSHЪPCHBFSH UEZNEOFBGYA CH UPEC PRETBGYPOOPK UYUFENE - LFP UYMSHOP ഹംപ്ത്സോസെഫ് LPD SDTB, SJSCHLY CHRTUPDZP, T TSYCHBAF UEZNEOFBGYA (FP EUFSH CHCH UNPTSEFE RPMOPGEOOOP RTPZTBNNNYTPCHBFSH FPMSHLP അസംബ്ലറെ കുറിച്ച്) Y, OBLPOEG, CHCH OE UNPTSEFK REUTFOUFK DTHZHA BTIIFELFHTH-നെക്കുറിച്ച്, RPFPNKH YuFP x86 EDYOUFCHEOOBS, LPFPTBS KHNEEF LFPF NEIBOYN (Y FP, CH 64-VYFOPN TETSYNE YUFTBZP BDTEUBTEUBTEUBTEUBTEF PMSH'HEFUS MYYSH YOZHPTNBGYS പി RTBCHBI DPUFHRB).

lBL S HCE ULBBM, FBVMYGB DEULTYRFPTPCH UEZNEOFPCH ZHTNYTHEFUS UBNPK PRETBGYPOOPK UYUFENPK. YuFPVSH KHLBBBFSH RTPGEUUPTH, ZDE POB OBIPDFUS YURPMSH'HEFUS UREGYBMSHOBS LPNBODB - lgdt (ലോഡ് ഗ്ലോബൽ ഡിസ്ക്രിപ്റ്റർ ടേബിൾ). pOB RTOYNBEF 6-VBKFPCHHA RETENEOOKHA CH RBNSFY. RETCHCHE EЈ 16 VYF UPDETSBF TBNET FBVMYGSHCH VBKFBI (FBLYN PVTBBPN, NBLUINBMSHOPE LPMYUUEUFCHP DEULTYRFPTPCH - 65536 / 8 V.ЪEDBY), = 8192 ШЧК MYOEKOSHCHK BDTEU CH RBNSFY UBNPK FBVMYGSHCH (FP EUFSH VEЪ HYuЈFB CHUEI UEZNEOFPCH). yNEEF UNSHUM CHSTTBCHOSFSH OBYUBMP FBVMYGSHCH ഏകദേശം 16 VBKF, RPFPNKH YuFP LFP KHMKHYUYBEF ULPTPUFSH DPUFHRB L E Ј മെനെഒഫ്ബ്ന്. രെത്ഛ്ശ്ഛ്ക് ബ്മെനെഒഫ് ഫ്ബ്വ്മ്യ്ഗ്സ്ഛുഎജ്ദ്ബ് ദ്പ്മ്ത്സെഒ വ്സ്ഛ്ഫ്ശ് ത്ബ്ഛെഒ ഒഖ്മ വൈ മവ്പെ യുര്പ്മ്ശ്Ъപ്ച്ബൊഇഎ OHMECHPZP UEMELFPTB(ബ്മെനെഒഫ് FBVMYGSH DEULTYRFPTPCH CH UEZNEOFOPN TEZYUFTE OBSCCHBEFUS FBL-നെക്കുറിച്ച് HLBBBFEMSH) ര്ത്യ്ഛ്പ്ദ്യ്ഫ് എൽ പ്യ്വ്ലെ. ъOBYUIF VPMEE-NEOOEE TBVPFPURPUPVOBS FBVMYGB DEULTYRFPTPCH DPMTSOB UPDETSBFSH IPFS VSH FTY DEULTYRFPTB - RHUFPK, DEULTYRFPT DULTYRFPT, DULTYRFPT.

ഓ 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 RTYMPTSEOYSOYPESHBUSD (CHEDSH X OBU NOPZPЪBDBUOBS പു). lPD YURPMOSEFUS U PRTEDEMOOOSCHN ഖ്ത്പ്ചൊഎന് ര്ത്യ്ഛ്യ്മെജ്യ്ക്. h x86 YI GEMSHCHI 4 YFHLY - PF 0 DP 3. oKHMECHPK HTPCHEOSH UBNSCHK RTYCHYMEZYTPCHBOOSCHK (NPTSEF CHSHPRMOSFSH MAVSHCH LPNBODSCH Y NEOSCHBTE), NSHCHK "VE URTBCHOSCHK." lBL Y CH UMKHYUBE U UEZNEOFBGYEK, TBTBVPFYUYLY x86 RETEVPTEYMY U ZHKHOLGYPOBMPN Y CHUE PU YURPMSHJHAF MYSH DCHB HTPCHOS YUECHFSHTI TPGEUUPTB RPDDETSYCHBAF FPMSHLP YI. x LBTSDPZP UEZNEOFB CH EZP DEULTYRFPTE KHLBBO DPL (ഡിസ്ക്രിപ്റ്റർ പ്രിവിലേജ് ലെവൽ)- HTPCHEOSH DPUFHRB OEPVIPDYNSCHK DMS DBOOZP UEZNEOFB. ഒഎര്ത്യ്ഛ്യ്മെജ്യ്ത്പ്ഛ്ബൊഒസ്ഛ്ക് എൽപിഡി ഒഇ ന്പ്ത്സെഫ് ര്പ്മ്ഹ്യുഫ്ശ് ദ്പുഫ്ഹ്ര് എൽ ഉഎജ്നെഒഫ്ഖ് യു ഹ്ത്പ്ചൊഎന് ദ്പുഫ്ഖ്ഹ്ര്ബ് 0, ബി ര്ത്യ്ഛ്യ്മെജ്യ്ത്പ്ഛ്ബൊഒസ്ഛ്ക് എൽപിഡി എൻപിടിഎസ്ഇഎഫ് ര്പ്മ്ക്ഹ്ഫ്യ്ഫ്ഫ്യുര് ര്പ്മ്ഹ്ഫ്യ്ഫ്ഫ്ര്.

UEMELFPT UEZNEOFB, LPFPTSCHK UPDETSYFUS CH UEZNEOFOPN TEZYUFTE, SCHMSEFUS OE RTPUFP OPNETPN BMENEOFB CH FBVMYGE, OP Y KHLBBBFEMEN എച്ച്.എഫ്.എച്ച്.എഫ്.എച്ച്.ടി.പി.സി.ഒ.എസ് YMEZYK (PF 0 DP 3), B HCE UFBTYE OPNET UBNPK FBVMYGSHCH. fBLYN PVTBBN UEMELFPT = (YODELU_DEULTYRFPTB shl 2) + RPL. RPL- അഭ്യർത്ഥിച്ച പ്രിവിലേജ് ലെവൽ - ЪBRTBYCHBENSCHK HTPCHEOSH RTYCHYMEZYK. rTY LFPN RPL DPMTSEO VSHFSH VPMSHYE YMY TBCHEO NBLUINBMSHOPNKH YЪ DPL Y CPL (നിലവിലെ പ്രത്യേകാവകാശ നില). 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 OEZPP. 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 YNECHBPPUSH.

UEZNEOFBGYS ഒബ്നൊഎ ഒഹ്ത്സൊബ്, RPPFPNH S OE VHDH PUFBOBCHMYCHBFSHUS RPLB UFP കുറിച്ച് ZHTNBFE DEULTYRFPTB, B DBN ZPFPCHSCHE OBEOYS. 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 dq 0x00CF9A000000FFFF ; കോഡ് - 8 dq 0x00CF92000000FFFF ; ഡാറ്റ - 16 gdtr32: dw $ - gdt32 - 1 dd gdt32 ; 32-VYFOSHCHK LPD ഉപയോഗം32 start32: ; oBUFTPYN UEZNEOFOSH TEZYUFTSHY UFEL mov eax, 16 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax movzx esp, sp; BLTB mov ബൈറ്റിനെക്കുറിച്ച് CHCHPDYN UINCHPM, "!" ; ъБЧТЭТІІе jmp $

ьFPF എൽപിഡി ഉമെദ്ഹെഫ് ദ്പ്ര്യുബ്ഫ്ശ് എൽ ഒബ്യെന്ഹ് ഒബ്യുബ്ംഷൊപ്ന്ഹ് ЪBZTHUYLH.

RETED RETEIPDPN CH ЪBEEYEЈOOSHK TETSYN OEPVIPDYNP ЪBRTEFIFSH RTYEN BRRBTBFOSCHI RTETSCHCHBOYK (LMBCHYBFKHTB, NSHCHYSH, FBKNET YTHZPCHIPUK), RPUM RETEIPDB PUFBЈFUS OE X DEM, ബി UCHPY PVTBVPFYUYLY NSCH EEE OE ഒബ്ര്യൂബ്ംയ്, RPFPNKH രെത്ച്പെ TSE ര്തെത്സ്ഛ്ഛ്ബൊഇഎ പ്വ്ത്ക്ഹ്യ്ഫ് ഉയുഫെന്ഖ്.

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). FP-യെക്കുറിച്ചുള്ള oEUNPFTS, YuFP NSCH HCE RETEYMY CH ЪBEEEOOOSCHK TETSYN, LPD RTDPDPMTSBEF YURPMOSFSHUS RP-RTETSOENH 16-VYFOSHCHK. ഡിഎംഎസ് പ്ലപൊയുബ്ഫെംഷൊപ്ജ്പ് രെതെഇപ്ദ്ബ് ഒബ്ന് ഒഹ്ത്സൊപ് പ്വൊപ്ഛ്യ്ഫ്ശ് അപ്ദെത്സ്യ്ന്പെ ഉഎജ്നെഒഫൊസ്ഛി തെജ്യുഫ്ത്പ്സി. DYTELFYCHB BUUENVMETB ഉപയോഗം32 ZPCHPTYF ENKH, YuFP DBMSHOEKYK LPD CHSHRPMOSEFUS CH ЪBEEYEOOOPN ടെറ്റ്സൈൻ Y OEPVIPDYNP CH TETBYEV- RETELMAYUFSHUS LETBYE1 YFOPZP (PO YURPMSH'HEFUS RP KHNPMYUBOYA) .

lPNBODB movzx TBUYYTSEF CHFPTPK BTZKHNEOF DP RETCHPZP. h UNSHUME, YuFP JЪ 16 VYFOPZP OBUEOYS 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 BDCHTEUKPHPZPFPBFB CH SCCHPDS UYNCHPPM "!" CH RTBCHSHCHK OYTSOYK KHZPM LBOB (FELUFPCHSHCHK LLTBO JNEEF TBTEYOEYE 80 x 25 UYNCHPMPCH, LBTSDSCHK UYNCHPM ЪBOYNBEFK - CH RBCHPDFK YVKhFSH G CHEFB).

nsch VPMSHYE OE NPTSEN PVTBEBFSHUS L UETCHYUBN BIOS, Feretsh RTYMP CHTENS OBN UFBFSH RPMOPUFSHA UBNPUFPSFEMSHOSCHNY Y UBNYN HRTBCHMSFSH CHUEN PHOPTHDDEN. LMBCHYYH NSCH RPLB OE KHNEEN, RPFPNH RTPUFP UBCHYUBEN U RPNPESH LPNBODSCH jmp $ (എഫ്എച്ച് എൽപിഎച്ച്ഇ-യുബിബിപിഎയെക്കുറിച്ച് പുനഃപരിശോധിക്കുക) കുറിച്ച് RETEBZTHTSBFSHUS Y TsDBFSH OBTSBFYS.

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 KYGBTE ബി. 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 UNEEOYS UPPFCHEFUFCHHAF ZHIJYUEULYN BDTEUBN Y RTY REEBE ഒ ര്ത്യ്ംപുഷ് ഒയുഇസെപ് രെതെഉഉയ്ഫ്ശ്ഛ്ബ്ഫ്ശ്.

h ЪBCHETYEOYE CHSHCHRKHULB, RPTSBMKHK, DPVBCHMA RPUMEDOYK YFTYI - RTPCHETLH, YuFP RTPGEUUPT RPDDETSYCHBEF ЪBEEYEOOOSCHK TETSIN. UHFSH RTPCHETLY CH FPN, YuFP OE CHUE VYFSH ഫ്ലാഗുകൾ NPTsOP YYNEOIFSH RTPZTBNNOP. FP EUFSH TEZYUFT OE UPCHUEN 16-VYFOSHCHK. ഒപ്ച്സ്ഛി RTPGEUUPTBBI DPUFKHROP ഡിഎംഎസ് യ്ജ്നെഒയ്സ് VPMSHYE VYF Y LFP NPTsOP PVOBTHTSYFSH-നെ കുറിച്ച്. TBVETYFE LPD OITSE UBNY, ULBTSKH FPMSHLP, YuFP LPNBODB പുഷ്ഫ് RPNEEBEF TEZYUFT ZHMBZPCH CH UFEL, B popf CHSHCHFBMLYCHBEF UPDETTSYNPE UFELGB. fBLYN PVTBUPN EZP NPTsOP NEOSFSH GEMYLPN, BOE PFDEMSHOSCHNY LPNBODBNY. ChPF RPMOSCHK LPD OBEZP ЪBZТХЪУЛБ:

Org 0x7C00 jmp ബൂട്ട്; ъБЗПМПЧПЛ ListFS അലൈൻ 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 ? ; ъБЗПМПЧПЛ ЖБКМБ വെർച്വൽ 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? വെർച്വൽ അവസാനിപ്പിക്കുക; dBOOSHE OBYUBMSHOPZP ЪБЗТХЪУЛБ label sector_per_track word at $$ label head_count byte at $$ + 2 label disk_id byte at $$ + 3 reboot_msg db "ഏതെങ്കിലും കീ അമർത്തുക, 0 boote_b",0 boote_b"0 ; hCHCHPD UFTPLAY DS: BLTB യെ കുറിച്ച് SI എഴുതുക_str: push si mov ah, 0x0E @: lodsb test al, al jz @f int 0x10 jmp @b @: pop si ret ; lTYFYUEULBS PYYVLB പിശക്: പോപ്പ് സി കോൾ write_str ; RETEЪБЗТХЛБ റീബൂട്ട്: mov si, reboot_msg call write_str xor ah, ah int 0x16 jmp 0xFFFF:0 ; ъБЗТХЛБ UELFPTB DX:AX CH VHJET ES:DI ലോഡ്_സെക്ടർ: പുഷ് dx ആഡ് കോടാലി, വേഡ് adc dx, വേഡ് cmp ബൈറ്റ്, 0xFF je .use_EDD പുഷ് bx cx si div mov cl, dl mov cl, dl mov cl, dl mov inc 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: 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 .പിശക് പോപ്പ് 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 . പോപ്പ് ഡിഡിഎക്സ് സിഎക്സ് റിറ്റ്; ъБЗТХЛБ FELHEEZP ZHBKMB CH RBNSFSH RP BDTEUKH BX:0. lPMYUEUFCHP ЪБЗТХЦЕОШИ UELFPTPCH CHPCHTBEFUS CH AX load_file_data: push bx cx dx si di mov ax, word mov dx, word .load_list -1 cmpne ax p di si dx cx mov ax, bx pop bx sub ax, bx shr ax, 9 - 4 ret @: mov di, 0x8000 / 16 കോൾ load_sector mov si, di mov cx, 512 / 8 - 1 .load_sector: lodsw mov dx, si ചേർക്കുക, 6 cmp ax, -1 jne @f cmp dx, -1 je .file_end @: push es mov es, bx xor di, di call load_sector add bx, 0x200 / 16 പോപ്പ് es loop .load_sector lodsw mov dx, jmp .load_list ; fPULB CHIPDB CH OBYUBMSHOSHCHK ЪBZTHYUYL ബൂട്ട്: ; oBUFTPYN UEZNEOFOSHE TEZYUFTSH jmp 0:@f @: mov ax, cs mov ds, ax mov es, ax ; oBUFTPYN UFEL mov ss, ax mov sp, $$ ; TBTEYIN RTETSCHCHBOYS ST; ъBRPNOYN OPNET ЪБЗТХЪПУОПЗП ДИУЛБ mov, dl; prtedemyn RBTBNEFTSH ЪБЗТХЪПУОПЗП ДУЛБ mov ah, 0x41 mov bx, 0x55AA int 0x13 jc @f mov byte, 0xFF jmp .disk 0 disk_0 0x13 പോപ്പ് es jc inc dh mov, dh, cx, 111111b mov , cx .disk_detected: ; ഇ load_file_data ; RTPDPMCEOYE jmp boot2-നെ കുറിച്ച് RETEIPDYN; rKHUFPE RTPUFTBOUFCHP Y UYZOBFKHTB rb 510 - ($ - $$) db 0x55.0xAA ; dPRPMOYFEMSHOSH DBOOSH ЪБЗТХЪУЛБ 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 ; tБВЪВЪОЕУФТПЛИ DS:SI RP UYNCHPMH UMEYB split_file_name: push si @: lodsb cmp al, "/" je @f test al, al jzv ax, si പോപ്പ് si ret ; ix call write_str pop si push si bp mov dx, word mov ax, word @: push ax call split_file_name mov bp, ax pop ax call find_file test 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 ; 000 / 16 കോൾ load_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 ബൈറ്റ്, 0 je .parse_line ; rHUFBS UFTPLB cmp ബൈറ്റ്, "#" je .parse_line ; lPNNEOFBTYK cmp ബൈറ്റ്, "L" je .load_file ; ъБЗТХЛБ ЖБКМБ cmp ബൈറ്റ്, "S" je .ആരംഭിക്കുക ; ъBRHUL SDTB; oEYCHEUFOBS LPNBODB mov al, mov [.cmd], അൽ കോൾ പിശക് db "അജ്ഞാത ബൂട്ട് സ്ക്രിപ്റ്റ് കമാൻഡ് "" .cmd db ? db ""!",13,10,0 .config_end: ; rTY RTBCHYMSHOPN LPOZHYZHTBGYPOOPN ZHBKME NSCH OE DPMTSOSCH UADB RPRBUFSH; jmp റീബൂട്ട്; ъБЗТХЛБ ЖБКМБ.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, mov cx1 muv c, cx1 mv cx word, dx mov word, 0 mov word, 0 pop ax shr ax, 9 - 4 add bx, ax add bp, 16 pop dx jmp .parse_line ; ъBRHUL SDTB.start: ; rTPCHETYN, YuFP ЪBZTHTSEO IPFS VSC PDIO ZhBKM cmp bx, 0x9000 / 16 ja @f കോൾ പിശക് db "കേർണൽ ലോഡുചെയ്തിട്ടില്ല",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 വാക്ക്, "16" je .start16 cmp വാക്ക്, "32" je .start32 ;cmp വാക്ക്, "64" ;ജേ സ്റ്റാർട്ട് 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 push ax 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 dq 0x00CF9A000000FFFF ; കോഡ് - 8 dq 0x00CF92000000FFFF ; ഡാറ്റ - 16 gdtr32: dw $ - gdt32 - 1 dd gdt32 ; 32-VYFOSHCHK LPD ഉപയോഗം32 start32: ; oBUFTPYN UEZNEOFOSH TEZYUFTSHY UFEL mov eax, 16 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax movzx esp, sp; BLTB mov ബൈറ്റിനെക്കുറിച്ച് hCHCHPDYN UINCHPM, "! ";

ഒരു ഓപ്പറേറ്റിംഗ് സിസ്റ്റം എഴുതുന്നതിന്, നിങ്ങൾ നിരവധി വിശദാംശങ്ങൾ മനസ്സിലാക്കേണ്ടതുണ്ട്. അതിനാൽ ഞാൻ നിങ്ങളെ അൽപ്പം പ്രബുദ്ധരാക്കട്ടെ (എന്നാൽ നിങ്ങൾ സ്വയം മന വായിക്കുമെന്ന് സമ്മതിക്കാം, അതിനാൽ നിങ്ങൾക്ക് എന്തെങ്കിലും സംസാരിക്കാനുണ്ട്).
സത്യം പറഞ്ഞാൽ, ഇൻ്റർനെറ്റിൽ PM-ൽ ഒരു ടൺ മെറ്റീരിയലുകൾ ഉണ്ട്, ഐലിയും പെഹാട്ടും ഈ മോഡിനെക്കുറിച്ച് കുറച്ച് സംസാരിച്ചു, പക്ഷേ എന്തായാലും ഇത് പൊതുവായി വിവരിക്കാൻ എന്നോട് ആവശ്യപ്പെട്ടു. ഇപ്പോൾ ഞാൻ സിദ്ധാന്തത്തിൻ്റെ രൂപരേഖ ചുരുക്കി പറയാം (വാസ്തവത്തിൽ, ഇൻ്റൽ ഇതിനായി പ്രത്യേകമായി മന എഴുതി), തുടർന്ന് ഞങ്ങൾ കോഡ് എഴുതാൻ തുടങ്ങും.

സംരക്ഷിത മോഡിലേക്കുള്ള ആമുഖം.
അതിനാൽ, ഡോസിൻ്റെ കാലം മുതൽ എല്ലാവർക്കും പരിചിതമായ യഥാർത്ഥ മോഡിൽ (ആർഎം) നിന്ന് പിഎം വളരെ വ്യത്യസ്തമാണ്. ഇപ്പോൾ നിങ്ങൾ ഇത് ഉപയോഗിക്കേണ്ടതുണ്ട്: സ്റ്റാറ്റിക് 64 കിലോബൈറ്റ് സെഗ്‌മെൻ്റുകളില്ല, 1 കിലോബൈറ്റിൽ ഇൻ്ററപ്റ്റ് ടേബിളുകളില്ല, സെഗ്‌മെൻ്റ് രജിസ്‌റ്ററുകളിൽ സെഗ്‌മെൻ്റ് അടിസ്ഥാന വിലാസങ്ങളില്ല, പൊതുവെ ഒരു പുതിയ ലോകം.
ഇപ്പോൾ സെഗ്മെൻ്റുകൾ വിവരിച്ചിരിക്കുന്നു ഗ്ലോബൽ ഡിസ്ക്രിപ്റ്റർ ടേബിൾ (GDT). ഈ പട്ടിക ഒരു പകർപ്പിൽ മാത്രമേ ഉണ്ടാകൂ. അവൾ ഓർമ്മയിൽ ഒരു ഘടനയാണ്. ഒരു സെഗ്മെൻ്റ് അല്ല! ഇത് മെമ്മറിയിൽ എവിടെയും സ്ഥിതിചെയ്യാം, എന്നാൽ അതിൻ്റെ വിലാസവും പരിധിയും GDTR രജിസ്റ്ററിൽ എഴുതിയിരിക്കുന്നു. അതിൻ്റെ ഘടന ഇതാ:

പട്ടികയിൽ തന്നെ ഇനിപ്പറയുന്ന ഘടനയുടെ റെക്കോർഡുകൾ അടങ്ങിയിരിക്കുന്നു (വഴി, പൂജ്യം റെക്കോർഡ് ശൂന്യമാണ്. ഇത് പ്രധാനമാണ്. ഒരു സീറോ ഡിസ്ക്രിപ്റ്റർ മുഖേന 'വിവരിച്ച' മെമ്മറി ആക്സസ് ചെയ്യുമ്പോൾ, നിങ്ങൾക്ക് #GP - ജനറൽ പ്രൊട്ടക്ഷൻ തകരാർ ലഭിക്കും):
ഈ ഘടനയെക്കുറിച്ച് നമുക്ക് കൂടുതൽ വിശദമായി നോക്കാം.

1. സെഗ്മെൻ്റ് പരിധി:
ഈ ഫീൽഡിൻ്റെ ഉദ്ദേശ്യം പേരിൽ നിന്ന് വ്യക്തമാണ്, പക്ഷേ ഒരു സൂക്ഷ്മതയുണ്ട്. ജി (ഗ്രാനുലാരിറ്റി) ബിറ്റിലാണ് നായയെ അടക്കം ചെയ്തിരിക്കുന്നത്.
ഇത് സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, മെമ്മറി ബൈറ്റുകളായി കണക്കാക്കും. ഈ സാഹചര്യത്തിൽ, സെഗ്മെൻ്റ് വലുപ്പം 1 ബൈറ്റ് മുതൽ 1 മെഗാബൈറ്റ് വരെ വ്യത്യാസപ്പെടാം.
ഞങ്ങൾ ഇത് 1 ആയി സജ്ജമാക്കിയാൽ, പേജ് മെമ്മറി വിലാസം അവതരിപ്പിക്കും. അപ്പോൾ നമുക്ക് 4 കിലോബൈറ്റ് മുതൽ 4 ജിഗാബൈറ്റ് റാം വരെ 4 കിലോബൈറ്റ് (പേജ് വലുപ്പം) വലുപ്പത്തിൽ മാറ്റം വരുത്താൻ കഴിയും. പൊതുവേ, പേജ് വിലാസം അഭികാമ്യമാണ് (താരതമ്യം ചെയ്യുക (1MB+64Kb-16bytes), 4GB). ഈ പോസ്റ്റിൽ സെഗ്മെൻ്റ് അഡ്രസ്സിംഗിനെക്കുറിച്ച് മാത്രം സംസാരിക്കാം. പേജിംഗ് ഒരു പ്രത്യേക ചർച്ച അർഹിക്കുന്നു.

2. അടിസ്ഥാന വിലാസം:
ഇവിടെ ഞങ്ങൾ അടിസ്ഥാനത്തിൻ്റെ ഭൗതിക വിലാസം സൂചിപ്പിക്കുന്നു.

3.തരം ഫീൽഡ്:
ബിറ്റ് കോമ്പിനേഷനുകൾ സെഗ്മെൻ്റ് തരം നിർണ്ണയിക്കുന്നു:

4. എസ് (ഡിസ്ക്രിപ്റ്റർ തരം):
ഈ ബിറ്റ് സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, ഈ ഡിസ്ക്രിപ്റ്റർ സിസ്റ്റം സെഗ്മെൻ്റിനുള്ളതാണെന്ന് ഇൻ്റൽ ഡോക്യുമെൻ്റേഷൻ പറയുന്നു, അല്ലെങ്കിൽ - കോഡ് അല്ലെങ്കിൽ ഡാറ്റ. സിസ്റ്റം എന്നതുകൊണ്ട് ഞങ്ങൾ ഉദ്ദേശിക്കുന്നത് LDT, TSS, ഇൻ്ററപ്റ്റ് ഗേറ്റ്‌സ് എന്നിവയും അവരെപ്പോലുള്ള മറ്റുള്ളവയും (അവയെ കുറിച്ച് പിന്നീട് കൂടുതൽ).

5. DPL (ഡിസ്ക്രിപ്റ്റർ പ്രിവിലേജ് ലെവൽ):
വിവരിച്ച വിഭാഗത്തിൻ്റെ പ്രത്യേകാവകാശങ്ങൾ. എല്ലാവർക്കും റിംഗ്സ് അറിയാം.

6. പി (സെഗ്‌മെൻ്റ് നിലവിലുണ്ട്):
ഈ ബിറ്റ് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, സെഗ്‌മെൻ്റ് ഇതിനകം മെമ്മറിയിലാണെന്ന് പ്രോസസർ 'അറിയാം' (സാധുതയുള്ളതായി പറയുന്നതായിരിക്കും നല്ലത്). സെഗ്മെൻ്റ് രജിസ്റ്ററിലേക്ക് പി ബിറ്റ് സജ്ജീകരിക്കാത്ത ഒരു ഡിസ്ക്രിപ്റ്റർ സെലക്ടർ നിങ്ങൾ ലോഡ് ചെയ്താൽ, ഒരു #NP (നിലവിലില്ല) ഒഴിവാക്കൽ സംഭവിക്കും. പൊതുവേ, ഈ അലങ്കരിച്ച വാക്യത്തിൻ്റെ അർത്ഥം ഞാൻ കുറച്ച് കഴിഞ്ഞ് വിശദീകരിക്കും.

7.D/B:
വ്യത്യസ്ത തരം വിഭാഗങ്ങൾക്ക് ഇത് വ്യത്യസ്തമായി വ്യാഖ്യാനിക്കപ്പെടുന്നു.
1. കോഡ് സെഗ്‌മെൻ്റുകൾക്ക്:
32 അല്ലെങ്കിൽ 16 ബിറ്റ് ഫലപ്രദമായ വിലാസ ദൈർഘ്യവും പ്രവർത്തന വലുപ്പവും.
(1-32; 0-16);
2. സ്റ്റാക്കിനായി:
സ്റ്റാക്ക് പോയിൻ്റർ 32 അല്ലെങ്കിൽ 16 ബിറ്റ് ആണ്. (1-32; 0-16);

8.ജി:
സെഗ്‌മെൻ്റ് പരിധി അളക്കുന്ന യൂണിറ്റുകളെ (ബൈറ്റുകൾ, പേജുകൾ) ബാധിക്കുന്നു. പൊതുവേ, CR0 രജിസ്റ്ററിൻ്റെ 31 ബിറ്റുകൾ സജ്ജീകരിച്ച് PM-ലേക്ക് നീങ്ങുമ്പോൾ പേജിംഗ് പ്രവർത്തനക്ഷമമാക്കാം.

ചില കൂടുതൽ വിവരങ്ങൾ:
ഗ്ലോബൽ എന്ന വാക്ക് വെറുതെ വെച്ചിട്ടില്ലെന്ന് ഞങ്ങൾ ഊഹിക്കുന്നു. അതിനാൽ മറ്റൊരു അടയാളം കൂടിയുണ്ട്. ശരിയാണ്, അവിടെയും ഉണ്ട് പ്രാദേശിക വിവരണ പട്ടിക. അവയിൽ വലിയ വൈവിധ്യങ്ങൾ ഉണ്ടാകാം. ഉദാഹരണത്തിന്, ടാസ്ക്കുകൾ നടപ്പിലാക്കുന്നതിൽ അവ ഉപയോഗിക്കാം. പിന്നെ ഇവിടെ LDTഇതിനകം ഒരു സെഗ്മെൻ്റ് രൂപീകരിക്കുന്നു! അതിനാൽ 'ലോക്കൽ ഡിസ്ക്രിപ്റ്റർ ടേബിൾ സെഗ്മെൻ്റ് ഡിസ്ക്രിപ്റ്റർ' പോലുള്ള വാക്യങ്ങൾ ശീലമാക്കുക.

ഞങ്ങൾ പട്ടിക വിവരിച്ച ശേഷം, ഞങ്ങൾ അത് രജിസ്റ്ററിൽ ലോഡ് ചെയ്യണം GDTR. ഇത് mov അല്ല ചെയ്യുന്നത്. GDTRകമാൻഡ് വഴി പൂരിപ്പിച്ചു lgdt fword (മൂല്യം). അതായത്, നിങ്ങൾ ഈ ഘടന സ്വയം സൃഷ്ടിച്ച് മുകളിൽ സൂചിപ്പിച്ച രജിസ്റ്ററിലേക്ക് ലോഡ് ചെയ്യണം. ഈ രജിസ്റ്ററിൽ ഇപ്പോഴും ടീമുകൾ പ്രവർത്തിക്കുന്നുണ്ടെങ്കിലും ഞങ്ങൾ യൂറോപ്പിലുടനീളം കുതിക്കുന്നു.

ഒരു കാര്യം കൂടി. PM-ൽ, സെഗ്‌മെൻ്റ് രജിസ്‌റ്ററുകൾ സെഗ്‌മെൻ്റുകളുടെ അടിസ്ഥാന വിലാസങ്ങളല്ല (ആർഎം പോലെ) സംഭരിക്കുന്നത്, പ്രത്യേകം പരിശീലനം ലഭിച്ച കാര്യങ്ങളാണ്. സെലക്ടർമാർ. അവയുടെ ഘടന ഇപ്രകാരമാണ്:

പട്ടികയിലെ ഡിസ്ക്രിപ്റ്ററിൻ്റെ ഓർഡിനൽ നമ്പറാണ് ഇവിടെ സൂചിക.
ഡിസ്ക്രിപ്റ്റർ എവിടെയാണ് തിരയേണ്ടതെന്ന് TI കാണിക്കുന്നു (ഇൻ ജി.ഡി.ടിഅഥവാ LDT).

ഒരു മേശ എങ്ങനെ നിർമ്മിക്കാമെന്ന് ഇപ്പോൾ വ്യക്തമാണ്, PM-ലേക്ക് എങ്ങനെ പോകാം എന്നതിനെക്കുറിച്ച് സംസാരിക്കാം (ശ്രദ്ധിക്കുക, ഇത് RM-ൽ നിന്ന് മാത്രമേ ചെയ്യാൻ കഴിയൂ). പൊതുവേ... നിങ്ങൾ നിയന്ത്രണ രജിസ്റ്ററിൻ്റെ CR0-ൻ്റെ ബിറ്റ് 0 സജ്ജീകരിക്കേണ്ടതുണ്ട്. ഞാൻ കള്ളം പറയുകയാണെങ്കിലും. ആദ്യം നിങ്ങൾ എല്ലാ തടസ്സങ്ങളും പ്രവർത്തനരഹിതമാക്കേണ്ടതുണ്ട് ( എൻഎംഐ (മാസ്കബിൾ അല്ലാത്ത തടസ്സങ്ങൾ) ഉൾപ്പെടെ), വിലാസ ലൈൻ തുറക്കുക A20(അതിനാൽ 32-ബിറ്റ് വിലാസം ലഭ്യമാകും), ഡൗൺലോഡ് ചെയ്യുക GDTR, അടയാളത്തിൽ ചാടുക - ആരംഭിക്കുക.

നമുക്ക് ഒരു ലോഡർ ഉപയോഗിക്കാം (നിങ്ങൾക്ക് KOLIBRI-കൾ ഉപയോഗിക്കാം), അത് നമ്മുടെ കോഡ് 1000h:0 എന്ന വിലാസത്തിലേക്ക് ലോഡ് ചെയ്യും (RM-ൻ്റെ വിലാസം, ഞാൻ ശ്രദ്ധിക്കുന്നു).
ഇവിടെ, ബൂട്ട്‌ലോഡറിൽ നിന്ന് നേരിട്ട് PM-ലേക്ക് മാറുമ്പോൾ എല്ലാം ആ മനസ്സുകളിലേതുപോലെ സുഗമമായിരിക്കില്ല. എല്ലാം കുറച്ചുകൂടി സങ്കീർണ്ണമാണ്. എന്നാൽ ആദ്യം, ബൂട്ട്ലോഡർ ലോഡുചെയ്യുന്ന കോഡ് നോക്കാം (ഞങ്ങൾ എഫ്എഎസ്എമ്മിൽ എല്ലാം എഴുതുന്നു).

ഫോർമാറ്റ് ബൈനറി
xor കോടാലി, കോടാലി
cli ;സെഗ്മെൻ്റ് രജിസ്റ്ററുകൾ പുനരാരംഭിക്കുക
mov ss,ax
xor sp,sp
sti
mov കോടാലി,3
10 മണിക്കൂർ

Jmp 1000h:r_start

Mov ax,1000h; രജിസ്റ്ററുകൾ വീണ്ടും ക്രമീകരിക്കുക
mov ds,ax
mov es, കോടാലി

അൽ-ൽ, 0x92 A20 പ്രവർത്തനക്ഷമമാക്കുക
അല്ലെങ്കിൽ അൽ, 2
പുറത്ത് 0x92, അൽ

Lgdt fword ;GDTR രജിസ്റ്റർ ലോഡുചെയ്യുക
mov eax,cr0
അല്ലെങ്കിൽ അൽ,1;സെറ്റ് ബിറ്റ് 0
mov cr0, eax; PM ഓണാക്കുക

Jmp fword 08h:Startup32; പ്രധാനമന്ത്രിയിലേക്ക് പോകുക

അലൈൻ 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
dd GDT+10000h
; നിങ്ങൾ 32-ബിറ്റ് വിലാസം എഴുതേണ്ടതുണ്ട്. ഇപ്പോൾ നമ്മൾ 1000h സെഗ്‌മെൻ്റിലാണ്, അതിൻ്റെ അടിസ്ഥാനം 1000h*10h ആണ് (ഫിസിക്കൽ അഡ്രസ് പ്രകാരം) => GDTR ൻ്റെ ഭൗതിക വിലാസം (ടാഗുകൾ!) = 10000h (സെഗ്‌മെൻ്റ് ബേസിൻ്റെ ഫിസിക്കൽ വിലാസം) + ഓഫ്‌സെറ്റ്

വെർച്വൽ; ഇപ്പോൾ, വാസ്തവത്തിൽ, സെഗ്‌മെൻ്റിൻ്റെ അവസാനം വരെ ഞങ്ങൾ ഇടം പൂരിപ്പിക്കുന്നു
rb 10000h-$;
വെർച്വൽ അവസാനിപ്പിക്കുക
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;
ഉപയോഗം32
org $+10000h; എന്തുകൊണ്ടാണിത്: PM-ൽ ഞങ്ങൾ ഫ്ലാറ്റ് സെഗ്‌മെൻ്റുകളിലാണ് പ്രവർത്തിക്കുന്നത്, കൂടാതെ org-ന് മുമ്പ് PM-നുള്ള കോഡ് വിട്ടാൽ, ഇൻട്രാസെഗ്മെൻ്റ് വിലാസം ഫ്ലാറ്റ് വിലാസവുമായി പൊരുത്തപ്പെടില്ല. അതുകൊണ്ട് ഇതാ.

Startup32: ;പ്രധാനമന്ത്രിയിലേക്കുള്ള പ്രവേശന പോയിൻ്റ്
mov ax,10h ; പലപ്പോഴും (! ലെ സീരിയൽ നമ്പറിനെക്കുറിച്ച് മറക്കരുത്
mov es,ax ;table) സെലക്ടർ കോഡ് സെഗ്മെൻ്റ് - 08h. ഡാറ്റ - 10h, വീഡിയോ സെഗ്മെൻ്റ് - 18h
mov ds,ax
mov fs, കോടാലി
mov ss,ax
mov esp,10000h;സ്റ്റാക്ക്
mov കോടാലി,18h
mov gs, കോടാലി

Mov esi,hi_string ;ഞങ്ങൾ വിജയകരമായി കടന്നുവെന്ന് കാണിക്കാം
കോൾ പ്രിൻ്റ്
jmp$

;ഇഎസ്ഐ - ലൈൻ വിലാസം
പ്രിൻ്റ്:
പുഷദ്
xor ebx,ebx
mov ah,07h;ആട്രിബ്യൂട്ട്
ഇടുന്നു:
മൂവി അൽ,
mov, കോടാലി
inc ebx
പരീക്ഷ അൽ, അൽ
jnz ഇടുന്നു
പോപാഡ്
റിട്ട
hi_string db 'പ്രധാനമന്ത്രിക്ക് സ്വാഗതം, സുഹൃത്തേ',0

നമ്മൾ എന്താണ് ചെയ്തത്? ലോഡർ ഞങ്ങളെ 1000h:0 എന്ന വിലാസത്തിൽ വിജയകരമായി ലോഡ് ചെയ്തു, അവിടെ നിന്ന് ഞങ്ങൾ എക്സിക്യൂഷൻ തുടർന്നു. ആദ്യം ഓൺ ചെയ്തു A20, എല്ലാ തടസ്സങ്ങളും പ്രവർത്തനരഹിതമാക്കി, ലോഡുചെയ്‌തു GDTRഅനുയോജ്യമായ മൂല്യം, എൻട്രി ലേബലിലേക്ക് കുതിച്ചു. ഞങ്ങൾ ചാടിയത് ഞാൻ ശ്രദ്ധിക്കുന്നു
jmp fword 08h:Startup32
അതായത്, 08h എന്നത് ഒരു കോഡ് ഡിസ്ക്രിപ്റ്റർ സെലക്ടറാണ്. അത് ശീലമാക്കുക.

ഇപ്പോൾ ഈ അത്ഭുതം എങ്ങനെ വിക്ഷേപിക്കും. വ്യക്തിപരമായി, ഞാൻ WinImage ഉം VirtualBox ഉം ഉപയോഗിക്കുന്നു. ഞങ്ങൾ ബൂട്ട്ലോഡർ ഫ്ലോപ്പി ഡിസ്കിൻ്റെ ബൂട്ട് സെക്ടറിലേക്ക് തള്ളുകയും റൂട്ടിൽ .bin ഫയൽ ഇടുകയും ചെയ്യുന്നു. ഞങ്ങൾ അത് .vfd-ൽ സേവ് ചെയ്യുന്നു, വെർച്വൽ മെഷീൻ്റെ പ്രോപ്പർട്ടികളിൽ ഫ്ലോപ്പി ഡിസ്ക് ഇമേജിലേക്കുള്ള പാത വ്യക്തമാക്കുക, അത് സമാരംഭിച്ച് ഫലം കാണുക.

അടുത്ത ലക്കത്തിൽ, തടസ്സങ്ങൾ, പിഴവുകൾ, കെണികൾ, അലസിപ്പിക്കലുകൾ, അവ എങ്ങനെ പ്രവർത്തിക്കുന്നു, പിടിക്കപ്പെടുകയും ഡീബഗ് ചെയ്യുകയും ചെയ്യുന്നു. നമുക്ക് വാസ്തുവിദ്യയെക്കുറിച്ച് സംസാരിക്കാൻ തുടങ്ങാം.

വിവര ഉറവിടങ്ങൾ.
1) ശരിയായ പാത ചൂണ്ടിക്കാണിച്ചതിനും തുടക്കത്തിൽ തന്നെ എന്നെ സഹായിച്ചതിനും Phantom_84 aka ego കൾക്ക് എൻ്റെ നന്ദി അറിയിക്കാൻ ഞാൻ ആഗ്രഹിക്കുന്നു. അവനില്ലായിരുന്നെങ്കിൽ എനിക്ക് അത് കണ്ടുപിടിക്കാൻ കൂടുതൽ ബുദ്ധിമുട്ടാകുമായിരുന്നു.

എല്ലാ പ്രോസസ്സറുകളും ഇൻ്റൽ, i80286 മുതൽ തുടങ്ങി അവസാനത്തേതും ഉൾപ്പെടെ, വൈദ്യുതി വിതരണം ഓണായിരിക്കുമ്പോൾ (പ്രാരംഭ "റീസെറ്റ്" കഴിഞ്ഞ്) അവ യഥാർത്ഥ വിലാസ മോഡിൽ (യഥാർത്ഥ മോഡ്) പ്രവർത്തിക്കുന്നു. സാധാരണഗതിയിൽ, ഒരു മൈക്രോപ്രൊസസ്സർ സിസ്റ്റം ആരംഭിച്ചതിന് ശേഷം സംരക്ഷിത മോഡിലേക്ക് മാറുന്നതിനോ അല്ലെങ്കിൽ മൈക്രോപ്രൊസസ്സറുകൾക്കായി എഴുതിയ പ്രോഗ്രാമുകൾ വേഗത്തിൽ നടപ്പിലാക്കുന്നതിനോ ഒരു ഇൻ്റർമീഡിയറ്റ് മോഡായി യഥാർത്ഥ മോഡ് ഉപയോഗിക്കുന്നു. 8086 , 80186 , പക്ഷേ, താരതമ്യപ്പെടുത്തുമ്പോൾ 8086 , 80186 , റിയൽ മോഡിലുള്ള ആധുനിക മൈക്രോപ്രൊസസ്സറുകൾക്ക് എക്സിക്യൂട്ടബിൾ നിർദ്ദേശങ്ങളുടെ വിപുലമായ സെറ്റും 32-ബിറ്റ് ഓപ്പറണ്ടുകൾ പ്രോസസ്സ് ചെയ്യാനുള്ള കഴിവുമുണ്ട്.
യഥാർത്ഥ മോഡിൽ നിന്ന് പ്രോസസർ സംരക്ഷിത മോഡിലേക്ക് മാറ്റുന്നത് ലോഡുചെയ്യുന്നതിലൂടെയാണ് CR0(ചിത്രം 1) PE ബിറ്റിൻ്റെ ഒരൊറ്റ മൂല്യമുള്ള വാക്കുകൾ ( പരിരക്ഷിക്കുക പ്രവർത്തനക്ഷമമാക്കുക). 80286-നുള്ള സോഫ്‌റ്റ്‌വെയറുമായി പൊരുത്തപ്പെടുന്നതിന്, എൽഎംഎസ്‌ഡബ്ല്യു നിർദ്ദേശം ഉപയോഗിച്ച് PE ബിറ്റ് സജ്ജമാക്കാനും കഴിയും. മാറുന്നതിന് മുമ്പ്, ആവശ്യമായ ഡിസ്ക്രിപ്റ്റർ ടേബിളുകൾ മെമ്മറിയിൽ ആരംഭിക്കണം ഐ.ഡി.ടിഒപ്പം ജി.ഡി.ടി. സംരക്ഷിത മോഡ് പ്രവർത്തനക്ഷമമാക്കിയ ഉടൻ തന്നെ, പ്രോസസ്സറിന് ഉണ്ട് CPL = 0.

അരി. 1

എല്ലാ 32-ബിറ്റ് പ്രോസസ്സറുകൾക്കും, പരിരക്ഷിത മോഡിലേക്ക് മാറുന്നതിന് ഇനിപ്പറയുന്ന ഘട്ടങ്ങളുടെ ക്രമം ശുപാർശ ചെയ്യുന്നു:
1. IF ഫ്ലാഗ് പുനഃസജ്ജമാക്കുന്നതിലൂടെ മാസ്‌ക് ചെയ്യാവുന്ന തടസ്സങ്ങൾ പ്രവർത്തനരഹിതമാക്കുക, കൂടാതെ "പരിവർത്തന കാലയളവിൽ" പ്രോഗ്രാം കോഡ് ഒഴിവാക്കലുകളുടെ അഭാവം ഉറപ്പുനൽകുകയും സോഫ്റ്റ്‌വെയർ തടസ്സങ്ങൾ ഉപയോഗിക്കാതിരിക്കുകയും വേണം. ഇൻ്ററപ്റ്റ് ഹാൻഡ്‌ലറുകളെ വിളിക്കുന്നതിനുള്ള മെക്കാനിസത്തിലെ മാറ്റമാണ് ഈ ആവശ്യകതയ്ക്ക് കാരണം.
2. ഇതിലേക്ക് അപ്‌ലോഡ് ചെയ്യുക GDTRഅടിസ്ഥാന വിലാസം ജി.ഡി.ടി(LGDT നിർദ്ദേശങ്ങൾ).
3. നിർദ്ദേശങ്ങൾ MOV CRO PE ഫ്ലാഗ് സജ്ജമാക്കുക, കൂടാതെ പേജ് മെമ്മറി മാനേജ്മെൻ്റ് ആവശ്യമാണെങ്കിൽ, PG ഫ്ലാഗ്.
4. ഇതിന് തൊട്ടുപിന്നാലെ, ഇൻ്റർസെഗ്മെൻ്റ് ജമ്പ് കമാൻഡ് ( JMP ഫാർ) അല്ലെങ്കിൽ വിളിക്കുക ( അകലെ വിളിക്കുക) റിയൽ മോഡിൽ ഡീകോഡ് ചെയ്‌ത നിർദ്ദേശങ്ങളുടെ ക്യൂ മായ്‌ക്കാനും പ്രോസസർ സീരിയലൈസേഷൻ നടത്താനും. പേജിംഗ് പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ, നിർദ്ദേശ കോഡുകൾ MOV CROഒപ്പം ജെഎംപിഅഥവാ വിളിഫിസിക്കൽ വിലാസം ലോജിക്കൽ വിലാസത്തിന് തുല്യമായ ഒരു പേജിലായിരിക്കണം (നിയന്ത്രണം കൈമാറുന്ന കോഡിന്, ഈ ആവശ്യകത ചുമത്തിയിട്ടില്ല).
5. നിങ്ങൾ ഒരു ലോക്കൽ ഡിസ്ക്രിപ്റ്റർ ടേബിൾ ഉപയോഗിക്കാൻ ആഗ്രഹിക്കുന്നുവെങ്കിൽ, നിർദ്ദേശം എൽ.എൽ.ഡി.ടിവേണ്ടി ലോഡ് സെഗ്മെൻ്റ് സെലക്ടർ LDTരജിസ്റ്ററിലേക്ക് LDTR
6. നിർദ്ദേശങ്ങൾ LTRടാസ്ക് രജിസ്റ്ററിലേക്ക് സെലക്ടർ ലോഡ് ചെയ്യുക ടി.എസ്.എസ്പ്രാരംഭ സംരക്ഷിത മോഡ് ടാസ്ക്കിനായി.
7. സെഗ്മെൻ്റ് രജിസ്റ്ററുകൾ റീലോഡ് ചെയ്യുക (സിഎസ് ഒഴികെ), അവയിലെ ഉള്ളടക്കങ്ങൾ ഇപ്പോഴും യഥാർത്ഥ മോഡിൽ പെടുന്നു, അല്ലെങ്കിൽ ഒരു പരിവർത്തനം നടത്തുക അല്ലെങ്കിൽ മറ്റൊരു ടാസ്ക്ക് വിളിക്കുക (ഈ സാഹചര്യത്തിൽ, രജിസ്റ്ററുകൾ സ്വയമേവ റീലോഡ് ചെയ്യപ്പെടും). ഉപയോഗിക്കാത്ത സെഗ്‌മെൻ്റ് രജിസ്‌റ്ററുകൾ പൂജ്യത്തിൻ്റെ സെലക്ടർ മൂല്യത്തിൽ ലോഡ് ചെയ്‌തിരിക്കുന്നു.
8. നിർദ്ദേശങ്ങൾ LIDTരജിസ്റ്ററിൽ ലോഡ് ചെയ്യുക IDTRവിലാസവും പരിധിയും ഐ.ഡി.ടി— സംരക്ഷിത മോഡിൻ്റെ പട്ടികകൾ ഇൻ്ററപ്റ്റ് ഡിസ്ക്രിപ്റ്ററുകൾ.
9. മാസ്ക് ചെയ്യാവുന്നതും അല്ലാത്തതുമായ ഹാർഡ്‌വെയർ തടസ്സങ്ങൾ അനുവദിക്കുക

സംരക്ഷിത പ്രോസസ്സർ മോഡിൽ പ്രവർത്തിക്കുന്ന പ്രോഗ്രാമുകൾ വികസിപ്പിക്കുന്നതിനുള്ള ചില ആമുഖം ഈ ലേഖനം നൽകുന്നു. സംരക്ഷിത മോഡിൽ പ്രവർത്തിക്കുന്ന ഏതൊരു പ്രോഗ്രാമിൻ്റെയും പ്രധാന ജോലികൾ ഇവിടെ പ്രസ്താവിക്കുകയും അവയുടെ പരിഹാരങ്ങൾ നൽകുകയും ചെയ്യും. അടിസ്ഥാനപരമായി, പ്രോഗ്രാമുകൾ ഭാഷയിൽ എഴുതപ്പെടും FASM.

ഇൻ്റൽ 80386 പ്രൊസസറിൻ്റെ പ്രവർത്തന രീതികൾ

പ്രൊസസറിൻ്റെ വരവോടെ ഇൻ്റൽ 80386വാസ്തുവിദ്യ ഉദിച്ചു IA32. ഇത് ഒരു പുതിയ പ്രൊസസർ ഓപ്പറേറ്റിംഗ് മോഡിൻ്റെ ആവിർഭാവത്തെ അനുമാനിച്ചു - സംരക്ഷിത (" സംരക്ഷിത മോഡ്"). വരിയിലെ മുൻ പ്രോസസ്സറുകളുമായുള്ള അനുയോജ്യതയ്ക്കായി ഇൻ്റൽ 80x86സിപിയു 80386 സംരക്ഷിത മോഡിൽ ഉടനടി ആരംഭിച്ചില്ല, എന്നാൽ യഥാർത്ഥ മോഡിൽ (" യഥാർത്ഥ മോഡ്").കൂടാതെ, ഓരോ മോഡിനും ഒന്നോ അതിലധികമോ ഉപമോഡുകൾ ഉണ്ട്. നമുക്ക് അവ നോക്കാം.

യഥാർത്ഥ മോഡ്

"അമർത്തിയാൽ ഉടൻ തന്നെ പ്രോസസ്സർ ഈ മോഡിലാണ്. ശക്തി"കമ്പ്യൂട്ടർ. യഥാർത്ഥ മോഡിൽ മെമ്മറി ആക്സസ് നിർമ്മിക്കുന്നത് നിർവ്വഹിക്കുന്നു" സെഗ്മെൻ്റ്: ഓഫ്സെറ്റ്", ലോജിക്കൽ വിലാസം വിവരിക്കുന്നു. ഓഫ്‌സെറ്റ് പോലെയുള്ള സെഗ്‌മെൻ്റ് മൂല്യം ഇതിൽ നിന്നാണ് 0 മുമ്പ് 0FFFFh.

വിലാസം ഒരു സെഗ്‌മെൻ്റിനുള്ളിൽ മാത്രമേ ചെയ്യാൻ കഴിയൂ എന്നതിനാൽ, പരമാവധി സെഗ്‌മെൻ്റ് വലുപ്പമാണ് 64 കിലോബൈറ്റ് പ്രോസസ്സർ വിലാസ ബസിൽ സജ്ജീകരിച്ചിരിക്കുന്ന ഭൗതിക വിലാസം ഫോർമുല അനുസരിച്ച് കണക്കാക്കുന്നു:

രേഖീയ വിലാസം = സെഗ്മെൻ്റ് * 16 + ഓഫ്സെറ്റ്

യഥാർത്ഥ മോഡ് പ്രോസസ്സറുകൾ 80186 ഒപ്പം 8086 സെഗ്മെൻ്റ് മൂല്യം മുതൽ 0 മുമ്പ് 0F000h. അതിനാൽ, അഡ്രസ് ബസിലെ പരമാവധി വെളിപ്പെട്ട വിലാസം ഇതാണ് 0FFFFFh, ഇത് യോജിക്കുന്നു (2^20)-1 , അതായത്. 1 മെഗാബൈറ്റ്.

തീർച്ചയായും, ആദ്യം അത്തരം മെമ്മറിയുടെ അളവ് വളരെ വലുതായി തോന്നി, എന്നാൽ കാലക്രമേണ ഒരു മെഗാബൈറ്റ് മതിയാകുന്നില്ല. പ്രൊസസറിൻ്റെ വരവോടെ 80286 മെമ്മറി ബ്ലോക്ക് എന്ന് വിളിക്കപ്പെടുന്നവ ലഭ്യമായി യു.എം.ബി., വിലാസത്തിൽ ആരംഭിക്കുന്നു 0FFFFh:0010hഒരു വിലാസത്തിൽ അവസാനിക്കുന്നു 0FFFFh:0FFFFh(ഒരു മെഗാബൈറ്റിനപ്പുറം 65520 ബൈറ്റുകൾ). ഇപ്പോൾ നിങ്ങൾക്ക് ഓപ്പറേറ്റിംഗ് സിസ്റ്റം വീണ്ടും ക്രമീകരിക്കാൻ കഴിയും MS-DOSറാമിൽ 64 കിലോബൈറ്റുകൾ സ്വതന്ത്രമാക്കിക്കൊണ്ട് അത് ഈ ബ്ലോക്ക് ഉൾക്കൊള്ളുന്നു.

സംരക്ഷിത മോഡ്

യഥാർത്ഥ മോഡലുമായി താരതമ്യപ്പെടുത്തുമ്പോൾ ഈ മോഡിന് സങ്കീർണ്ണമായ രൂപകൽപ്പനയുണ്ട്. ഒരു ലോജിക്കൽ വിലാസം നിർമ്മാണം പ്രതിനിധീകരിക്കുന്നു " സെലക്ടർ:ഓഫ്സെറ്റ്". സെലക്ടർ ശ്രേണികൾ 0 മുമ്പ് 0FFFFh(വാസ്തവത്തിൽ, 4 മടങ്ങ് കുറവ് സെലക്ടർമാരുണ്ട് - ഇനിപ്പറയുന്ന ലേഖനങ്ങളിൽ ഇതിനെക്കുറിച്ച് കൂടുതൽ). ഓഫ്‌സെറ്റ്, യഥാർത്ഥ മോഡിൽ നിന്ന് വ്യത്യസ്തമായി, 32-ബിറ്റ് ആണ്, ഇത് 4 ജിഗാബൈറ്റ് സെഗ്‌മെൻ്റുകളെ അഭിസംബോധന ചെയ്യാൻ നിങ്ങളെ അനുവദിക്കുന്നു. ഇനിപ്പറയുന്ന സ്കീം അനുസരിച്ച് ലോജിക്കൽ വിലാസം രേഖീയമായി പരിവർത്തനം ചെയ്യപ്പെടുന്നു:

രേഖീയ വിലാസം = സെഗ്മെൻ്റ് ബേസ് + ഓഫ്സെറ്റ്

പേജ് അഡ്രസ്സിംഗ് മോഡ് പ്രവർത്തനക്ഷമമാക്കിയിട്ടില്ലെങ്കിൽ, ലീനിയർ വിലാസം പിന്നീട് വിലാസ ബസിൽ സ്ഥാപിക്കും. അല്ലെങ്കിൽ, ലീനിയർ വിലാസം ഫിസിക്കൽ ഒന്നായി പരിവർത്തനം ചെയ്യപ്പെടുന്നു, അതിനുശേഷം മാത്രമേ അത് വിലാസ ബസിൽ സ്ഥാപിക്കുകയുള്ളൂ. കൂടാതെ, പരിരക്ഷിത മോഡ് നിങ്ങളെ വെർച്വൽ മെമ്മറി ഓർഗനൈസുചെയ്യാൻ അനുവദിക്കുന്നു, 64 ടെറാബൈറ്റുകൾ വരെ വലുപ്പത്തിൽ എത്തുകയും ഹാർഡ് ഡ്രൈവിൻ്റെ വലുപ്പത്തെ മാത്രം ആശ്രയിക്കുകയും ചെയ്യുന്നു (ഉദാഹരണത്തിന്, ലെ അതേ പേജിംഗ് ഫയൽ വിൻഡോസ്വെർച്വൽ മെമ്മറി നടപ്പിലാക്കുന്നു). മിക്കവാറും എല്ലാ ആധുനിക ഓപ്പറേറ്റിംഗ് സിസ്റ്റങ്ങളും സംരക്ഷിത മോഡിൽ പ്രവർത്തിക്കുന്നു.

സംരക്ഷിത മോഡിൻ്റെ മൾട്ടിടാസ്കിംഗ് സബ്മോഡ്

മൾട്ടിടാസ്കിംഗ് സംഘടിപ്പിക്കാൻ ഈ മോഡ് നിങ്ങളെ അനുവദിക്കുന്നു, അതായത്, ഒരേസമയം നിരവധി ജോലികൾ ചെയ്യാനുള്ള കഴിവ് അല്ലെങ്കിൽ ഒരു മൾട്ടി-യൂസർ സിസ്റ്റം.

വെർച്വൽ 8086 മോഡ്

ഇതും സംരക്ഷിത മോഡിൻ്റെ ഒരു ഉപമോഡാണ്, അത് യഥാർത്ഥ മോഡിൽ പോലെ പ്രവർത്തിക്കുന്ന ഒരു വെർച്വൽ മെഷീൻ സൃഷ്ടിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു, എന്നാൽ യഥാർത്ഥത്തിൽ സംരക്ഷിത മോഡിൽ പ്രവർത്തിക്കുന്നു.

അയഥാർത്ഥ മോഡ്

ഇത് യഥാർത്ഥ മോഡിൻ്റെ ഒരു പ്രത്യേക ഉപ-മോഡാണ്. പ്രോസസർ യഥാർത്ഥ മോഡിലാണ്, പക്ഷേ മെമ്മറിയിലേക്ക് " സെലക്ടർ: ഓഫ്സെറ്റ്". ഈ രീതിയിൽ, 1 മെഗാബൈറ്റിന് മുകളിലുള്ള മെമ്മറി ലഭ്യമാണ്. ഭാവിയിൽ, സംരക്ഷിത മോഡും അതിൻ്റെ ഉപമോഡുകളും പരിഗണിക്കും.

ആദ്യ പ്രോഗ്രാം: സംരക്ഷിത മോഡിലേക്ക് മാറുക

ബിറ്റ് സജ്ജീകരിച്ചാണ് സംരക്ഷിത മോഡിലേക്കുള്ള പരിവർത്തനം നടത്തുന്നത് 0 രജിസ്റ്റർ ചെയ്യുക CR0. അതേ സീറോ ബിറ്റ് പുനഃസജ്ജമാക്കുന്നതിലൂടെയാണ് യഥാർത്ഥ മോഡിലേക്കുള്ള മാറ്റം. ഈ പ്രവർത്തനം നടത്തുന്ന ഒരു പ്രോഗ്രാം പരിഗണിക്കുക (ഭാഷ - ഫ്ലാറ്റ് അസംബ്ലർ):

ഉപയോഗം16 ; 16-ബിറ്റ് നിർദ്ദേശങ്ങൾ ഉപയോഗിക്കുന്നു

org 100h

ആരംഭിക്കുക:

; ഞങ്ങൾ യഥാർത്ഥ മോഡിലാണ്

പ്രസ്ഥാനം eax,cr0 ; രജിസ്റ്റർ CR0 ൻ്റെ മൂല്യം വായിക്കുന്നു
അഥവാഅൽ, 1 ; പൂജ്യം ബിറ്റ് സജ്ജമാക്കുക
പ്രസ്ഥാനം cr0, eax ; പുതിയ CR0 മൂല്യം എഴുതുക

; ഞങ്ങൾ സംരക്ഷിത മോഡിലാണ്

പ്രസ്ഥാനം eax,cr0 ; CR0 മൂല്യം വായിക്കുന്നു
ഒപ്പംഅൽ, 0feh ; പൂജ്യം ബിറ്റ് 0 ആയി പുനഃസജ്ജമാക്കുക
പ്രസ്ഥാനം cr0, eax ; നമുക്ക് യഥാർത്ഥ മോഡിലേക്ക് പോകാം

; ഞങ്ങൾ യഥാർത്ഥ മോഡിലാണ്

റിട്ട ; പ്രോഗ്രാമിൽ നിന്ന് പുറത്തുകടക്കുക

എന്നിരുന്നാലും, ഈ പ്രോഗ്രാം പൂർണ്ണമായും അസംസ്കൃതമാണ്, കാരണം അതിൽ ലൂപ്പിംഗ് നടപ്പിലാക്കാൻ കഴിയില്ല. തുടങ്ങിയ കമാൻഡുകൾ എഴുതിയാൽ hltഅഥവാ jmp$, തുടർന്ന് ആദ്യത്തെ തടസ്സം ട്രിഗർ ചെയ്യുമ്പോൾ, കമ്പ്യൂട്ടർ റീബൂട്ട് ചെയ്യും.

ഞങ്ങളുടെ കാര്യത്തിൽ, കമാൻഡുകൾ വളരെ വേഗത്തിൽ ട്രിഗർ ചെയ്യപ്പെടുന്നു, പക്ഷേ ഞങ്ങളുടെ പ്രോഗ്രാമിലെ ഏതെങ്കിലും കമാൻഡുകൾ നിർവ്വഹിക്കുന്നതിന് ഇടയിലുള്ള ഇടവേളയിൽ, തടസ്സം ഇപ്പോഴും പ്രവർത്തനക്ഷമമാകും, ഇത് തൽക്ഷണ പരാജയത്തിലേക്കും റീബൂട്ടിലേക്കും നയിക്കും. അതിനാൽ, നിങ്ങൾ തടസ്സങ്ങൾ ശ്രദ്ധിക്കണം. അതിനാൽ, നമുക്ക് വീണ്ടും ലിസ്റ്റിംഗ് നോക്കാം. സംരക്ഷിത മോഡിലേക്ക് മാറുന്നതിനുള്ള അടിസ്ഥാന പ്രവർത്തനങ്ങൾ ഇത് നടപ്പിലാക്കാത്തതിനാൽ ഇത് ആദ്യത്തെ പ്രോഗ്രാം എന്ന് വിളിക്കാനാവില്ല (പകരം, ഇത് പൂജ്യത്തിന് അപ്പുറത്തേക്ക് പോകും). കുറഞ്ഞ ക്രമീകരണങ്ങൾ ഉപയോഗിച്ച് പൂർണ്ണമായും പരിരക്ഷിത മോഡിലേക്ക് മാറുന്നതിന്, നിങ്ങൾ ഇനിപ്പറയുന്ന ഘട്ടങ്ങൾ ചെയ്യേണ്ടതുണ്ട്:

1. സംരക്ഷിത മോഡിലേക്ക് മാറാൻ കഴിയുമോയെന്ന് പരിശോധിക്കുക;

2. ഡിസ്ക്രിപ്റ്റർ ടേബിളുകൾ സമാരംഭിക്കുക;

3. തടസ്സങ്ങൾ പ്രവർത്തനരഹിതമാക്കുക (മാസ്‌കബിളും അല്ലാത്തതും);

4. തുറന്ന ലൈൻ A20;

5. മെമ്മറി നിയന്ത്രണ രജിസ്റ്ററുകൾ ലോഡ് ചെയ്യുക;

7. CS രജിസ്റ്ററിനെ അസാധുവാക്കിക്കൊണ്ട് ഒരു 32-ബിറ്റ് കോഡ് സെഗ്മെൻ്റിലേക്ക് മൈഗ്രേറ്റ് ചെയ്യുക.

എന്നാൽ ആദ്യത്തെ പ്രോഗ്രാമിന് 3, 4, 5 ഘട്ടങ്ങൾ നടപ്പിലാക്കാൻ ഇത് മതിയാകും. തുടർന്ന് ഇത് ലൂപ്പ് ചെയ്യുന്നത് കമ്പ്യൂട്ടറിൻ്റെ റീബൂട്ടിലേക്ക് നയിക്കില്ല. ഓരോ പ്രവൃത്തിയും നോക്കാം.

തടസ്സങ്ങൾ പ്രവർത്തനരഹിതമാക്കുന്നത് റീബൂട്ട് ചെയ്യുന്നതിൽ നിന്ന് ഞങ്ങളെ തടയുന്നു. തടസ്സങ്ങൾ മാസ്ക് ചെയ്യാവുന്നതും അല്ലാത്തതും ആയി തിരിച്ചിരിക്കുന്നു. മാസ്ക് ചെയ്യാവുന്ന തടസ്സങ്ങൾ പ്രവർത്തനരഹിതമാക്കാൻ, നിങ്ങൾ ഫ്ലാഗ് റീസെറ്റ് ചെയ്യേണ്ടതുണ്ട് IFരജിസ്റ്റർ ചെയ്യുക EFLAGSടീം ക്ലി, കമാൻഡ് വഴി തടസ്സങ്ങൾ പ്രവർത്തനക്ഷമമാക്കുന്നു sti. മാസ്കബിൾ അല്ലാത്ത തടസ്സങ്ങൾ അല്പം വ്യത്യസ്തമായ രീതിയിൽ നിരോധിച്ചിരിക്കുന്നു. ഇത് ചെയ്യുന്നതിന് രണ്ട് വഴികളുണ്ട്: ഇൻ്ററപ്റ്റ് കൺട്രോളർ രജിസ്റ്ററുകൾ പ്രോഗ്രാമിംഗ് (ഈ രീതി കുറച്ച് കഴിഞ്ഞ് ചർച്ചചെയ്യും) അല്ലെങ്കിൽ പോർട്ടിൻ്റെ ഏഴാമത്തെ ബിറ്റ് മാറ്റുക 70 മണിക്കൂർ: ബിറ്റ് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, തടസ്സങ്ങൾ പ്രവർത്തനരഹിതമാക്കും, ബിറ്റ് പുനഃസജ്ജമാക്കിയാൽ, തടസ്സങ്ങൾ നടപ്പിലാക്കാൻ കഴിയും.

ഇനി വരയുടെ ധർമ്മം എന്താണെന്ന് സ്വയം ചോദിക്കാം A20, അപ്പോ എന്താ ഇത്. ലൈൻ A20- 32 വിലാസ വരികളിൽ ഒന്ന്. കമ്പ്യൂട്ടർ ബൂട്ട് ചെയ്യുമ്പോൾ, ലൈൻ A20അടച്ചു. ഇത് 20-ബിറ്റ് വിലാസങ്ങൾ സൃഷ്ടിക്കുന്നതിന് കാരണമാകുന്നു (അതായത്, മുഴുവൻ വിലാസ സ്ഥലവും തുല്യമാണ് (2^20)=1 മെഗാബൈറ്റ്). പ്രോസസർ അനുയോജ്യതയ്ക്കായി ഇത് ഉൾപ്പെടുത്തിയിട്ടുണ്ട്. 8086 : അങ്ങനെ, ഒരു രേഖീയ വിലാസത്തിലേക്ക് എഴുതാൻ ശ്രമിക്കുന്നു 12345678h, ഞങ്ങൾ അത് യഥാർത്ഥത്തിൽ എഴുതും 00045678h, ഇത് തികച്ചും അപ്രതീക്ഷിതമായ ഫലങ്ങളിലേക്ക് നയിച്ചേക്കാം. അതിനാൽ, ഒരു 32-ബിറ്റ് ആപ്ലിക്കേഷൻ്റെ പൂർണ്ണമായ പ്രവർത്തനത്തിനായി, ലൈൻ A20തുറന്നിരിക്കണം. ബിറ്റ് സജ്ജീകരിച്ചാണ് ഇത് ചെയ്യുന്നത് 1 തുറമുഖം 92 മണിക്കൂർ, ലൈൻ ക്ലോസിംഗ് A20- ഈ ബിറ്റ് പുനഃസജ്ജമാക്കുക.

അവസാന പ്രവർത്തനത്തെക്കുറിച്ച് വായനക്കാരന് ഇതിനകം പരിചിതമാണ്, അത് ഇനി അവനോട് ചോദ്യങ്ങൾ ഉന്നയിക്കരുത്.

അതിനാൽ, ഞങ്ങളുടെ പുതിയ, ആദ്യ പ്രോഗ്രാമിൻ്റെ ലിസ്റ്റിംഗ് നോക്കാം, അതിൽ ഒരു ചെറിയ സൈക്കിൾ ഇതിനകം നടപ്പിലാക്കുന്നു. മുമ്പത്തെ ലിസ്റ്റിംഗിലേക്ക് ചേർത്ത വരികൾ നക്ഷത്രചിഹ്നം (*) കൊണ്ട് അടയാളപ്പെടുത്തിയിരിക്കുന്നു.

org 100h

ആരംഭിക്കുക:

; ഞങ്ങൾ യഥാർത്ഥ മോഡിലാണ്

ക്ലി ;*

ഇൻഅൽ, 70h ;*
അഥവാഅൽ, 80h ;*
പുറത്ത് 70h, അൽ ;*

; ഓപ്പൺ ലൈൻ A20

ഇൻഅൽ, 92 മണിക്കൂർ ;*
അഥവാഅൽ, 2 ;*
പുറത്ത് 92h, അൽ ;*

പ്രസ്ഥാനം eax, cr0
അഥവാഅൽ, 1
പ്രസ്ഥാനം cr0, eax


; ചെറിയ ഇരട്ട ലൂപ്പ്

പ്രസ്ഥാനം cx, 20 ;*

സൈക്കിൾ: ;*
പ്രസ്ഥാനംകോടാലി, cx ;*
പ്രസ്ഥാനം cx, 0ffffh ;*
ലൂപ്പ് $ ;*
പ്രസ്ഥാനം cx, കോടാലി ;*
ലൂപ്പ്സൈക്കിൾ ;*

പ്രസ്ഥാനം eax, cr0
ഒപ്പംഅൽ, 0feh
പ്രസ്ഥാനം cr0, eax

; A20 ലൈൻ അടയ്ക്കുക

ഇൻഅൽ, 92 മണിക്കൂർ ;*
ഒപ്പംഅൽ, 0fdh ;*
പുറത്ത് 92h, അൽ ;*

ഇൻഅൽ, 70h ;*
ഒപ്പംഅൽ, 7fh ;*
പുറത്ത് 70h, അൽ ;*

sti ;*

റിട്ട ; പ്രോഗ്രാം പൂർത്തിയാക്കുക

ഒരു ക്ലീനിൽ നിന്ന് എക്സിക്യൂട്ടബിൾ ഫയൽ പ്രവർത്തിപ്പിക്കുന്നതിലൂടെ പ്രോഗ്രാം പ്രവർത്തിക്കുന്നുവെന്ന് നിങ്ങൾക്ക് ഉറപ്പാക്കാം MS-DOS. പ്രോഗ്രാം ശരിയായി പുറത്തുകടക്കുകയാണെങ്കിൽ, എല്ലാം ശരിയാണ്.

എന്നിരുന്നാലും, ഇനിപ്പറയുന്ന പ്രശ്നങ്ങളും ഉണ്ടാകാം:

1. കമ്പ്യൂട്ടർ മരവിപ്പിക്കുന്നു";

2. കമ്പ്യൂട്ടർ പുനരാരംഭിക്കുന്നു.

ഇനിപ്പറയുന്ന കാരണങ്ങളാൽ ഇത് സംഭവിക്കാം:

1. മോഡിൽ പ്രോഗ്രാം സമാരംഭിച്ചു V86(വെർച്വൽ മോഡ് 8086 );

2. സംരക്ഷിത മോഡിൽ അല്ലെങ്കിൽ ഒരു പ്രത്യേക ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തിന് കീഴിലാണ് പ്രോഗ്രാം സമാരംഭിക്കുന്നത്.

അതിനാൽ, പരിരക്ഷിത മോഡിൽ പ്രവർത്തിക്കുന്ന ഏതെങ്കിലും പ്രോഗ്രാം സമാരംഭിക്കുന്നതിന് മുമ്പ്, പ്രോഗ്രാമിന് തുടർന്നും പ്രവർത്തിക്കാനാകുമോ എന്ന് നിങ്ങൾ പരിശോധിക്കണം. ഇത് കൂടുതൽ ചർച്ച ചെയ്യും.

സംരക്ഷിത മോഡിലേക്ക് മാറാനുള്ള സാധ്യത പരിശോധിക്കുന്നു

മുമ്പത്തെ അധ്യായത്തിൽ ഞങ്ങൾക്ക് ഇനിപ്പറയുന്ന പ്രശ്‌നമുണ്ടായിരുന്നു: അത് പരിരക്ഷിത മോഡിലോ മോഡിലോ ആണെന്ന് പ്രോഗ്രാം തിരിച്ചറിയുന്നില്ല V86, ഇത് സിസ്റ്റം ഫ്രീസുചെയ്യുന്നതിനോ റീബൂട്ടുചെയ്യുന്നതിനോ നയിക്കുന്നു. ഞങ്ങൾ ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തിന് കീഴിൽ പ്രോഗ്രാം പ്രവർത്തിപ്പിക്കാൻ ശ്രമിക്കുകയാണെങ്കിൽ വിൻഡോസ്, അത് വിൻഡോസ്സംരക്ഷിത മോഡിലേക്ക് മാറാനുള്ള പ്രോഗ്രാമിൻ്റെ ശ്രമം പിടിക്കുകയും എമുലേഷൻ മോഡിൽ റീബൂട്ട് ചെയ്യാൻ ഓഫർ ചെയ്യുകയും ചെയ്യും MS-DOS(പ്ലാറ്റ്ഫോമിനായി 9x), അല്ലെങ്കിൽ പ്രോഗ്രാം നിർബന്ധിതമായി അവസാനിപ്പിക്കുക (പ്ലാറ്റ്ഫോം എൻ.ടി).

അതിനാൽ, ഞങ്ങൾ യഥാർത്ഥ മോഡിൽ ആണെന്ന് പരിശോധിക്കാൻ, ഞങ്ങൾ ഇനിപ്പറയുന്ന പ്രവർത്തനങ്ങൾ നടത്തണം:

1. രജിസ്റ്ററിൻ്റെ സീറോ ബിറ്റ് പരിശോധിക്കുക CR0;

2. വിൻഡോസ് ഓപ്പറേറ്റിംഗ് സിസ്റ്റം ലോഡ് ചെയ്തിട്ടില്ലെന്ന് ഉറപ്പാക്കുക.

രജിസ്റ്റർ നേരിട്ട് വായിച്ചാണ് ആദ്യ പ്രവർത്തനം നടത്തുന്നത് CR0രജിസ്റ്ററിൻ്റെ സീറോ ബിറ്റ് കൂടുതൽ പരിശോധിക്കുന്നതിനൊപ്പം EAX, AXഅഥവാ അൽ. ബിറ്റ് സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, ഞങ്ങൾ യഥാർത്ഥ മോഡിലാണ്. അല്ലെങ്കിൽ, പ്രോഗ്രാമിൻ്റെ തുടർന്നുള്ള നിർവ്വഹണം അർത്ഥശൂന്യമാകും.

രണ്ടാമത്തെ പ്രവർത്തനം ഫംഗ്ഷനെ വിളിച്ചാണ് നടത്തുന്നത് 1600hതടസ്സപ്പെടുത്തുന്നു 2fh. ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തിൻ്റെ നിലവിലെ പതിപ്പ് ലഭിക്കാൻ ഈ ഫംഗ്ഷൻ നിങ്ങളെ അനുവദിക്കുന്നു വിൻഡോസ്. രജിസ്റ്ററിലെ ഫംഗ്ഷൻ വിളിച്ചതിന് ശേഷം അൽപൂജ്യം അടങ്ങിയിരിക്കുന്നു, തുടർന്ന് ഓപ്പറേറ്റിംഗ് സിസ്റ്റം ലോഡ് ചെയ്തിട്ടില്ല. അല്ലെങ്കിൽ, വീണ്ടും, ഞങ്ങളുടെ പരിപാടി ഇനിയും തുടരുന്നതിൽ അർത്ഥമില്ല.

ഇനിപ്പറയുന്ന പ്രോഗ്രാമിൻ്റെ ഉദാഹരണം പരിഗണിക്കുക. ഇത് മുമ്പത്തെ പ്രോഗ്രാമിൻ്റെ പരിഷ്ക്കരണമാണ്; എല്ലാ പുതിയ നിർദ്ദേശങ്ങളും നക്ഷത്രചിഹ്നം (*) ഉപയോഗിച്ച് അടയാളപ്പെടുത്തിയിരിക്കുന്നു.

സംഘടന 100h

ആരംഭിക്കുക:

; സെഗ്മെൻ്റ് രജിസ്റ്ററുകൾ സജ്ജമാക്കുക

പ്രസ്ഥാനംകോടാലി, cs ​​;*
പ്രസ്ഥാനം ds, കോടാലി ;*

; ഞങ്ങൾ ശരിക്കും യഥാർത്ഥ മോഡിൽ ആണെന്ന് പരിശോധിക്കുന്നു

പ്രസ്ഥാനം eax,cr0 ;* പൂജ്യം ബിറ്റ് പരിശോധിക്കുക
പരീക്ഷഅൽ, 1 ;* CR0 രജിസ്റ്റർ ചെയ്യുക
jz no_pm ;*

പ്രസ്ഥാനം ah, 09h ;* DOS ഫംഗ്‌ഷൻ 09h
പ്രസ്ഥാനം dx, pm_msg ;* ലൈൻ ഔട്ട്പുട്ട്
int 21 മണിക്കൂർ ;*
റിട്ട;* പുറത്തുകടക്കുക

no_pm:
; വിൻഡോസിന് കീഴിൽ പ്രോഗ്രാം പ്രവർത്തിക്കുന്നുണ്ടോയെന്ന് പരിശോധിക്കുന്നു

പ്രസ്ഥാനംകോടാലി, 1600h ;* 1600h മൾട്ടിപ്ലക്‌സർ ഫംഗ്‌ഷൻ
int 2fh ;* തടസ്സങ്ങൾ - വിൻഡോസ് പതിപ്പ് നേടുക
പരീക്ഷഅൽ, അൽ ;* ഇല്ലെങ്കിൽ 0 - പിശക്
jz no_windows

; ഒരു പിശക് സന്ദേശം പ്രദർശിപ്പിക്കുക

പ്രസ്ഥാനംഓ, 09 മണിക്കൂർ ;*
പ്രസ്ഥാനം dx, win_msg ;*
int 21 മണിക്കൂർ ;*
റിട്ട ;*

no_windows:
; ഞങ്ങൾ തീർച്ചയായും യഥാർത്ഥ മോഡിലാണ്
; മാസ്ക് ചെയ്യാവുന്ന തടസ്സങ്ങൾ പ്രവർത്തനരഹിതമാക്കുക

; നോൺ-മാസ്‌കബിൾ ഇൻ്ററപ്റ്റുകൾ (NMI) പ്രവർത്തനരഹിതമാക്കുക

ഇൻഅൽ, 70h
അഥവാഅൽ, 80h
പുറത്ത് 70h, അൽ

; ഓപ്പൺ ലൈൻ A20

ഇൻഅൽ, 92 മണിക്കൂർ
അഥവാഅൽ, 2
പുറത്ത് 92h, അൽ

; സംരക്ഷിത മോഡിലേക്ക് മാറുക

പ്രസ്ഥാനം eax, cr0
അഥവാഅൽ, 1
പ്രസ്ഥാനം cr0, eax

; ഇപ്പോൾ ഞങ്ങൾ സംരക്ഷിത മോഡിലാണ്
; ചെറിയ ഇരട്ട ലൂപ്പ്

പ്രസ്ഥാനം cx, 20

ചക്രം:
പ്രസ്ഥാനംകോടാലി, cx
പ്രസ്ഥാനം cx,0ffffh
ലൂപ്പ് $
പ്രസ്ഥാനം cx, കോടാലി
ലൂപ്പ്ചക്രം

; യഥാർത്ഥ മോഡിലേക്ക് മാറുക

പ്രസ്ഥാനം eax, cr0
ഒപ്പംഅൽ, 0feh
പ്രസ്ഥാനം cr0, eax

; A20 ലൈൻ അടയ്ക്കുക

ഇൻഅൽ, 92 മണിക്കൂർ ;*
ഒപ്പംഅൽ, 0fdh ;*
പുറത്ത് 92h, അൽ ;*

; നോൺ-മാസ്‌കബിൾ ഇൻ്ററപ്റ്റുകൾ (NMI) പ്രവർത്തനക്ഷമമാക്കുക

ഇൻഅൽ, 70h ;*
ഒപ്പംഅൽ, 7fh ;*
പുറത്ത് 70h, അൽ ;*

; മാസ്ക് ചെയ്യാവുന്ന തടസ്സങ്ങൾ പ്രവർത്തനക്ഷമമാക്കുക

sti ;*

; ഞങ്ങൾ യഥാർത്ഥ മോഡിൽ തിരിച്ചെത്തി

റിട്ട ; പ്രോഗ്രാം പൂർത്തിയാക്കുക

; പിശക് സന്ദേശങ്ങൾ

pm_msg: ;*
db "പിശക്: പരിരക്ഷിത മോഡിൽ ഇതിനകം പ്രവർത്തിക്കുന്നു!$" ;*
win_msg: ;*
db "പിശക്: Microsoft Windows കണ്ടെത്തി!$" ;*
ഈ ഉദാഹരണം ഇതുവരെ 32-ബിറ്റ് കമാൻഡുകൾ നടപ്പിലാക്കുന്നത് കാണിക്കുന്നില്ല. ഇത് ചെയ്യുന്നതിന്, അടുത്ത അധ്യായത്തിലെ മെറ്റീരിയലുമായി നിങ്ങൾ സ്വയം പരിചയപ്പെടണം. കൂടാതെ, ഉദാഹരണത്തിന് ഇനിപ്പറയുന്ന പോരായ്മയുണ്ട്: ഫംഗ്ഷനുകളെ വിളിക്കുന്നു ഡോസ് (21 മണിക്കൂർ), ഇത് ഇതിനകം തന്നെ ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തിൽ നിന്നുള്ള ഞങ്ങളുടെ പ്രോഗ്രാമിൻ്റെ സ്വാതന്ത്ര്യത്തെ എതിർക്കാൻ തുടങ്ങുന്നു MS-DOS. ഭാവിയിൽ, നിങ്ങൾ ഓപ്പറേറ്റിംഗ് സിസ്റ്റം ഫംഗ്‌ഷനുകൾ ഒഴിവാക്കുകയും ഫംഗ്‌ഷനുകൾ ഉപയോഗിക്കുന്നതിലേക്ക് മാറുകയും വേണം ബയോസ്. എന്നാൽ ഇപ്പോൾ ഈ കോഡിലേക്ക് സ്വയം പരിമിതപ്പെടുത്തിയാൽ മതി.

എൻ്റെ താഴ്ന്ന നിലവാരത്തിലുള്ള പ്രോഗ്രാമിംഗ് കഴിവുകൾ മെച്ചപ്പെടുത്തുന്നതിനായി ഞാൻ നിലവിൽ x86 അസംബറുമായി കളിക്കുകയാണ്. 32-ബിറ്റ് സംരക്ഷിത മോഡിലെ അഡ്രസ്സിംഗ് സ്കീമിൽ എനിക്ക് നിലവിൽ ഒരു ചെറിയ പ്രശ്നമുണ്ട്.

സാഹചര്യം ഇതാണ്:

എൻ്റെ പക്കൽ 0x7e0-ൽ ലോഡുചെയ്ത ഒരു പ്രോഗ്രാം ഉണ്ട്, അത് CPU-നെ സംരക്ഷിത മോഡിലേക്ക് മാറ്റുകയും കോഡിലെ ഉചിതമായ മാർക്കിലേക്ക് കുതിക്കുകയും ചെയ്യുന്നു:

[...] സംരക്ഷിത മോഡിൽ സിപിയു മാറുന്നതിനുള്ള കോഡ് [...] jmp പ്രൊട്ടക്റ്റഡ് മോഡ് [...] ബിറ്റുകൾ 32 സംരക്ഷിത മോഡ്: .halt: hlt jmp .halt

ഇതുവരെ എല്ലാം മികച്ച രീതിയിൽ പ്രവർത്തിക്കുന്നു. "Jmp ProtectedMode" പ്രിഫെച്ച് ക്യൂ മായ്‌ക്കുന്നതിന് വ്യക്തമായ ഒരു കുതിച്ചുചാട്ടമില്ലാതെ പ്രവർത്തിക്കുന്നു, കാരണം ഈ പ്രോഗ്രാം ഓഫ്‌സെറ്റ് 0-ൽ ലോഡുചെയ്യുന്നു (തുടക്കത്തിൽ org 0), കോഡ് സെഗ്‌മെൻ്റിനെ ശരിയായ സ്ഥലത്തേക്ക് ചൂണ്ടിക്കാണിക്കാൻ പ്രേരിപ്പിക്കുന്നു.

"ProtectedMode" കുറുക്കുവഴിയിൽ 0x8000-ൽ നിന്ന് ലോഡുചെയ്ത മറ്റൊരു പ്രോഗ്രാമിലേക്ക് പോകാൻ ഞാൻ ആഗ്രഹിക്കുന്നു എന്നതാണ് എൻ്റെ നിലവിലെ പ്രശ്നം (ഞാൻ ഇത് ഒരു മെമ്മറി ഡംപ് ഉപയോഗിച്ച് പരീക്ഷിച്ചു, ലോഡ് ഫംഗ്ഷൻ ശരിയായി പ്രവർത്തിക്കുകയും പ്രോഗ്രാം 0x8000 വരെ ശരിയായി ലോഡ് ചെയ്യുകയും ചെയ്തു).

CPU ഇപ്പോൾ റിയൽമോഡിനേക്കാൾ പ്രൊട്ടക്റ്റഡ് മോഡിൽ ആയതിനാൽ, വിലാസ സ്കീം വ്യത്യസ്തമാണ്. നൽകിയിരിക്കുന്ന ഓഫ്‌സെറ്റ് ചേർക്കാനും ഫിസിക്കൽ വിലാസം നേടാനും (ഞാൻ മനസ്സിലാക്കിയതുപോലെ) ഡിസ്ക്രിപ്റ്റർ ടേബിളിലെ അടിസ്ഥാന വിലാസവും പരിധിയും പരിശോധിക്കാൻ പ്രൊട്ടക്റ്റഡ് മോഡ് ഡിസ്ക്രിപ്റ്ററുകൾ ഉപയോഗിക്കുന്നു. അതിനാൽ, പ്രൊട്ടക്റ്റഡ് മോഡ് നൽകുന്നതിന് മുമ്പ് GDT ഇൻസ്റ്റാൾ ചെയ്യേണ്ടതുണ്ട്.

എൻ്റേത് ഇതുപോലെ കാണപ്പെടുന്നു:

%ifndef __GDT_INC_INCLUDED__ % define __GDT_INC_INCLUDED__ ;************************************ ;* ഗ്ലോബൽ ഡിസ്ക്രിപ്റ്റർ ടേബിൾ (GDT) * ; ********************************** NULL_DESC: dd 0 ; null descriptor dd 0 CODE_DESC: dw 0xFFFF ; കുറഞ്ഞ dw 0 പരിമിതപ്പെടുത്തുക; അടിസ്ഥാന കുറഞ്ഞ db 0; ബേസ് മിഡിൽ ഡിബി 10011010ബി; ആക്സസ് db 11001111b; ഗ്രാനുലാരിറ്റി ഡിബി 0; അടിസ്ഥാന ഉയർന്ന DATA_DESC: dw 0xFFFF ; ഡാറ്റ ഡിസ്ക്രിപ്റ്റർ dw 0 ; കുറഞ്ഞ ഡിബി 0 പരിമിതപ്പെടുത്തുക; അടിസ്ഥാന കുറഞ്ഞ db 10010010b; ആക്സസ് db 11001111b; ഗ്രാനുലാരിറ്റി ഡിബി 0; അടിസ്ഥാന ഉയർന്ന gdtr: പരിധി dw 24 ; GDT ബേസിൻ്റെ ദൈർഘ്യം dd NULL_DESC ; GDT യുടെ അടിസ്ഥാനം %endif ;__GDT_INC_INCLUDED__

വഴി ജിഡിടി രജിസ്റ്ററിലേക്ക് ലോഡ് ചെയ്യുകയും ചെയ്തു

Lgdt

GDT ഉപയോഗിച്ച് പ്രൊട്ടക്റ്റഡ് മോഡിൽ 0x8000 എന്ന ഫിസിക്കൽ അഡ്രസിലേക്ക് ഞാൻ എങ്ങനെ പോകും എന്നതാണ് എനിക്ക് ഇപ്പോഴും മനസിലാകാത്തത്?

എൻ്റെ ആദ്യ ചിന്തകൾ 0x7e00 (നിലവിലെ പ്രോഗ്രാമുകൾ ലോഡ് ചെയ്‌തിരിക്കുന്നു) ചൂണ്ടിക്കാണിക്കുന്ന ഒരു കോഡ് ഡിസ്ക്രിപ്റ്റർ (CODE_DESC) തിരഞ്ഞെടുത്ത് 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 ; പ്രൊട്ടക്റ്റഡ് മോഡിലേക്ക് ചാടുന്നു ;****************** ;* A20 ഗേറ്റ് തുറക്കുന്നു * ;****************** OpenA20Gate: in അൽ, 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 , => പ്രവർത്തിക്കുന്നില്ല ;*************** ;* ഡാറ്റ ഫീൽഡുകൾ * ;* &ഉൾപ്പെടുന്നു * ;********** ******* %ഉൾപ്പെടുത്തുക "gdt_32.inc" ;****************** ;* സംരക്ഷിത മോഡ് * ;************* * ******* ബിറ്റുകൾ 32 സംരക്ഷിത മോഡ്: ;ഇവിടെ ഞാൻ ഫിസിക്കൽ ആഡർ 0x8000 (elf64 asm പ്രോഗ്രാം) ലേക്ക് പോകണം .halt: hlt jmp .halt

11