តើមុខងារការពារជាអ្វី ហើយវាភ្ជាប់មកជាមួយអ្វី? ការប្តូរប្រព័ន្ធដំណើរការ Intel ទៅរបៀបការពារ ប្តូរទៅរបៀបការពារឧបករណ៍ដំឡើង

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

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

អំពី FPZP, UFP DPVBCHMSEFUS CH TEBMSHOPN TETSYNE អំពី RTPGEUUPTBBI, LPFPTSHCHE RPDDETSYCHBAF 32-VYFOSCHK BDTEU (i386 Y CHCHYE) - DPVBCHMSAFUS OPCHSHEE, TEZHEUTSHE, CUPCHEE ECX, EDX, ESP, EBP, EIP, ESI, EDI, ទង់ជាតិ។ lBL NPTsOP DPZBDBFSHUS, LFP 32-VYFOSCH CHETUY PVSHYUOSCHI TEZYUFTPCH TEBMSHOPZP TETSINB (LYNEOY TEZYUFTB DPVBCHMSEFUS RTYUFBCHLB "E") ។ Chue 32-ine-in-chief Tezyufts LTPNE EIP DPUFHROSHSHEN TBMShopn TETCNEN, OP FLPN UMHUB VHDHF KOBNBFSh ប្រហែល 1 VBKF VPMSHYY (L នៅលើ DPVBCHMSEFUS UREGYBMSHSHKOK) ។ អំពី RTPGEUUPTE NMPPTSE 286 FY LPNBODSCH VHDHF OELPTTELFOSCH ។ nsch NPTsEN, OBRTYNET, OBRYUBFSH mov eax, 0x12345678 Y RPUME bfpzp ch AX VHDEF 0x5678, RPFPNH YuFP ON LBL VSH SCHMSEFUS "PLOPN" ch NMBDIKHA YUBUFSH TEZYUFTB EAX (BOBMPZYUOP, AL NMBDIBS YBUFSH AX). TEZYUFTB-PFPVTBTSEOYS UFBTYEK YUBUFY 32-VYFOSCHI TEZYUPTPC OE UHEEUFCHHEF - NPTsOP EI YYCHMEYUSH FPMSHLP U RPNPESH BTYZHNEFYLY (OBRTYNET, UDCHIOKBOUTFSH E6PeX 16, FPZDB CH AX VHDEF UFBTYBS RPMPCHYOB, OP UPDETTSYNPE NMBDYI VYF VHDEF KHFETSOP) ។ YuFP IBTBLFETOP, CH ЪBEEYEOOOPN TETSYNE OPVVPTPF, LPNBODSCH TBVPFSCH U 16-VYFOSHNY TEZYUFTBNY (OP OE 8-VYFOSHCHNY) FTEVHAF RTEZHYLU, RFPNH OUNPFTS យូប៊ីភីភីភីអេស បាទ, CH ЪBEEYEЈ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 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 PRNYPNYS PRNYS អ៊ី OBDP SCHOP KHLBYSCHBFSH, YUFP CHSH IPFYFE PVTBEBFSHUS YUETE OYI ។ oBRTYNET, mov ax, .

rPNYNP bFPZP TBUYYTEOYS TEZYUFTPC, DPVBCHMSAFUS OPCHCHCHHE HRTBCHMSAEYE TEZYUFTSH (TBOSHYE CHMYSM អំពី TETSYN TBVPFSH RTPGEUPTB FPMSHLP CR0) - CR0, 3 CRAND 2 eUFSH Y DTHZYE (OBRTYNET, PFMBDPUOSCH TEZYUFTSHCH), OP SING OBU UEKUB OE YOFETEUHAF ។ yNEOOOP U RPNPESHA LFYI TEZYUFTPC RTPYCHPDYFUS RETELMAYUEOYE RTPGEUTUPTB CH ЪBEEYEЈOOOSCHK TETSYN Y OBUFTPKLB OPCHSHHI ZHKHOLGYK CHTPDE UFTBOYUOPK BD ។ ច្រៀង 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 TETS 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 (អំពី UBNPN DEM EUFSH EE CHUSLYE TSS Y LDT, OP RPLB POY OBNOE CHBTCE) ។ h CS NPTsOP ЪБЗТХЦБФШ FPMSHLP OPNETB DEULTYRFPTCH, PRYUBOOSCHI LBL UEZNEOF LPDB, h PUFBMSHOSHE UEZNEOFOSHE TEZYUSTSH NPTsOP ЪBZTHTSBFSH BLZ MAVSHLC chBTSOBS TBJOYGB CH FPN, YuFP UEZNEOF LPDB NPTsOP FPMSHLP YUYFBFSH Y YURPMOSFSH, B UEZNEOF DBOOSHI FPMSHLP YUYFBFSH Y RYUBFSH ។ លីត្រ UYUBUFSHA, UEZNEOFSH NPZKhF RETELTSHCHBFSHUS CH RBNSFY, RPFPNH NPTsOP UPJDBFSH DCHB DEULTYRFPTB, UUSCHMBAEYEUS អំពី PDYO Y FFP TSEPM TEZYPO BOSFY, YOPNSFY, K DPUFKHROSCHN 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 ផ្កាយ (NBBDLUYN 3KFFLUYN -VYFOPN TETSYNE) ។ h FBLPN UMKHYUBE ZPCHPTSF, YuFP NSCH CHLMAYUYUMY TETSYN MYOEKOSCHI BDTEUPCH - UNEEOOYE UPPFCHEFUFCHHEF ZHIYYUEULPNH BDTEUKH ។ bFP PYUEOSH HDPVOP Y S RPKDH RP FPNH TSE RKhFY ។ OE UMEDHEF RSCHFBFSHUS YURPMSHЪPCHBFSH UEZNEOFBGYA CH UPEC PRETBGYPOOPK UYUFENE - LFP UYMSHOP HUMPTSOSEF LPD SDTB, SJSCHL CHSHUPLPZP KHTPCOS (OBRTYNET, អ៊ីយូអេហ្វភីភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសភីអេសអេភីអេសភីអេសភីភីអេសភីភីអេសភីភីអេសភីភីអេសភីភីអេសភីភីអេសភី)" SH CHCH UNPTSEFE RPMOPGEOOOP RTPZTBNNNYTPCHBFSH FPMSHLP អំពី Assembler) Y, OBLPOEG, CHCH OE UNPTSEFE RETEOUFY UYUFENKH អំពី DTHZHA BTIYFELFHTH, RPFPNKH YuFP x86 EDYOUFCHEOOBS, LFPTBS KHNEEF LFPF NEIBOYN (Y FP, CH 64-VYFOPN TETSYNE RPMS VBPCHPZP BDTEUB Y TBNETB UEZNEOFTUSHOPYZOPYH GYS P 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 ។ RETCHCHE EЈ 16 VYF UPDETSBF TBNET FBVMYGSHCH VBKFBI (FBLYN PVTBBPN, NBLUINBMSHOPE LPMYUUEUFCHP DEULTYRFPTPCH - 65536 / 8 = 8192), RPUMEDHAEKЪЪMYE 32 V TEU 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 Ј MENEOFBN ។ RETCHSHCHK BMENEOF FBVMYGSHCHUEZDB DPMTSEO VSCHFSH TBCHEO OKHMA Y MAVPE YURPMSHЪPCHBOIE OHMECHPZP UEMELFPTB(HLBBBFEMSH អំពី BMENEOF FBVMYGSH DEULTYRFPTPCH CH UEZNEOFOPN TEZYUFTE OBSCCHBEFUS FBL) RTYCHPDYF អិល PYYVLE ។ ъOBYUIF VPMEE-NEOOEE TBVPFPURPUPVOBS FBVMYGB DEULTYRFPTPCH DPMTSOB UPDETTSBFS IPFS VSH FTY DEULTYRFPTB - RHUFPK, DEULTYRFPT LPDB, DEULTYRFPT DBOSCHI ។

អូ YFP EEЈ UFPYF TBUULBЪBFSH, RTETSDE, YUEN NSCH RPRTPVKHEN RETEKFY CH ЪBEEYEЈOOOSCHK TETSYN? rPTsBMKhK, EEЈ UFPYF KHRPNSOKhFSH RTP KhTPCHOY DPUFKHRB ។ LPD SDTB UYUFENSH Y LPD RTYMPTSEOYK PFDEMEOSCH DTHZ PF DTHZB U FPK GEMSHA, YuFPVSH SDTP NPZMP RPMOPUFSHA KHRTBCHMSFSH RTPGEUUPTPN, B RTYMPTSEOYS OE NPZMY CHNEYBFCHED ស ព) ។ lPD YURPMOSEFUS U PRTEDEMIOOSCHN KHTPCHOEN RTYCHYMEZYK. h x86 YI GEMSHCHI 4 YFHLY - PF 0 DP 3. oKHMECHPK HTPCHEOSH UBNSCHK RTYCHYMEZYTPCHBOOSCHK (NPTSEF CHSHPRMOSFSH MAVSHCH LPNBODSCH Y NEOSFSH TETSYNSCH TBVPKUBCHK ។ lBL Y CH UMKHYUBE U UEZNEOFBGYEK, TBTBVPFYUYLY x86 RETEVPTEYMY U ZHKHOLGYPOBMPN Y CHUE PU YURPMSH'HAF MYYSH DCHB HTPCHOS YYUEFSHCHTI CHPNPTSOSCHI, B DTHZIE BTICH I. 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 CHUNUEZ ។

UEMELFPT UEZNEOFB, LPFPTSCHK UPDETSYFUS CH UEZNEOFOPN TEZYUFTE, SCHMSEFUS OE RTPUFP OPNETPN BMENEOFB CH FBVMYGE, OP Y KHLBBFEMEN HTPCHOS DPUFHRB - NMBYZFYE 2 វីភីអេហ្វភីធីធី ), B HCE UFBTYE OPNET UBNPK FBVMYGSHCH ។ fBLYN PVTBBN UEMELFPT = (YODELU_DEULTYRFPTB shl 2) + RPL ។ RPL- កម្រិតសិទ្ធិដែលបានស្នើសុំ - ЪBRTBYCHBENSCHK HTPCHEEOSH 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 KHTPCHHEOSH DPUFKHRB CH YUYUMPCHPN CHYDE OITSE, YUEN X OEZP UBNPZP ។ s, CHETPSFOP, PRYUBM DPUFBFPYuOP ЪBRKHFBOOP, OP CHRPMOE NPTsOP PVPKFYUSH RPL = DPL, LBL NSCH Y RPUFHRIN ។

rPLB NSCH RYYEN FPMSHLP SDTP, NSCH VHDEN TBVPFBFSH CH OHMECHPN LPMSHGE ЪBEIFSHCH (FBL EEЈ OBSCHCHBAF KhTPCHOY RTYCHYMEZYK), YUFPVSH YNEFSH RPMOSHCHK DPUFHRK L BRR.

UEZNEOFBGYS OBNOE OHTSOB, RPPFPNH S OE VHDH PUFBOBCHMYCHBFSHUS RPLB YuFP អំពី 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 dq 0x00CF9A000000FFFF ; លេខកូដ - 8 dq 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 $

RETED RETEIPDPN CH ЪBEEYEЈOOSHK TETSYN OEPVIPDYNP ЪBRTEFIFSH RTYEN BRRBTBFOSCHI RTETSCHCHBOYK (LMBCHYBFKHTB, NSHCHYSH, FBKNET Y DTHZIE KHUFTPKUFCHB), យូអេហ្វភីភីភីភីភីភីអេហ្វអេហ្វ.ប៊ី UCHPY PVTBVPFYUYLY 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, RFPNH YURPMSHJKHEN EAX) ។ oEUNPFTS អំពី FP, YuFP NSCH HCE RETEYMY CH ЪBEEYEYOOOSCHK TETSYN, LPD RTDPDPMTSBEF YURPMOSFSHUS RP-RTETSOENH 16-VYFOSHCHK ។ dMS PLPOYUBFEMSHOPZP RETEIPDB OBN OHTSOP PVOPCHYFSH UPDETSYNPE UEZNEOFOSCHI TEZYUPTPCH ។ DYTELFYCHB BUUENVMETB ប្រើប្រាស់32 ZPCHPTYF ENKH, YuFP DBMSHOEKYK LPD CHSHRPMOSEFUS CH ЪBEEYEOOOPN TETSINE Y OEPVIPDYNP RETELMAYUFSHUS CH TETSIN ZEOETBGYY LPNFPZ BOD 6 ម៉ោង RP KHNPMYUBOYA សហរដ្ឋអាមេរិក) ។

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 VSHMP DP OBU) ។ rTEDRPUMEDOSS LPNBODB DENPOUFTYTHEF OBN CHPNPTSOPUFY ЪBEEYEOOOPZP TETSYNB - NSCH PVTBEBENUS RP BVUPMAFOPNH 32-VYFOPNH BDTEUKH អិល CHYDEP-RBNSFY, FELPCHPPBZ! CH RTBCHSHCHK OYTSOYK KHZPM LBOBOB (FELUFPCHSHCHK LLTBO JNEEF TBTEYOEYE 80 x 25 UYNCHPMPCH, LBTSDSCHK UYNCHPM ЪBOYNBEF CH RBNSFY DCHB VBKFB - LPD UYNCHPSHPMB) ។

nsch VPMSHYE OE NPTSE PVTBEBFSHUS L UETCHYUBN BIOS, FERTSH 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) - VEULYUBEN ។

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ЪBBEEYEYE lFP 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 ЪBEEYEOOS TEUYFSHCHBFSH ។

h ЪBCHETYEOYE CHSHCHRKHULB, RPTSBMKHK, DPVBCHMA RPUMEDOYK YFTYI - RTPCHETLH, YuFP RTPGEUUPT RPDDETSYCHBEF ЪBEEYEЈOOSHCHK TETSIN ។ UHFSH RTPCHETLY CH FPN, YuFP OE CHUE VYFSH ទង់ NPTsOP YYNEOIFSH RTPZTBNNOP ​​។ FP EUFSH TEZYUFT OE UPCUEN 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 UPDETSYNPE UFELB PE ទង់។ fBLYN PVTBUPN EZP NPTsOP NEOSFSH GEMYLPN, BOE PFDEMSHOSCHNY LPNBODBNY ។ ChPF RPMOSCHK LPD OBEZP ЪBZТХЪУЛБ៖

org 0x7C00 jmp boot ; ъБЗПМПЧПЛ 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 ? ..",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 ; tBVYEOYE UFTPLAY DS:SI RP UINCHPMH 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 @: 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 call load_file ; mov dx, 0x1000 .parse_line: mov si, dx .parse_char: lodsb test al, jz .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 byte, "#" je .parse_line ; lPNNEOFBTYK cmp byte, "L" គឺ .load_file ; ъБЗТХЛБ ЖБКМБ cmp byte, "S" je .start ; ъBRHUL SDTB; oEYCHEUFOBS LPNBODB mov al, mov [.cmd], al call error db "Unknown boot script command "" .cmd db ? db ""!",13,10,0 .config_end: ; rTY RTBCHYMSHOPN LPOZHYZHTBGYPOOPN ZHBKME NSHCH 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, bx mov cx, 16 mul cx mov word, ax word, dx mov word, 0 mov word, 0 pop ax shr ax, 9 - 4 បន្ថែម bx, ax បន្ថែម 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 push ax popf pushf pop bx cmp ax, bx je @f call error db "Required i386 or better",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 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 នៅលើអ៊ីនធឺណិត ហើយ iley និង pehat បាននិយាយអំពីរបៀបនេះបន្តិច ប៉ុន្តែខ្ញុំត្រូវបានស្នើឱ្យពណ៌នាវាក្នុងន័យទូទៅយ៉ាងណាក៏ដោយ។ ឥឡូវនេះខ្ញុំនឹងសង្ខេបទ្រឹស្តី (តាមពិតទៅ Intel បានសរសេរ mana ពិសេសសម្រាប់រឿងនេះ) បន្ទាប់មកយើងនឹងចាប់ផ្តើមសរសេរកូដ។

ការណែនាំអំពីរបៀបការពារ។
ដូច្នេះ PM គឺខុសគ្នាយ៉ាងខ្លាំងពីទម្រង់ពិត (RM) ដែលធ្លាប់ស្គាល់គ្រប់គ្នាតាំងពីជំនាន់ DOS មក។ ឥឡូវនេះអ្នកនឹងត្រូវប្រើវា៖ មិនមានផ្នែកឋិតិវន្ត 64 គីឡូបៃ គ្មានតារាងរំខានក្នុង 1 គីឡូបៃ គ្មានអាសយដ្ឋានមូលដ្ឋានផ្នែកនៅក្នុងការចុះឈ្មោះផ្នែក ជាទូទៅពិភពលោកថ្មីទាំងស្រុង។
ឥឡូវនេះផ្នែកត្រូវបានពិពណ៌នានៅក្នុង តារាងពិពណ៌នាសកល (GDT). តារាងនេះអាចមានតែនៅក្នុងច្បាប់ចម្លងមួយប៉ុណ្ណោះ។ នាងគឺជារចនាសម្ព័ន្ធនៅក្នុងការចងចាំ។ មិនមែនជាផ្នែកទេ! វាអាចមានទីតាំងនៅគ្រប់ទីកន្លែងក្នុងអង្គចងចាំ ប៉ុន្តែអាសយដ្ឋាន និងដែនកំណត់របស់វាត្រូវបានសរសេរទៅកាន់ការចុះឈ្មោះ GDTR ។ នេះគឺជារចនាសម្ព័ន្ធរបស់វា៖

តារាងខ្លួនវាមានកំណត់ត្រានៃរចនាសម្ព័ន្ធដូចខាងក្រោម (ដោយវិធីនេះ សូន្យកំណត់ត្រាគឺទទេ។ វាសំខាន់។ នៅពេលចូលប្រើអង្គចងចាំ 'ពិពណ៌នា' ដោយសូន្យអ្នកពណ៌នា អ្នកនឹងទទួលបាន #GP - កំហុសការពារទូទៅ)៖
ចូរយើងពិនិត្យមើលឱ្យកាន់តែច្បាស់អំពីរចនាសម្ព័ន្ធនេះ។

1. ដែនកំណត់ផ្នែក៖
គោលបំណងនៃវាលនេះគឺច្បាស់លាស់ពីឈ្មោះប៉ុន្តែមានល្បិចមួយ។ ឆ្កែត្រូវបានកប់នៅក្នុង G (Granularity) ប៊ីត។
ប្រសិនបើវាមិនត្រូវបានកំណត់ នោះអង្គចងចាំត្រូវបាន 'រាប់' ជាបៃ។ ក្នុងករណីនេះ ទំហំចម្រៀកអាចប្រែប្រួលពី 1 បៃទៅ 1 មេកាបៃក្នុងមួយទំហំ 1 បៃ។
ប្រសិនបើយើងកំណត់វាទៅជា 1 នោះអាសយដ្ឋានអង្គចងចាំទំព័រនឹងត្រូវបានណែនាំ។ បន្ទាប់មកយើងនឹងអាចដោះស្រាយពី 4 គីឡូបៃទៅ 4 ជីហ្គាបៃនៃ RAM ជាមួយនឹងការផ្លាស់ប្តូរទំហំ 4 គីឡូបៃ (ទំហំទំព័រ) ។ ជាទូទៅ អាសយដ្ឋានទំព័រគឺល្អជាង (ប្រៀបធៀប (1MB+64Kb-16bytes) និង 4GB)។ សូម​និយាយ​តែ​អំពី​ការ​កំណត់​ផ្នែក​នៅ​ក្នុង​ការ​ប្រកាស​នេះ។ ទំព័រសមនឹងទទួលបានការពិភាក្សាដាច់ដោយឡែក។

2. អាសយដ្ឋានមូលដ្ឋាន៖
នៅទីនេះយើងចង្អុលបង្ហាញអាសយដ្ឋានរូបវន្តនៃមូលដ្ឋាន។

3. ប្រភេទវាល៖
បន្សំប៊ីតកំណត់ប្រភេទផ្នែក៖

4. S (ប្រភេទពិពណ៌នា):
ឯកសាររបស់ Intel និយាយថាប្រសិនបើប៊ីតនេះមិនត្រូវបានកំណត់ទេនោះ អ្នកពិពណ៌នានេះគឺសម្រាប់ផ្នែកប្រព័ន្ធ បើមិនដូច្នេះទេ - កូដ ឬទិន្នន័យ។ តាមប្រព័ន្ធ យើងមានន័យថា LDT, TSS, Interrupt Gates និងអ្នកផ្សេងទៀតចូលចិត្តពួកគេ (បន្ថែមលើពួកវានៅពេលក្រោយ)។

5. DPL (កម្រិតសិទ្ធិអ្នកពណ៌នា)៖
សិទ្ធិនៃផ្នែកដែលបានពិពណ៌នា។ មនុស្សគ្រប់គ្នាស្គាល់ Rings ។

6. P (ផ្នែកបច្ចុប្បន្ន):
ប្រសិនបើប៊ីតនេះត្រូវបានកំណត់ នោះខួរក្បាល 'ដឹង' ថាផ្នែកនេះស្ថិតនៅក្នុងអង្គចងចាំរួចហើយ (ទោះបីជាវាប្រសើរជាងក្នុងការនិយាយថាត្រឹមត្រូវក៏ដោយ) ។ ប្រសិនបើអ្នកផ្ទុកឧបករណ៍ជ្រើសរើសអ្នកពណ៌នាជាមួយនឹង P bit មិនបានកំណត់ទៅក្នុងបញ្ជីផ្នែក ការលើកលែង #NP (មិនមានវត្តមាន) នឹងកើតឡើង។ ជាទូទៅ ខ្ញុំនឹងពន្យល់ពីអត្ថន័យនៃឃ្លាដ៏ប្រណិតនេះបន្តិចនៅពេលក្រោយ។

7.D/B៖
វាត្រូវបានបកស្រាយខុសៗគ្នាសម្រាប់ផ្នែកនៃប្រភេទផ្សេងៗគ្នា។
1. សម្រាប់ផ្នែកកូដ៖
ប្រវែងអាស័យដ្ឋានដែលមានប្រសិទ្ធភាព 32 ឬ 16 ប៊ីត និងទំហំប្រតិបត្តិការ។
(1-32; 0-16);
2. សម្រាប់ជង់៖
ទ្រនិចជង់គឺ 32 ឬ 16 ប៊ីត។ (១-៣២; ០-១៦);

៨.ជី៖
ប៉ះពាល់ដល់ឯកតា (បៃ, ទំព័រ) ដែលដែនកំណត់ផ្នែកត្រូវបានវាស់។ ជាទូទៅ Paging អាចត្រូវបានបើកនៅពេលចូលទៅកាន់ PM ដោយកំណត់ bit 31 នៃការចុះឈ្មោះ CR0 ។

ព័ត៌មានបន្ថែមមួយចំនួន៖
យើង​ស្មាន​ថា​ពាក្យ​សកល​មិន​ត្រូវ​បាន​គេ​ដាក់​ដោយ​ឥត​ប្រយោជន៍​ទេ។ ដូច្នេះមានសញ្ញាមួយទៀត។ ត្រូវហើយក៏មានដែរ។ តារាងពិពណ៌នាក្នុងស្រុក. វាអាចមានភាពខុសគ្នាដ៏អស្ចារ្យនៃពួកគេ។ ជាឧទាហរណ៍ គេអាចប្រើប្រាស់ក្នុងការអនុវត្តកិច្ចការនានា។ល។ ប៉ុន្តែ អិលឌីធីបង្កើតជាផ្នែកមួយរួចហើយ! ដូច្នេះ​ត្រូវ​ប្រើ​ឃ្លា​ដូចជា 'អ្នក​ពណ៌នា​ផ្នែក​តារាង​អ្នក​ពណ៌នា​មូលដ្ឋាន'។

បន្ទាប់​ពី​យើង​បាន​រៀប​រាប់​តារាង​ហើយ យើង​ត្រូវ​ផ្ទុក​វា​ទៅ​ក្នុង​ការ​ចុះឈ្មោះ GDTR. នេះមិនត្រូវបានធ្វើឡើងដោយ mov ទេ។ GDTRបំពេញដោយពាក្យបញ្ជា lgdt fword (តម្លៃ). នោះគឺអ្នកត្រូវបង្កើតរចនាសម្ព័ន្ធនេះដោយខ្លួនឯងហើយផ្ទុកវាទៅក្នុងបញ្ជីដែលបានរៀបរាប់ខាងលើ។ នៅមានក្រុមដែលធ្វើការជាមួយនឹងការចុះឈ្មោះនេះ ប៉ុន្តែយើងកំពុងដើរឆ្លងទ្វីបអឺរ៉ុប។

រឿងមួយទៀត។ នៅក្នុង PM ការចុះឈ្មោះផ្នែកមិនរក្សាទុកអាសយដ្ឋានមូលដ្ឋាននៃផ្នែក (ដូចនៅក្នុង RM) ប៉ុន្តែអ្វីដែលត្រូវបានបណ្តុះបណ្តាលជាពិសេសហៅថា អ្នកជ្រើសរើស. រចនាសម្ព័ន្ធរបស់ពួកគេមានដូចខាងក្រោម៖

សន្ទស្សន៍នៅទីនេះគឺជាលេខធម្មតានៃអ្នកពណ៌នាក្នុងតារាង។
TI បង្ហាញកន្លែងដែលត្រូវរកមើលអ្នកពណ៌នា (ក្នុង GDTអិលឌីធី).

ឥឡូវនេះវាច្បាស់អំពីរបៀបបង្កើតតុមួយ យើងនិយាយអំពីរបៀបទៅ PM (ចំណាំ វាអាចធ្វើបានតែពី RM ប៉ុណ្ណោះ)។ ជាទូទៅ... អ្នកគ្រាន់តែត្រូវកំណត់ bit 0 នៃ control register CR0។ ទោះបីជាខ្ញុំកំពុងនិយាយកុហកក៏ដោយ។ ដំបូងអ្នកត្រូវបិទការរំខានទាំងអស់ ( NMI (ការរំខានដែលមិនអាចបិទបាំងបាន។) រួមទាំង) បើកបន្ទាត់អាសយដ្ឋាន ក២០(ដូច្នេះអាសយដ្ឋាន 32 ប៊ីតអាចប្រើបាន) ទាញយក GDTRហើយលោតលើសញ្ញា - ចាប់ផ្តើម។

តោះប្រើកម្មវិធីផ្ទុកទិន្នន័យ (អ្នកអាចប្រើ KOLIBRI's) ដែលនឹងផ្ទុកកូដរបស់យើងទៅអាសយដ្ឋាន 1000h:0 (អាសយដ្ឋានរបស់ RM ខ្ញុំចំណាំ)។
នៅទីនេះ មិនមែនអ្វីៗទាំងអស់នឹងរលូនដូចនៅក្នុង manas ទាំងនោះនៅពេលដែលពួកគេប្តូរទៅ PM ដោយផ្ទាល់ពីកម្មវិធីចាប់ផ្ដើមប្រព័ន្ធនោះទេ។ អ្វីគ្រប់យ៉ាងគឺស្មុគស្មាញបន្តិច។ ប៉ុន្តែ​ជា​ដំបូង សូម​មើល​កូដ​ដែល​កម្មវិធី​ចាប់ផ្ដើម​នឹង​ផ្ទុក (យើង​សរសេរ​អ្វី​គ្រប់​យ៉ាង​នៅ​លើ FASM) នេះ​ជា​ប្រភេទ​នៃ helloworld ចូរ​ចាប់ផ្ដើម​ចូល​ទៅ PM ហើយ​បោះពុម្ព​ពាក្យ​សួរ​សុខទុក្ខ។

ធ្វើទ្រង់ទ្រាយប្រព័ន្ធគោលពីរ
xor ax, ax
cli ចាប់ផ្តើមការចុះឈ្មោះផ្នែកឡើងវិញ
mov ss, ax
xor sp, sp
ស្ទី
mov ពូថៅ, ៣
ក្នុងរយៈពេល 10 ម៉ោង។

Jmp 1000h: r_start

Mov ax,1000h;កំណត់រចនាសម្ព័ន្ធការចុះឈ្មោះឡើងវិញ
mov ds,ax
ផ្លាស់ទី es, ax

នៅក្នុង al, 0x92; បើក A20
ឬអាល់, ២
ចេញ 0x92, al

Lgdt fword ; ផ្ទុកការចុះឈ្មោះ GDTR
mov eax,cr0
ឬ al, 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_SIZE នៅ $-GDT
GDTR៖
dw GDT_SIZE-1
dd GDT + 10000 ម៉ោង។
; អ្នកត្រូវសរសេរអាសយដ្ឋាន 32 ប៊ីត។ ឥឡូវនេះយើងស្ថិតនៅក្នុងផ្នែក 1000h ដែលមូលដ្ឋានគឺ 1000h * 10h (ដោយអាសយដ្ឋានរូបវន្ត) => អាសយដ្ឋានរូបវន្តនៃ GDTR (ស្លាក!) = 10000h (អាសយដ្ឋានរូបវន្តនៃផ្នែកមូលដ្ឋាន) + អុហ្វសិត

និម្មិត ឥឡូវនេះ តាមការពិត យើងបំពេញចន្លោះរហូតដល់ចុងបញ្ចប់នៃផ្នែក
rb 10000h-$;
បញ្ចប់និម្មិត
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;
ប្រើ ៣២
។ ដូច្នេះនៅទីនេះ។

Startup32: ;ចំណុចចូលដល់ PM
mov ax,10h ; នៅទីនេះយើងរុញឧបករណ៍ជ្រើសរើស។ ជាញឹកញាប់ (! កុំភ្លេចអំពីលេខស៊េរីនៅក្នុង
mov es,ax ;table) ចម្រៀកលេខកូដជ្រើសរើស - 08h. ទិន្នន័យ - 10 ម៉ោង, ផ្នែកវីដេអូ - 18 ម៉ោង។
mov ds,ax
mov fs,ax
mov ss, ax
mov esp,10000h;ជង់
mov ax, 18h
mov gs, ax

ផ្លាស់ទី esi,hi_string ;សូមបង្ហាញថាយើងបានឆ្លងកាត់ដោយជោគជ័យ
ហៅបោះពុម្ព
jmp$

; ESI - អាសយដ្ឋានបន្ទាត់
បោះពុម្ព៖
រុញ
xor ebx, ebx
mov ah,07h;គុណលក្ខណៈ
ដាក់៖
mov al,
mov, ពូថៅ
inc ebx
សាកល្បង al, al
jnz ដាក់
ប៉ុប
រ៉េត
hi_string db 'សូមស្វាគមន៍មកកាន់ PM, dude',0

តើយើងបានធ្វើអ្វី? កម្មវិធីផ្ទុកទិន្នន័យបានផ្ទុកពួកយើងដោយជោគជ័យនៅអាសយដ្ឋាន 1000h:0 ពីកន្លែងដែលយើងបន្តប្រតិបត្តិ។ ដំបូងបានបើក ក២០បិទការរំខានទាំងអស់ បញ្ចូលទៅក្នុង GDTRតម្លៃសមរម្យ លោតទៅស្លាកធាតុ។ ខ្ញុំកត់សំគាល់ថាយើងបានលោត
jmp fword 08h: ការចាប់ផ្តើម 32
នោះ​គឺ 08h គឺជា​អ្នក​ជ្រើសរើស​ពណ៌នា​កូដ។ ស៊ាំនឹងវា។

ឥឡូវនេះរបៀបបើកអព្ភូតហេតុនេះ។ ដោយផ្ទាល់ខ្ញុំប្រើ WinImage និង VirtualBox ។ យើងរុញកម្មវិធីចាប់ផ្ដើមប្រព័ន្ធចូលទៅក្នុងផ្នែកចាប់ផ្ដើមនៃថាសទន់ ហើយដាក់ឯកសារ .bin ជា root ។ យើងរក្សាទុកវានៅក្នុង .vfd បញ្ជាក់ផ្លូវទៅកាន់រូបភាពថាសទន់ក្នុងលក្ខណសម្បត្តិរបស់ម៉ាស៊ីននិម្មិត បើកដំណើរការវា ហើយមើលលទ្ធផល។

នៅក្នុងបញ្ហាបន្ទាប់ យើងនឹងពិនិត្យមើលការរំខាន កំហុស អន្ទាក់ ការរំលូតកូន និងរបៀបដែលពួកគេធ្វើការ ត្រូវបានគេចាប់ និងបំបាត់កំហុស។ ចូរចាប់ផ្តើមនិយាយអំពីស្ថាបត្យកម្ម។

ប្រភពនៃព័ត៌មាន។
1) ខ្ញុំសូមថ្លែងអំណរគុណភ្លាមៗចំពោះ Phantom_84 aka egos ដែលបានចង្អុលបង្ហាញផ្លូវត្រូវ និងជួយខ្ញុំតាំងពីដើមដំបូង។ បើ​គ្មាន​គាត់ វា​នឹង​ពិបាក​ជាង​សម្រាប់​ខ្ញុំ​ក្នុង​ការ​ដោះស្រាយ​វា។

ដំណើរការទាំងអស់។ ក្រុមហ៊ុន Intelចាប់ផ្តើមជាមួយ i80286 និងរហូតដល់ និងរួមទាំងចុងក្រោយ នៅពេលដែលការផ្គត់ផ្គង់ថាមពលត្រូវបានបើក (បន្ទាប់ពី "កំណត់ឡើងវិញ" ដំបូង) ពួកគេដំណើរការក្នុងរបៀបអាសយដ្ឋានពិត (របៀបពិត)។ ជាធម្មតា របៀបពិតត្រូវបានប្រើជាទម្រង់កម្រិតមធ្យម ដើម្បីប្តូរទៅរបៀបការពារបន្ទាប់ពីចាប់ផ្តើមប្រព័ន្ធមីក្រូដំណើរការ ឬសម្រាប់ដំណើរការកម្មវិធីលឿនជាងមុនដែលសរសេរសម្រាប់ microprocessors 8086 , 80186 ប៉ុន្តែបើប្រៀបធៀបទៅនឹង 8086 , 80186 , microprocessors ទំនើបនៅក្នុងរបៀបពិតមានសំណុំធំទូលាយនៃការណែនាំដែលអាចប្រតិបត្តិបាន និងសមត្ថភាពក្នុងការដំណើរការ 32-bit operands។
ការប្តូរខួរក្បាលទៅជារបៀបការពារពីរបៀបពិតត្រូវបានអនុវត្តដោយការបញ្ចូលទៅក្នុង CR0(រូបទី 1) ពាក្យដែលមានតម្លៃតែមួយនៃប៊ីត PE ( ការពារ បើក) សម្រាប់ភាពឆបគ្នាជាមួយកម្មវិធី 80286 ប៊ីត PE ក៏អាចត្រូវបានកំណត់ដោយប្រើការណែនាំ LMSW ផងដែរ។ មុនពេលប្តូរ តារាងពិពណ៌នាចាំបាច់ត្រូវតែចាប់ផ្តើមនៅក្នុងអង្គចងចាំ អាយឌីធីនិង GDT. ភ្លាមៗបន្ទាប់ពីបើករបៀបការពារ ខួរក្បាលមាន CPL = 0.

អង្ករ។ ១

សម្រាប់ប្រព័ន្ធដំណើរការ 32 ប៊ីតទាំងអស់ លំដាប់នៃជំហានខាងក្រោមត្រូវបានណែនាំឱ្យប្តូរទៅរបៀបការពារ៖
1. បិទការរំខានដែលអាចបិទបាំងបានដោយកំណត់ទង់ IF ឡើងវិញ និងទប់ស្កាត់ការកើតឡើងនៃការរំខានដែលមិនអាចបិទបាំងបានជាមួយនឹងតក្កវិជ្ជាខាងក្រៅ កូដកម្មវិធីក្នុងអំឡុងពេល "ការផ្លាស់ប្តូរ" ត្រូវតែធានាអវត្តមាននៃករណីលើកលែង និងមិនត្រូវប្រើកម្មវិធីរំខាន។ តម្រូវការនេះត្រូវបានបង្កឡើងដោយការផ្លាស់ប្តូរនៅក្នុងយន្តការសម្រាប់ការហៅទូរស័ព្ទទៅអ្នកដោះស្រាយការរំខាន។
2. បង្ហោះទៅ GDTRអាសយដ្ឋានមូលដ្ឋាន GDT(ការណែនាំ LGDT) ។
3. ការណែនាំ MOV CROកំណត់ទង់ PE ហើយប្រសិនបើការគ្រប់គ្រងអង្គចងចាំទំព័រត្រូវបានទាមទារ នោះទង់ PG ។
4. ភ្លាមៗបន្ទាប់ពីនេះ ពាក្យបញ្ជាលោតចន្លោះ ( JMP Far) ឬទូរស័ព្ទទៅ ( ហៅទៅឆ្ងាយ) ដើម្បីជម្រះជួរនៃការណែនាំដែលបានឌិកូដក្នុងរបៀបពិត និងអនុវត្តដំណើរការសៀរៀលនៃដំណើរការ។ ប្រសិនបើទំព័រត្រូវបានបើក នោះលេខកូដណែនាំ MOV CROនិង JMPហៅត្រូវតែនៅក្នុងទំព័រដែលអាសយដ្ឋានរូបវន្តគឺដូចគ្នានឹងអាសយដ្ឋានឡូជីខល (សម្រាប់លេខកូដដែលការគ្រប់គ្រងត្រូវបានផ្ទេរ តម្រូវការនេះមិនត្រូវបានដាក់ទេ)។
5. ប្រសិនបើអ្នកមានគម្រោងប្រើតារាងពណ៌នាក្នុងស្រុក ការណែនាំ LLDTផ្ទុកឧបករណ៍ជ្រើសរើសផ្នែកសម្រាប់ អិលឌីធីទៅចុះឈ្មោះ LDTR
6. ការណែនាំ LTRផ្ទុកឧបករណ៍ជ្រើសរើសទៅក្នុងបញ្ជីភារកិច្ច TSSសម្រាប់ភារកិច្ចរបៀបការពារដំបូង។
7. ផ្ទុកការចុះឈ្មោះផ្នែកឡើងវិញ (លើកលែងតែ CS) មាតិកាដែលនៅតែស្ថិតក្នុងទម្រង់ពិត ឬអនុវត្តការផ្លាស់ប្តូរ ឬហៅទៅកិច្ចការផ្សេងទៀត (ក្នុងករណីនេះ ការចុះឈ្មោះនឹងត្រូវបានផ្ទុកឡើងវិញដោយស្វ័យប្រវត្តិ)។ ការចុះឈ្មោះផ្នែកដែលមិនប្រើត្រូវបានផ្ទុកដោយតម្លៃជ្រើសរើសសូន្យ។
8. ការណែនាំ LIDTផ្ទុកទៅចុះឈ្មោះ IDTRអាសយដ្ឋាន និងដែនកំណត់ អាយឌីធី- តារាងនៃរបៀបការពាររំខានអ្នកពិពណ៌នា។
9. អនុញ្ញាតឱ្យមានការរំខានផ្នែករឹងដែលអាចបិទបាំងបាន និងមិនអាចបិទបាំងបាន។

អត្ថបទនេះផ្តល់នូវការណែនាំខ្លះៗចំពោះការអភិវឌ្ឍន៍កម្មវិធីដែលដំណើរការក្នុងរបៀបដំណើរការការពារ។ នៅទីនេះភារកិច្ចចម្បងនៃកម្មវិធីណាមួយដែលដំណើរការក្នុងរបៀបការពារនឹងត្រូវបានបញ្ជាក់ ហើយដំណោះស្រាយរបស់ពួកគេនឹងត្រូវបានផ្តល់ឱ្យ។ ជាទូទៅ កម្មវិធីនឹងត្រូវបានសរសេរជាភាសា FASM.

របៀបប្រតិបត្តិការរបស់ Intel 80386 processor

ជាមួយនឹងការមកដល់នៃខួរក្បាល ក្រុមហ៊ុន Intel 80386ស្ថាបត្យកម្មបានកើតឡើង IA32. វាសន្មត់ថាការកើតឡើងនៃរបៀបប្រតិបត្តិការរបស់ខួរក្បាលថ្មី - ការពារ (" របៀបការពារ") សម្រាប់ភាពឆបគ្នាជាមួយនឹងដំណើរការពីមុននៅក្នុងបន្ទាត់ ក្រុមហ៊ុន Intel 80x86ស៊ីភីយូ 80386 មិន​បាន​ចាប់​ផ្តើ​ម​ភ្លាម​ក្នុង​របៀប​ការពារ​, ប៉ុន្តែ​បាន​ធ្វើ​ការ​នៅ​ក្នុង​អ្វី​ដែល​ហៅ​ថា​របៀប​ពិត (" របៀបពិត") លើសពីនេះ របៀបនីមួយៗមាន submodes មួយ ឬច្រើន។ តោះមើលពួកវា។

របៀបពិត

ខួរក្បាលស្ថិតនៅក្នុងរបៀបនេះភ្លាមៗបន្ទាប់ពីចុច " ថាមពល" កុំព្យូទ័រ។ ការចូលប្រើអង្គចងចាំក្នុងរបៀបពិតត្រូវបានអនុវត្តដោយការសាងសង់ " ផ្នែក៖ អុហ្វសិត" ដែលពិពណ៌នាអំពីអាសយដ្ឋានឡូជីខល។ តម្លៃផ្នែកដូចជាអុហ្វសិតមានចាប់ពី 0 ទៅ 0FFFFh.

ដោយសារអាសយដ្ឋានអាចត្រូវបានធ្វើតែក្នុងផ្នែកមួយប៉ុណ្ណោះ ទំហំផ្នែកអតិបរមាគឺ 64 គីឡូបៃ អាសយដ្ឋានរូបវន្ត ដែលត្រូវបានកំណត់នៅលើរថយន្តក្រុងអាសយដ្ឋាន processor ត្រូវបានគណនាតាមរូបមន្ត៖

អាសយដ្ឋានលីនេអ៊ែរ = ផ្នែក * 16 + អុហ្វសិត

ឧបករណ៍ដំណើរការរបៀបពិត 80186 និង 8086 តម្លៃផ្នែកមានចាប់ពី 0 ទៅ 0F000 ម៉ោង។. ដូច្នេះ អាសយដ្ឋានដែលបង្ហាញអតិបរមានៅលើរថយន្តក្រុងអាសយដ្ឋានគឺ 0FFFFhដែលត្រូវនឹង (2^20)-1 , i.e. 1 មេកាបៃ។

ជាការពិតណាស់ដំបូងឡើយ បរិមាណនៃអង្គចងចាំបែបនេះហាក់ដូចជាធំសម្បើម ប៉ុន្តែយូរៗទៅមួយមេហ្គាបៃមិនគ្រប់គ្រាន់ទេ។ ជាមួយនឹងការមកដល់នៃខួរក្បាល 80286 អ្វី​ដែល​ហៅ​ថា​ប្លុក​អង្គ​ចងចាំ​បាន​ក្លាយ​ជា​មាន U.M.B.ចាប់ផ្តើមដោយអាសយដ្ឋាន 0FFFFh: 0010 ម៉ោង។ហើយបញ្ចប់ដោយអាសយដ្ឋាន 0FFFFh:0FFFFh(65520 បៃលើសពីមួយមេកាបៃ) ។ ឥឡូវនេះអ្នកអាចកំណត់រចនាសម្ព័ន្ធប្រព័ន្ធប្រតិបត្តិការឡើងវិញ MS-DOSដូច្នេះវាកាន់កាប់ប្លុកនេះដោយដោះលែង 64 គីឡូបៃក្នុង RAM ។

របៀបការពារ

របៀប​នេះ​មាន​ការ​រចនា​ស្មុគ្រ​ស្មាញ​បើ​ធៀប​នឹង​របៀប​ពិត។ អាសយដ្ឋានឡូជីខលត្រូវបានតំណាងដោយសំណង់ " ឧបករណ៍ជ្រើសរើស៖ អុហ្វសិត"។ កម្មវិធីជ្រើសរើសមានចាប់ពី 0 ទៅ 0FFFFh(តាម​ពិត​ទៅ មាន​អ្នក​ជ្រើស​រើស​តិច​ជាង ៤ ដង - បន្ថែម​ទៀត​អំពី​រឿង​នេះ​ក្នុង​អត្ថបទ​បន្ទាប់)។ អុហ្វសិតមិនដូចរបៀបពិតទេគឺ 32 ប៊ីត ដែលអនុញ្ញាតឱ្យអ្នកដោះស្រាយផ្នែក 4 ជីហ្គាបៃ។ អាសយដ្ឋានឡូជីខលត្រូវបានបំប្លែងទៅជាលីនេអ៊ែរតាមគ្រោងការណ៍ខាងក្រោម៖

អាសយដ្ឋានលីនេអ៊ែរ = មូលដ្ឋានផ្នែក + អុហ្វសិត

អាសយដ្ឋានលីនេអ៊ែរត្រូវបានដាក់ជាបន្តបន្ទាប់នៅលើរថយន្តក្រុងអាសយដ្ឋាន ប្រសិនបើរបៀបអាសយដ្ឋានទំព័រមិនត្រូវបានបើក។ បើមិនដូច្នេះទេ អាស័យដ្ឋានលីនេអ៊ែរត្រូវបានបំប្លែងទៅជារូបវន្ត ហើយមានតែពេលនោះទេដែលវាត្រូវបានដាក់នៅលើឡានក្រុង។ លើសពីនេះ របៀបការពារអនុញ្ញាតឱ្យអ្នករៀបចំអង្គចងចាំនិម្មិត ដោយឈានដល់ទំហំរហូតដល់ 64 តេរ៉ាបៃ ហើយអាស្រ័យតែលើទំហំនៃដ្រាយវ៍រឹងប៉ុណ្ណោះ (ឧទាហរណ៍ ឯកសារទំព័រដូចគ្នានៅក្នុង វីនដូអនុវត្តអង្គចងចាំនិម្មិត) ។ ប្រព័ន្ធប្រតិបត្តិការទំនើបស្ទើរតែទាំងអស់ដំណើរការក្នុងរបៀបការពារ។

មុខងាររងនៃមុខងារការពារច្រើនកិច្ចការ

របៀបនេះអនុញ្ញាតឱ្យអ្នករៀបចំកិច្ចការច្រើន ពោលគឺសមត្ថភាពក្នុងការអនុវត្តការងារជាច្រើនក្នុងពេលដំណាលគ្នា ឬប្រព័ន្ធពហុអ្នកប្រើប្រាស់។

របៀបនិម្មិត 8086

នេះក៏ជាទម្រង់រងនៃ Protected Mode ដែលអនុញ្ញាតឱ្យអ្នកបង្កើតម៉ាស៊ីននិម្មិតដែលធ្វើសកម្មភាពដូចជានៅក្នុងរបៀបពិត ប៉ុន្តែកំពុងដំណើរការក្នុងទម្រង់ការពារ។

របៀបមិនពិត

នេះគឺជាទម្រង់រងពិសេសនៃរបៀបពិត។ ខួរក្បាលស្ថិតនៅក្នុងរបៀបពិត ប៉ុន្តែត្រូវបានបញ្ជូនទៅអង្គចងចាំដោយ " ឧបករណ៍ជ្រើសរើស៖ អុហ្វសិត"។ តាមវិធីនេះ អង្គចងចាំលើសពី 1 មេកាបៃអាចប្រើបាន។ នៅពេលអនាគត របៀបការពារ និងទម្រង់រងរបស់វានឹងត្រូវបានពិចារណា។

កម្មវិធីទីមួយ៖ ប្តូរទៅរបៀបការពារ

ការផ្លាស់ប្តូរទៅរបៀបការពារត្រូវបានអនុវត្តដោយការកំណត់ប៊ីត 0 ចុះឈ្មោះ CR0. ការផ្លាស់ប្តូរទៅរបៀបពិតត្រូវបានអនុវត្តដោយកំណត់សូន្យប៊ីតដូចគ្នា។ ពិចារណាកម្មវិធីដែលអនុវត្តប្រតិបត្តិការនេះ (ភាសា - អ្នកប្រមូលផ្តុំផ្ទះល្វែង):

ប្រើប្រាស់ ១៦ ; ប្រើការណែនាំ 16 ប៊ីត

org 100 ម៉ោង។

ចាប់ផ្តើម៖

; យើងស្ថិតនៅក្នុងរបៀបពិត

ផ្លាស់ទី eax, cr0 ; ការអានតម្លៃនៃការចុះឈ្មោះ CR0
អាល់, ១ ; កំណត់សូន្យប៊ីត
ផ្លាស់ទី cr0, eax ; សរសេរតម្លៃ CR0 ថ្មី។

; យើងស្ថិតនៅក្នុងទម្រង់ការពារ

ផ្លាស់ទី eax, cr0 ; ការអានតម្លៃ CR0
និង al, 0feh ; កំណត់សូន្យប៊ីតឡើងវិញទៅ 0
ផ្លាស់ទី cr0, eax ; តោះទៅរបៀបពិត

; យើងស្ថិតក្នុងទម្រង់ពិត

រ៉េត ; ចេញពីកម្មវិធី

ទោះយ៉ាងណាក៏ដោយ កម្មវិធីនេះមិនសមហេតុផលទាំងស្រុងទេ ដោយសារការរង្វិលជុំមិនអាចត្រូវបានអនុវត្តនៅក្នុងវា។ ប្រសិនបើអ្នកសរសេរពាក្យបញ្ជាដូចជា hltjmp$បន្ទាប់មកនៅពេលដែលការរំខានដំបូងត្រូវបានកេះ កុំព្យូទ័រនឹងចាប់ផ្ដើមឡើងវិញ។

ក្នុងករណីរបស់យើង ពាក្យបញ្ជាត្រូវបានកេះយ៉ាងលឿន ប៉ុន្តែវាអាចទៅរួចដែលថានៅក្នុងចន្លោះពេលរវាងការប្រតិបត្តិនៃពាក្យបញ្ជាណាមួយនៅក្នុងកម្មវិធីរបស់យើង ការរំខាននឹងនៅតែកេះដែលនឹងនាំឱ្យមានការបរាជ័យភ្លាមៗ និងការចាប់ផ្ដើមឡើងវិញ។ ដូច្នេះ​ហើយ អ្នក​គួរ​តែ​ថែរក្សា​ការ​រំខាន។ ដូច្នេះសូមក្រឡេកមើលបញ្ជីម្តងទៀត។ នេះមិនអាចត្រូវបានគេហៅថាកម្មវិធីដំបូងឡើយ (ផ្ទុយទៅវិញវានឹងហួសពីសូន្យ) ព្រោះវាមិនអនុវត្តសកម្មភាពជាមូលដ្ឋាននៃការប្តូរទៅរបៀបការពារ។ ដើម្បីប្តូរទាំងស្រុងទៅរបៀបការពារដោយប្រើការកំណត់តិចតួច អ្នកត្រូវអនុវត្តជំហានខាងក្រោម៖

1. ពិនិត្យមើលថាតើអាចប្តូរទៅរបៀបការពារឬអត់

2. ចាប់ផ្តើមតារាងពិពណ៌នា;

3. បិទការរំខាន (ទាំងរបាំងមុខនិងមិនបិទបាំង);

4. បើកបន្ទាត់ A20;

5. ផ្ទុកបញ្ជីត្រួតពិនិត្យអង្គចងចាំ;

7. ផ្លាស់ទីទៅផ្នែកកូដ 32 ប៊ីតដោយបដិសេធការចុះឈ្មោះ CS ។

ប៉ុន្តែវាគ្រប់គ្រាន់សម្រាប់កម្មវិធីដំបូងដើម្បីអនុវត្តជំហាន 3, 4, 5. បន្ទាប់មកការរង្វិលជុំវានឹងមិននាំឱ្យកុំព្យូទ័រចាប់ផ្ដើមឡើងវិញទេ។ តោះមើលសកម្មភាពនីមួយៗ។

ការបិទការរំខានរារាំងយើងពីការចាប់ផ្ដើមឡើងវិញ។ ការរំខានត្រូវបានបែងចែកទៅជារបាំងមុខ និងមិនអាចបិទបាំងបាន។ ដើម្បីបិទការរំខានដែលអាចបិទបាំងបាន អ្នកត្រូវកំណត់ទង់ឡើងវិញ IFចុះឈ្មោះ ទង់ជាតិក្រុម cli, ការរំខានត្រូវបានបើកដោយពាក្យបញ្ជា ស្ទី. ការរំខានដែលមិនអាចបិទបាំងបានត្រូវបានហាមឃាត់តាមរបៀបខុសគ្នាបន្តិច។ មានវិធីពីរយ៉ាងក្នុងការធ្វើដូចនេះ៖ ការសរសេរកម្មវិធីចុះឈ្មោះឧបករណ៍បញ្ជារំខាន (វិធីសាស្ត្រនេះនឹងត្រូវបានពិភាក្សាបន្តិចក្រោយមក) ឬផ្លាស់ប្តូរច្រកទីប្រាំពីរ។ 70 ម៉ោង។៖ ប្រសិនបើប៊ីតត្រូវបានកំណត់ នោះការរំខានត្រូវបានបិទ ប្រសិនបើប៊ីតត្រូវបានកំណត់ឡើងវិញ ការរំខានអាចត្រូវបានប្រតិបត្តិ។

ឥឡូវ​យើង​សួរ​ខ្លួន​យើង​ថា​តើ​អ្វី​ទៅ​ជា​មុខងារ​របស់​បន្ទាត់ ក២០ហើយវាជាអ្វី។ បន្ទាត់ ក២០- មួយក្នុងចំណោម 32 បន្ទាត់អាសយដ្ឋាន។ នៅពេលដែលកុំព្យូទ័រចាប់ផ្តើម, បន្ទាត់ ក២០បិទ។ លទ្ធផលនេះនៅក្នុងការបង្កើតអាសយដ្ឋាន 20 ប៊ីត (នោះគឺទំហំអាសយដ្ឋានទាំងមូលគឺស្មើនឹង (2^20)=1 មេកាបៃ) ។ នេះត្រូវបានរួមបញ្ចូលសម្រាប់ភាពឆបគ្នានៃដំណើរការ។ 8086 : ដូច្នេះ ព្យាយាមសរសេរទៅអាសយដ្ឋានលីនេអ៊ែរ 12345678 ម៉ោង។យើងពិតជានឹងសរសេរវានៅ 00045678 ម៉ោង។ដែលអាចនាំឱ្យមានលទ្ធផលដែលមិនរំពឹងទុកទាំងស្រុង។ ដូច្នេះសម្រាប់ដំណើរការពេញលេញនៃកម្មវិធី 32 ប៊ីត បន្ទាត់ ក២០ត្រូវតែបើកចំហ។ នេះត្រូវបានធ្វើដោយការកំណត់ប៊ីត 1 ច្រក ៩២ ម៉ោង។, បន្ទាត់បិទ ក២០- កំណត់ឡើងវិញនេះបន្តិច។

អ្នកអានបានស្គាល់រួចមកហើយនូវសកម្មភាពចុងក្រោយ ហើយវាមិនគួរចោទជាសំណួរនៅក្នុងគាត់ទៀតទេ។

ដូច្នេះ សូមក្រឡេកមើលការចុះបញ្ជីកម្មវិធីថ្មីដំបូងរបស់យើង ដែលវដ្តតូចមួយកំពុងត្រូវបានអនុវត្តរួចហើយ។ បន្ទាត់ដែលត្រូវបានបន្ថែមទៅបញ្ជីមុនត្រូវបានសម្គាល់ដោយសញ្ញាផ្កាយ (*) ។

org 100 ម៉ោង។

ចាប់ផ្តើម៖

; យើងស្ថិតនៅក្នុងរបៀបពិត

cli ;*

ក្នុង al, 70 ម៉ោង ;*
al, 80 ម៉ោង ;*
ចេញ 70 ម៉ោង អាល់ ;*

; បើកបន្ទាត់ A20

ក្នុង al, 92 ម៉ោង;*
អាល់, 2;*
ចេញ 92 ម៉ោង, អាល់ ;*

ផ្លាស់ទី eax, cr0
អាល់, ១
ផ្លាស់ទី cr0, អេក


; រង្វិលជុំទ្វេរតូច

ផ្លាស់ទី cx, 20 ;*

វដ្តៈ ;*
ផ្លាស់ទីពូថៅ, cx ;*
ផ្លាស់ទី cx, 0ffffh ;*
រង្វិលជុំ $ ;*
ផ្លាស់ទី cx, ពូថៅ ;*
រង្វិលជុំវដ្ត ;*

ផ្លាស់ទី eax, cr0
និង al, 0feh
ផ្លាស់ទី cr0, អេក

; បិទបន្ទាត់ A20

ក្នុង al, 92 ម៉ោង;*
និង al, 0fdh ;*
ចេញ 92 ម៉ោង, អាល់ ;*

ក្នុង al, 70 ម៉ោង ;*
និង al, 7fh ;*
ចេញ 70 ម៉ោង អាល់ ;*

ស្ទី ;*

រ៉េត ; បញ្ចប់កម្មវិធី

អ្នកអាចធ្វើឱ្យប្រាកដថាកម្មវិធីដំណើរការដោយដំណើរការឯកសារដែលអាចប្រតិបត្តិបានពីស្អាត MS-DOS. ប្រសិនបើកម្មវិធីចេញបានត្រឹមត្រូវ នោះអ្វីៗគឺល្អ។

ទោះយ៉ាងណាក៏ដោយ បញ្ហាខាងក្រោមក៏អាចកើតមានផងដែរ៖

1. កុំព្យូទ័របង្កក;

2. កុំព្យូទ័រចាប់ផ្តើមឡើងវិញ។

នេះអាចកើតឡើងដោយសារហេតុផលដូចខាងក្រោមៈ

1. កម្មវិធីត្រូវបានបើកដំណើរការក្នុងរបៀប វី ៨៦(របៀបនិម្មិត 8086 );

2. កម្មវិធីត្រូវបានបើកដំណើរការក្នុងរបៀបការពារ ឬក្រោមប្រព័ន្ធប្រតិបត្តិការជាក់លាក់មួយ។

ដូច្នេះ មុននឹងបើកដំណើរការកម្មវិធីណាមួយដែលកំពុងដំណើរការក្នុងទម្រង់ការពារ អ្នកគួរតែពិនិត្យមើលថាតើកម្មវិធីអាចបន្តដំណើរការបានដែរឬទេ។ នេះនឹងត្រូវបានពិភាក្សាបន្ថែមទៀត។

កំពុងពិនិត្យមើលលទ្ធភាពនៃការប្តូរទៅរបៀបការពារ

នៅក្នុងជំពូកមុន យើងមានបញ្ហាដូចខាងក្រោម៖ កម្មវិធីមិនទទួលស្គាល់ថាវាស្ថិតនៅក្នុងរបៀបការពារ ឬរបៀបទេ។ វី ៨៦ដែលនាំឱ្យប្រព័ន្ធបង្កក ឬចាប់ផ្ដើមឡើងវិញ។ ប្រសិនបើយើងព្យាយាមដំណើរការកម្មវិធីក្រោមប្រព័ន្ធប្រតិបត្តិការ វីនដូ, នោះ។ វីនដូនឹងចាប់បានការប៉ុនប៉ងរបស់កម្មវិធីដើម្បីប្តូរទៅរបៀបការពារ និងផ្តល់ជូនដើម្បីចាប់ផ្ដើមឡើងវិញនៅក្នុងរបៀបត្រាប់តាម MS-DOS(សម្រាប់វេទិកា 9x) ឬបិទកម្មវិធីដោយបង្ខំ (វេទិកា NT).

ដូច្នេះ ដើម្បី​ពិនិត្យ​មើល​ថា​យើង​ពិត​ជា​ស្ថិត​ក្នុង​ទម្រង់​ពិត​ប្រាកដ យើង​គួរ​ធ្វើ​ប្រតិបត្តិការ​ដូច​ខាង​ក្រោម៖

1. ពិនិត្យមើលសូន្យប៊ីតនៃការចុះឈ្មោះ CR0;

2. ត្រូវប្រាកដថាប្រព័ន្ធប្រតិបត្តិការវីនដូមិនត្រូវបានផ្ទុកទេ។

ប្រតិបត្តិការដំបូងត្រូវបានអនុវត្តដោយការអានដោយផ្ទាល់នូវការចុះឈ្មោះ CR0ជាមួយនឹងការត្រួតពិនិត្យបន្ថែមទៀតនៃសូន្យប៊ីតនៃការចុះឈ្មោះ EAX, AXអាល់. ប្រសិនបើប៊ីតមិនត្រូវបានកំណត់ នោះយើងស្ថិតក្នុងទម្រង់ពិត។ បើមិនដូច្នេះទេ ការអនុវត្តបន្ថែមទៀតនៃកម្មវិធីនឹងក្លាយទៅជាគ្មានន័យ។

សកម្មភាពទីពីរត្រូវបានអនុវត្តដោយការហៅមុខងារ ១៦០០ ម៉ោង។រំខាន 2fh. មុខងារនេះអនុញ្ញាតឱ្យអ្នកទទួលបានកំណែបច្ចុប្បន្ននៃប្រព័ន្ធប្រតិបត្តិការ វីនដូ. ប្រសិនបើបន្ទាប់ពីហៅមុខងារនៅក្នុងចុះឈ្មោះ អាល់មានសូន្យ បន្ទាប់មកប្រព័ន្ធប្រតិបត្តិការមិនត្រូវបានផ្ទុកទេ។ បើមិនដូច្នេះទេ ជាថ្មីម្តងទៀត វាគ្មានចំណុចណាមួយនៅក្នុងកម្មវិធីរបស់យើងបន្តទៀតទេ។

ពិចារណាឧទាហរណ៍នៃកម្មវិធីខាងក្រោម។ វាគឺជាការកែប្រែនៃកម្មវិធីមុន ការណែនាំថ្មីទាំងអស់ត្រូវបានសម្គាល់ដោយសញ្ញាផ្កាយ (*)។

អង្គការ 100 ម៉ោង។

ចាប់ផ្តើម៖

; រៀបចំការចុះឈ្មោះផ្នែក

ផ្លាស់ទីពូថៅ cs ;*
ផ្លាស់ទី ds, ពូថៅ ;*

; ការពិនិត្យមើលថាយើងពិតជាស្ថិតនៅក្នុងរបៀបពិត

ផ្លាស់ទី eax, cr0 ;* ពិនិត្យមើលសូន្យប៊ីត
សាកល្បង al, 1 ;* ចុះឈ្មោះ CR0
jz no_pm ;*

ផ្លាស់ទី ah, 09h ;* មុខងារ DOS 09h
ផ្លាស់ទី dx, pm_msg;* លទ្ធផលបន្ទាត់
int 21 ម៉ោង ;*
រ៉េត;* ហើយចេញ

no_pm៖
; ពិនិត្យមើលថាតើកម្មវិធីកំពុងដំណើរការនៅក្រោមវីនដូឬអត់

ផ្លាស់ទីពូថៅ ១៦០០ ម៉ោង។ ;* 1600h មុខងារ multiplexer
int 2fh ;* រំខាន - ទទួលបានកំណែវីនដូ
សាកល្បងអាល់, អាល់ ;* ប្រសិនបើមិនមែន 0 - កំហុស
jz no_windows

; បង្ហាញសារកំហុស

ផ្លាស់ទី 09h ;*
ផ្លាស់ទី dx, win_msg ;*
int 21 ម៉ោង ;*
រ៉េត ;*

no_windows៖
; យើងពិតជាស្ថិតក្នុងទម្រង់ពិត
; បិទការរំខានដែលអាចបិទបាំងបាន។

; បិទការរំខានដែលមិនអាចលាក់បាំង (NMI)

ក្នុង al, 70 ម៉ោង។
al, 80 ម៉ោង។
ចេញ 70 ម៉ោង, អាល់

; បើកបន្ទាត់ A20

ក្នុង al, 92 ម៉ោង។
អាល់, ២
ចេញ 92 ម៉ោង, អាល់

; ប្តូរទៅរបៀបការពារ

ផ្លាស់ទី eax, cr0
អាល់, ១
ផ្លាស់ទី cr0, អេក

; ឥឡូវនេះយើងស្ថិតនៅក្នុងរបៀបការពារ
; រង្វិលជុំទ្វេរតូច

ផ្លាស់ទី cx, ២០

វដ្តៈ
ផ្លាស់ទីពូថៅ, cx
ផ្លាស់ទី cx,0ffffh
រង្វិលជុំ $
ផ្លាស់ទី cx, ពូថៅ
រង្វិលជុំវដ្ត

; ប្តូរទៅរបៀបពិត

ផ្លាស់ទី eax, cr0
និង al, 0feh
ផ្លាស់ទី cr0, អេក

; បិទបន្ទាត់ A20

ក្នុង al, 92 ម៉ោង;*
និង al, 0fdh ;*
ចេញ 92 ម៉ោង, អាល់ ;*

; បើកការរំខានដែលមិនអាចលាក់បាំង (NMI)

ក្នុង al, 70 ម៉ោង ;*
និង al, 7fh ;*
ចេញ 70 ម៉ោង អាល់ ;*

; បើកការរំខានដែលអាចបិទបាំងបាន។

ស្ទី ;*

; យើង​ត្រឡប់​មក​វិញ​ក្នុង​ទម្រង់​ពិត

រ៉េត ; បញ្ចប់កម្មវិធី

; សារកំហុស

pm_msg: ;*
ឌីប៊ី "កំហុស៖ កំពុងដំណើរការក្នុងរបៀបការពាររួចហើយ!$" ;*
win_msg: ;*
ឌីប៊ី "កំហុស៖ Microsoft Windows បានរកឃើញ!$" ;*
ឧទាហរណ៍នេះមិនទាន់បង្ហាញពីការអនុវត្តពាក្យបញ្ជា 32 ប៊ីតនៅឡើយទេ។ ដើម្បីធ្វើដូច្នេះ អ្នកក៏គួរស្គាល់ខ្លួនអ្នកជាមួយនឹងសម្ភារៈនៅក្នុងជំពូកបន្ទាប់។ លើសពីនេះទៀតឧទាហរណ៍មានគុណវិបត្តិដូចខាងក្រោម: មុខងារត្រូវបានគេហៅថា DOS (ក្នុង 21 ម៉ោង។) ដែលចាប់ផ្តើមផ្ទុយពីឯករាជ្យភាពនៃកម្មវិធីរបស់យើងពីប្រព័ន្ធប្រតិបត្តិការរួចហើយ MS-DOS. នៅពេលអនាគត អ្នកនឹងត្រូវកម្ចាត់ការប្រើមុខងារប្រព័ន្ធប្រតិបត្តិការ ហើយប្តូរទៅប្រើមុខងារ BIOS. ប៉ុន្តែសម្រាប់ពេលនេះ វាគ្រប់គ្រាន់ហើយក្នុងការកំណត់ខ្លួនយើងចំពោះលេខកូដនេះ។

បច្ចុប្បន្នខ្ញុំកំពុងលេងជាមួយ x86 Assember ដើម្បីបង្កើនជំនាញសរសេរកម្មវិធីកម្រិតទាបរបស់ខ្ញុំ។ បច្ចុប្បន្នខ្ញុំមានបញ្ហាតូចមួយជាមួយគ្រោងការណ៍អាសយដ្ឋាននៅក្នុងរបៀបការពារ 32 ប៊ីត។

ស្ថានភាពនេះគឺ៖

ខ្ញុំមានកម្មវិធីមួយដែលបានផ្ទុកនៅ 0x7e0 ដែលប្តូរស៊ីភីយូទៅជារបៀបការពារ ហើយលោតទៅសញ្ញាសមរម្យនៅក្នុងកូដ៖

[... ] លេខកូដដើម្បីប្តូរ CPU ក្នុងទម្រង់ការពារ [... ] jmp ProtectedMode [... ] bits 32 ProtectedMode: .halt: hlt jmp .halt

រហូតមកដល់ពេលនេះអ្វីៗដំណើរការបានល្អ។ "Jmp ProtectedMode" ដំណើរការដោយគ្មានការលោតឆ្ងាយច្បាស់លាស់ដើម្បីជម្រះជួរ prefetch ចាប់តាំងពីកម្មវិធីនេះផ្ទុកនៅអុហ្វសិត 0 (org 0 នៅដើម) ដោយបង្ខំឱ្យផ្នែកកូដចង្អុលទៅកន្លែងដែលត្រឹមត្រូវ។

បញ្ហាបច្ចុប្បន្នរបស់ខ្ញុំគឺថានៅក្នុងផ្លូវកាត់ "ProtectedMode" ខ្ញុំចង់ទៅកាន់កម្មវិធីផ្សេងទៀតដែលផ្ទុកពី 0x8000 (ខ្ញុំបានសាកល្បងវាដោយប្រើអង្គចងចាំ មុខងារផ្ទុកដំណើរការត្រឹមត្រូវ ហើយកម្មវិធីបានផ្ទុកត្រឹមត្រូវរហូតដល់ 0x8000)។

ដោយសារ CPU ឥឡូវនេះស្ថិតនៅក្នុង ProtectedMode ជាជាង RealMode គ្រោងការណ៍អាសយដ្ឋានគឺខុសគ្នា។ ProtectedMode ប្រើអ្នកពណ៌នាដើម្បីរកមើលអាសយដ្ឋានមូលដ្ឋាន និងដែនកំណត់ក្នុងតារាងពិពណ៌នា ដើម្បីបន្ថែមអុហ្វសិតដែលបានផ្តល់ឱ្យ និងទទួលបានអាសយដ្ឋានរូបវន្ត (ដូចដែលខ្ញុំយល់វា)។ ដូច្នេះ GDT ត្រូវតែដំឡើងមុនពេល ProtectedMode អាចត្រូវបានបញ្ចូល។

របស់ខ្ញុំមើលទៅដូចនេះ៖

%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; មូលដ្ឋានកណ្តាល db 10011010b ; ចូលប្រើ db 11001111b; កម្រិត db 0; មូលដ្ឋានខ្ពស់ DATA_DESC: dw 0xFFFF ; អ្នកពិពណ៌នាទិន្នន័យ dw 0; ដែនកំណត់ទាប db 0; មូលដ្ឋានទាប db 10010010b ; ចូលប្រើ db 11001111b; កម្រិត db 0; មូលដ្ឋានខ្ពស់ gdtr: ដែនកំណត់ dw 24 ; ប្រវែងនៃ GDT Base dd NULL_DESC ; មូលដ្ឋាននៃ GDT %endif ;__GDT_INC_INCLUDED__

ហើយបញ្ចូលទៅក្នុងចុះឈ្មោះ GDT តាមរយៈ

អិលឌីត

អ្វី​ដែល​ខ្ញុំ​នៅ​មិន​ទាន់​បាន​រក​ឃើញ​គឺ​តើ​ឥឡូវ​នេះ​ខ្ញុំ​ទៅ​កាន់​អាសយដ្ឋាន​រូបវន្ត 0x8000 ក្នុង ProtectedMode ដោយ​ប្រើ GDT ដោយ​របៀប​ណា?

គំនិតដំបូងរបស់ខ្ញុំគឺជ្រើសរើសអ្នកពណ៌នាកូដ (CODE_DESC) ដែលគួរតែចង្អុលទៅ 0x7e00 (កម្មវិធីបច្ចុប្បន្នត្រូវបានផ្ទុក) ហើយប្រើអុហ្វសិតដែលត្រូវការដើម្បីទទួលបាន 0x8000 (512 បៃ) ដែលជាលទ្ធផលនៅក្នុងពាក្យបញ្ជាលោត៖

Jmp CODE_DESC: 0x200

ប៉ុន្តែវាមិនដំណើរការទេ។

Jmp 0x7e0:0x200

ក៏មិនដំណើរការដែរ...

តើ​អ្នក​មាន​គំនិត​ថា​ខ្ញុំ​បាត់​អ្វី​នៅ​ទី​នេះ​ទេ? ខ្ញុំប្រហែលជាខកខានអ្វីមួយដែលសំខាន់អំពីគម្រោងអាសយដ្ឋាន ProtectedMode 32 ប៊ីត និងការប្រើប្រាស់ GDT។

លេខកូដពេញ៖

ប៊ីត ១៦ org ០; ផ្ទុកដោយអុហ្វសិត 0000 (phys addr: 0x7e00) jmp ចាប់ផ្តើម ចាប់ផ្តើម៖ xor ax, ax mov ax, cs mov ds, ax ; ធ្វើបច្ចុប្បន្នភាពផ្នែកទិន្នន័យ cli ; ជម្រះការរំខាន lgdt ; ផ្ទុក GDT ពី GDTR (មើល gdt_32.inc) ហៅ OpenA20Gate ; បើកការហៅទ្វារ A20 EnablePMode ; លោតទៅ ProtectedMode ;******************** ;* បើក A20 Gate * ;******************** OpenA20Gate: នៅក្នុង al, 0x93; ប្តូរច្រក A20 តាមរយៈច្រក A20 លឿន 92 ឬ al, 2 ; កំណត់ A20 Gate ប៊ីត 1 និង al, ~ 1 ; ជម្រះ INIT_NOW ចេញ 0x92, al ret ;************************** ;* បើករបៀបការពារ * ;********** ****************** បើកដំណើរការPMode៖ mov eax, cr0 ឬ eax, 1 mov cr0, eax jmp ProtectedMode ; វាដំណើរការ (លោតទៅស្លាក និងបញ្ឈប់) ;jmp (CODE_DESC-NULL_DESC):ProtectedMode ; => មិនដំណើរការ ;jmp 08h:ProtectedMode , => មិនដំណើរការ ;*************** ;* វាលទិន្នន័យ * ;* &includes * ;********** ******* % រួមបញ្ចូល "gdt_32.inc" ;****************** ;* របៀបការពារ * ;*********** * ******* bits 32 ProtectedMode៖ នៅទីនេះខ្ញុំចង់លោតទៅ Physical addr 0x8000 (កម្មវិធី elf64 asm) .halt: hlt jmp .halt

11