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 ម៉ោង។ ចាប់ផ្តើម៖ ; យើងស្ថិតនៅក្នុងរបៀបពិត |
ក្នុងករណីរបស់យើង ពាក្យបញ្ជាត្រូវបានកេះយ៉ាងលឿន ប៉ុន្តែវាអាចទៅរួចដែលថានៅក្នុងចន្លោះពេលរវាងការប្រតិបត្តិនៃពាក្យបញ្ជាណាមួយនៅក្នុងកម្មវិធីរបស់យើង ការរំខាននឹងនៅតែកេះដែលនឹងនាំឱ្យមានការបរាជ័យភ្លាមៗ និងការចាប់ផ្ដើមឡើងវិញ។ ដូច្នេះហើយ អ្នកគួរតែថែរក្សាការរំខាន។ ដូច្នេះសូមក្រឡេកមើលបញ្ជីម្តងទៀត។ នេះមិនអាចត្រូវបានគេហៅថាកម្មវិធីដំបូងឡើយ (ផ្ទុយទៅវិញវានឹងហួសពីសូន្យ) ព្រោះវាមិនអនុវត្តសកម្មភាពជាមូលដ្ឋាននៃការប្តូរទៅរបៀបការពារ។ ដើម្បីប្តូរទាំងស្រុងទៅរបៀបការពារដោយប្រើការកំណត់តិចតួច អ្នកត្រូវអនុវត្តជំហានខាងក្រោម៖
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 ម៉ោង។ ចាប់ផ្តើម៖ ; យើងស្ថិតនៅក្នុងរបៀបពិតវដ្តៈ ;* ផ្លាស់ទីពូថៅ, cx ;* |
ទោះយ៉ាងណាក៏ដោយ បញ្ហាខាងក្រោមក៏អាចកើតមានផងដែរ៖
1. កុំព្យូទ័របង្កក;
2. កុំព្យូទ័រចាប់ផ្តើមឡើងវិញ។
នេះអាចកើតឡើងដោយសារហេតុផលដូចខាងក្រោមៈ
1. កម្មវិធីត្រូវបានបើកដំណើរការក្នុងរបៀប វី ៨៦(របៀបនិម្មិត 8086 );
2. កម្មវិធីត្រូវបានបើកដំណើរការក្នុងរបៀបការពារ ឬក្រោមប្រព័ន្ធប្រតិបត្តិការជាក់លាក់មួយ។
ដូច្នេះ មុននឹងបើកដំណើរការកម្មវិធីណាមួយដែលកំពុងដំណើរការក្នុងទម្រង់ការពារ អ្នកគួរតែពិនិត្យមើលថាតើកម្មវិធីអាចបន្តដំណើរការបានដែរឬទេ។ នេះនឹងត្រូវបានពិភាក្សាបន្ថែមទៀត។
កំពុងពិនិត្យមើលលទ្ធភាពនៃការប្តូរទៅរបៀបការពារ
នៅក្នុងជំពូកមុន យើងមានបញ្ហាដូចខាងក្រោម៖ កម្មវិធីមិនទទួលស្គាល់ថាវាស្ថិតនៅក្នុងរបៀបការពារ ឬរបៀបទេ។ វី ៨៦ដែលនាំឱ្យប្រព័ន្ធបង្កក ឬចាប់ផ្ដើមឡើងវិញ។ ប្រសិនបើយើងព្យាយាមដំណើរការកម្មវិធីក្រោមប្រព័ន្ធប្រតិបត្តិការ វីនដូ, នោះ។ វីនដូនឹងចាប់បានការប៉ុនប៉ងរបស់កម្មវិធីដើម្បីប្តូរទៅរបៀបការពារ និងផ្តល់ជូនដើម្បីចាប់ផ្ដើមឡើងវិញនៅក្នុងរបៀបត្រាប់តាម MS-DOS(សម្រាប់វេទិកា 9x) ឬបិទកម្មវិធីដោយបង្ខំ (វេទិកា NT).
ដូច្នេះ ដើម្បីពិនិត្យមើលថាយើងពិតជាស្ថិតក្នុងទម្រង់ពិតប្រាកដ យើងគួរធ្វើប្រតិបត្តិការដូចខាងក្រោម៖
1. ពិនិត្យមើលសូន្យប៊ីតនៃការចុះឈ្មោះ CR0;
2. ត្រូវប្រាកដថាប្រព័ន្ធប្រតិបត្តិការវីនដូមិនត្រូវបានផ្ទុកទេ។
ប្រតិបត្តិការដំបូងត្រូវបានអនុវត្តដោយការអានដោយផ្ទាល់នូវការចុះឈ្មោះ CR0ជាមួយនឹងការត្រួតពិនិត្យបន្ថែមទៀតនៃសូន្យប៊ីតនៃការចុះឈ្មោះ EAX, AXឬ អាល់. ប្រសិនបើប៊ីតមិនត្រូវបានកំណត់ នោះយើងស្ថិតក្នុងទម្រង់ពិត។ បើមិនដូច្នេះទេ ការអនុវត្តបន្ថែមទៀតនៃកម្មវិធីនឹងក្លាយទៅជាគ្មានន័យ។
សកម្មភាពទីពីរត្រូវបានអនុវត្តដោយការហៅមុខងារ ១៦០០ ម៉ោង។រំខាន 2fh. មុខងារនេះអនុញ្ញាតឱ្យអ្នកទទួលបានកំណែបច្ចុប្បន្ននៃប្រព័ន្ធប្រតិបត្តិការ វីនដូ. ប្រសិនបើបន្ទាប់ពីហៅមុខងារនៅក្នុងចុះឈ្មោះ អាល់មានសូន្យ បន្ទាប់មកប្រព័ន្ធប្រតិបត្តិការមិនត្រូវបានផ្ទុកទេ។ បើមិនដូច្នេះទេ ជាថ្មីម្តងទៀត វាគ្មានចំណុចណាមួយនៅក្នុងកម្មវិធីរបស់យើងបន្តទៀតទេ។
ពិចារណាឧទាហរណ៍នៃកម្មវិធីខាងក្រោម។ វាគឺជាការកែប្រែនៃកម្មវិធីមុន ការណែនាំថ្មីទាំងអស់ត្រូវបានសម្គាល់ដោយសញ្ញាផ្កាយ (*)។
អង្គការ 100 ម៉ោង។ ចាប់ផ្តើម៖ ; រៀបចំការចុះឈ្មោះផ្នែកno_pm៖ ; ពិនិត្យមើលថាតើកម្មវិធីកំពុងដំណើរការនៅក្រោមវីនដូឬអត់no_windows៖ ; យើងពិតជាស្ថិតក្នុងទម្រង់ពិតវដ្តៈ ផ្លាស់ទីពូថៅ, cxpm_msg: ;* ឌីប៊ី "កំហុស៖ កំពុងដំណើរការក្នុងរបៀបការពាររួចហើយ!$" ;*win_msg: ;* ឌីប៊ី "កំហុស៖ Microsoft Windows បានរកឃើញ!$" ;* |
បច្ចុប្បន្នខ្ញុំកំពុងលេងជាមួយ 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