តើអ្វីទៅជារបៀបការពារ និងអ្វីដែលវាញ៉ាំជាមួយ។ ការប្តូរប្រព័ន្ធដំណើរការ Intel ទៅរបៀបការពារ ការប្តូរទៅឧបករណ៍ដំឡើងរបៀបការពារ

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

yFBL, LBL CHSH RPNOYFE, ក្រុមហ៊ុន H TEBMShOPN TETSYNE TBVPFSCH RTPGEUUPTB OBN DPUFKHREO CHUEZP MYYSH 1 NEZBVBKF BDTEUOPZP RTPUFTBOUFCHB (Yb LPFTPTSCHI PVSHPCHLY6) ។ fBL LFP Y VSHMP CHP ការអាន RETCHSHCHI RTPGEUUPTPCH CHTPDE 8086, OP RPUFEREOOP PVYaЈNB PRETBFICHOPK RBNSFY UFBMP OE ICHBFBFSH ។ h FP TSE CHTENS FTEVPCHBMPUSH UPITBOYFSH RPMOHA PVTBFOHA UPCNEUFYNPUFSH, UFPVShch 16-TBTSDOSHCHE PRETBGYPOOSCHE UYUFENSCH CHTPDE DOS UNPZMY OPTNBMSHOP TBVPFBFSH ។ rPFPNKh VSCHM CHCHEDIO OPCHSHCHK TETSYN TBVPFSCH RPGEUUPTB - BEEYEIIOOSCHK TETSYN ។ rPUME RETEIPDB CH OEZP DMS BDTEUBGYY YURPMSHHEFUS OE 16, B 32 YMY DBTSE 64 VYFB, B UEZNEOFSHCH UFBTPN RPOINBOY YUYUEBAF ។ fBLCE DPVBCHMSAFUS BEIFOSCHE NEIBOYNSCH (YNEOOP RPFPNH BEEYEIIOOSCHK TETSYN), UFPVShch SDTP pu VShchMP YЪPMYTPCHBOOP PF RTYMPTSEOIK Y NPZMP YNY UCHPVPDOP HRTBCHMSFSH ។ sFP OEVPVIPDYNP MAVPK RPMOPGEOOPK NOPZPЪBDBYuOPK UYUFENE ។

оБЮОЈН У ФПЗП, ЮФП ДПВБЧМСЕФУС Ч ТЕБМШОПН ТЕЦЙНЕ ОБ РТПГЕУУПТБИ, ЛПФПТЩЕ РПДДЕТЦЙЧБАФ 32-ВЙФОЩК БДТЕУ (i386 Й ЧЩЫЕ) - ДПВБЧМСАФУС ОПЧЩЕ ТЕЗЙУФТЩ, ЧЕТОЕЕ ТБУЫЙТСАФУС УФБТЩЕ: EAX, EBX, ECX, EDX, ESP, EBP, EIP, ESI, EDI, ទង់ជាតិ។ LBL NPTsOP DPZBDBFSHUS, LFP 32-VYFOSHCHE CHETUYY PVSCHYUOSCHI TEZYUFTCH TEBMSHOPZP TETSYNB (L YNEOY TEZYUFTB DPVBCHMSEFUS RTYUFBBCHLB "E") ។ CHUE LFY 32-VYFOSHCHE TEZYUFTSHCH LTPNE EIP DPUFKHROSCH Y CH TEBMSHOPN TETSYNE, OP CH FBLPN UMHYUBE VHDHF OBOYNBFSH OB 1 VBKF VPMSHYE (LEYN DPVBCHMSEFCH) ។ អំពី RTPGEUUPTE NPMPTS 286 FY LPNBODSCH VHDHF OELPTTELFOSCH ។ nSch NPTSEN, OBRTYNET, OBRYUBFSH mov eax, 0x12345678 Y RPUME LFPZP H AX VKhDEF 0x5678, RPFPNH UFP នៅលើ LBL VSCHMSEFUS "PLOPN" H NMBDYHA YUBUFSH EMBYUFT (TEZUPYUFT) ។ тЕЗЙУФТБ-ПФПВТБЦЕОЙС УФБТЫЕК ЮБУФЙ 32-ВЙФОЩИ ТЕЗЙУФТПЧ ОЕ УХЭЕУФЧХЕФ - НПЦОП ЕЈ ЙЪЧМЕЮШ ФПМШЛП У РПНПЭША БТЙЖНЕФЙЛЙ (ОБРТЙНЕТ, УДЧЙОХФШ EAX ОБ 16 ВЙФ ЧРТБЧП У РПНПЭША shr eax, 16, ФПЗДБ Ч AX ВХДЕФ УФБТЫБС РПМПЧЙОБ, ОП УПДЕТЦЙНПЕ НМБДЫЙИ ВЙФ ВХДЕФ ХФЕТСОП). юФП ИБТБЛФЕТОП, Ч ЪБЭЙЭЈООПН ТЕЦЙНЕ ОБПВПТПФ, ЛПНБОДЩ ТБВПФЩ У 16-ВЙФОЩНЙ ТЕЗЙУФТБНЙ (ОП ОЕ 8-ВЙФОЩНЙ) ФТЕВХАФ РТЕЖЙЛУ, РПЬФПНХ ОЕУНПФТС ОБ ФП, ЮФП ТБЪТСДОПУФШ Ч ДЧБ ТБЪБ ВПМШЫЕ, Ч ЪБЭЙЭЈООПН ТЕЦЙНЕ ВЩУФТЕЕ ЧЩРПМОСАФУС Й ЪБОЙНБАФ НЕОШЫЕ НЕУФБ ЙНЕООП ЛПНБОДЩ 32- VYFOPC BTYZHNEFILY ។

fBLCE, FERETSCH H OBU OB 2 UEZNEOFOSHCHI TEZYUFTB VPMSHIE - GS TH FS ។ TBVPFB U ONYY RPMOPUFSHHA BOBMPZYUOB DS Y ES Y CH NPTSEFE YI UCHPPVPDOP YURPMSHЪPCHBFSH CH TEBMSHOPN TETSYNE ។ пФМЙЮЙЕ ФПМШЛП Ч ФПН, ЮФП ОЙЛБЛЙЕ ЛПНБОДЩ ЙИ СЧОП ОЕ РПДТБЪХНЕЧБАФ (DS ЙУРПМШЪХЕФУС РП ХНПМЮБОЙА РТБЛФЙЮЕУЛЙ ЧУЕНЙ ЛПНБОДБНЙ Й ОЕЛПФПТЩНЙ УФТПЛПЧЩНЙ ПРЕТБГЙСНЙ, ES ОЕЛПФПТЩНЙ УФТПЛПЧЩНЙ ПРЕТБГЙСНЙ) Й ОБДП СЧОП ХЛБЪЩЧБФШ, ЮФП ЧЩ ИПФЙФЕ ПВТБЭБФШУС ЮЕТЕЪ ОЙИ. BRIGHTNET, mov ax, .

rPNYNP LFPZP TBUYTEOYS TEZYUFTCH, DPVBCHMSAFUS OPCHSHCHE HRTBCHMSAEIE TEZYUFTSHCH (TBOSHIE CHMYSM អំពី TETSYN TBVPFSCH RTPGEUUPTB FPMSHLP ទង់) - CR0, CR2, CR3 ។ EUFSH Y DTHZYE (OBRTYNET, PFMBDPYUOSCHE TEZYUFTSHCH), OP POY OBU UEKYUBU OE YOFETEUKHAF ។ yNEOOP U RPNPESHA LFYI TEZYUFTCH RTPYJCHPDYFUS RETELMAYUEOYE RTPGEUUPTB ក្រុមហ៊ុន H BEEYEIOOOSCHK TETSYN Y OBUFTPKLB OPCHSCHI ZHHOLGYK CHTPDE UFTBOYUOPK BDTEUBGYY ។ ច្រៀង DPUFKHROSCH CH TEBMSHOPN TETSYNE ។

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

UEZNEOFSCH BEEIEIIOOPZP TETSYNB DEMSFUS អំពី DCHB FIRB - UEZNEOFSC LPDB Y UEZNEOFSC DBOOSCHI (អំពី UBNPN DEME EUFSH EEI CHUSLYE TSS Y LDT, OP RPLB ច្រៀង OBNO OE CHBTSO) ។ h CS NPTsOP ЪBZTHTSBFSH FPMSHLP OPNETB DEULTYRFPTPCH, PRYUBOOSHCHI LBL UEZNEOF LPDB, ក្រុមហ៊ុន Ch PUFBMSHOSCHHE UEZNEOFOSHCHE TEZYUFTSH NPTsOP ЪBZTHTSBFSH MAVBLSHUEZ ។ CHBTSOBS TBOYGB CH FPN, YuFP UEZNEOF LPDB NPTsOP FPMSHLP YUYFBFSH Y YURPMOSFSH, B UEZNEOF DBOOSCHI FPMSHLP YUYFBFSH Y RYUBFSH ។ អិល Uyubufsha, ueresenofsh NPZHF RETELTSHCHSHS CH RBNSFY, RPFPNH UPDSOPPSHE DELTRFPTB Dultirfptb, Ushchmbaeus អំពី PDO FPF TEZIPO RBNSPHA, OPEI Oydbfsh yurpynchenshn ។

oEUNPFTS អំពី RPDDETZLH UEZNEOFBGYY, POB UYUYFBEFUS HUFBTECHYEK ។ អូ Windows, អូលីនុច OE YURPMSHHAF EE H RPMOPC NO, B OB PFMYUOSCHI PF x86 BTIYFELFHTSHCH (OBRTYNET, ARM) PB អ្វី FUHFUFFCHHEF ។ DMS TBZTBOYUEOIS DPUFHRB L RBNSFY YURPMSH'HEFUS ZPTBDDP VPMEE ZYVLYK NEIBOYN UFTBOYUOPK BDTEUBGYY, LPFPTSCHK NSC TBUUNPFTYN DBMEE ។ YuFPVSCH YUVBCHIFSHUS PF UEZNEOFBGYY PU RTPUFP PRIUSHCHBEF FBVMIGH YU DULTIRFPPCH, X LBCDPZP YH LPFPSHSHK BDTEU 0, B TBIPHK RBNSTEPHEPHEPHEPHP h FBLPN UMHYUBE ZPCHPTSF, YuFP NSCH CHLMAYUYMY TETSYN MYOEKOSHCHI BDTEUPCH - UNEEEOYE UPPFFCHEFUFCHHEF ZHYYYYUEULPNH BDTEUKH ។ FP PYUEOSH KDPVOP Y S RPKDH RP FPNKh CE RHFY ។ оЕ УМЕДХЕФ РЩФБФШУС ЙУРПМШЪПЧБФШ УЕЗНЕОФБГЙА Ч УЧПЕК ПРЕТБГЙПООПК УЙУФЕНЕ - ЬФП УЙМШОП ХУМПЦОСЕФ ЛПД СДТБ, СЪЩЛЙ ЧЩУПЛПЗП ХТПЧОС (ОБРТЙНЕТ, у ЙМЙ у++) ОЕ РПДДЕТЦЙЧБАФ УЕЗНЕОФБГЙА (ФП ЕУФШ ЧЩ УНПЦЕФЕ РПМОПГЕООП РТПЗТБННЙТПЧБФШ ФПМШЛП ОБ Assembler) Й, ОБЛПОЕГ, ЧЩ ОЕ УНПЦЕФЕ РЕТЕОЕУФЙ УЙУФЕНХ ОБ ДТХЗХА БТИЙФЕЛФХТХ, РПФПНХ ЮФП x86 ЕДЙОУФЧЕООБС, ЛПФПТБС ХНЕЕФ ЬФПФ НЕИБОЙЪН (Й ФП, Ч 64-ВЙФОПН ТЕЦЙНЕ РПМС ВБЪПЧПЗП БДТЕУБ Й ТБЪНЕТБ УЕЗНЕОФБ ЙЗОПТЙТХАФУС, Б ЙУРПМШЪХЕФУС МЙЫШ ЙОЖПТНБГЙС П РТБЧБИ ДПУФХРБ).

LBL S HCE ULBBM, FBVMYGB DEULTYRFPTPCH UEZNEOPHFCH ZHPTNYTHEFUS UBNPK PRETBGYPOOPK UYUFENPC ។ uFPVSC HLBBFSH RPGEUUPTH, ZDE POB OBIDIFUS YURPMSHHEFUUS UREGYBMSHOBS LPNBODB - lgdt (ផ្ទុកតារាងពិពណ៌នាសកល)។ POB RTYOYNBEF 6-VBKFPCHHA RETENEOOHA CH RBNSFY ។ рЕТЧЩЕ ЕЈ 16 ВЙФ УПДЕТЦБФ ТБЪНЕТ ФБВМЙГЩ Ч ВБКФБИ (ФБЛЙН ПВТБЪПН, НБЛУЙНБМШОПЕ ЛПМЙЮЕУФЧП ДЕУЛТЙРФПТПЧ - 65536 / 8 = 8192), РПУМЕДХАЭЙЕ 32 ВЙФБ - ВБЪПЧЩК МЙОЕКОЩК БДТЕУ Ч РБНСФЙ УБНПК ФБВМЙГЩ (ФП ЕУФШ ВЕЪ ХЮЈФБ ЧУЕИ УЕЗНЕОФПЧ). yNEEF UNSCHUM CHSHCHTBCHOSFSH OBYUBMP FBVMYGSHCH OB 16 VBKF, RPFPNKh YUFP LFP HMHYUYBEF ULTPUFSH DPUFHRB L EY EMENEOFBN ។ RETCHSHCHK LMENEOF FBVMYGSHCH CHUEZDB DPMTSEO VSHCHFSH TBCHEO OHMA Y MAVPE YURPMSHCHCHBOYE OHMECHPZP UEMELFPTB(HLBBFEMSH អំពី MENEOF FBVMYGSCH DEULTYRFPTPCH CH UEZNEOFOPN TEZYUFTE OBSCCHCHBEFUS FBL) RTYCHPDYF អិល PYYVLE ។ OBYUYF VPMEE-NEOE TBVPFPPURPUPVOBS FBVMYGB DEULTYRFPTPCH DPMTSOB UPDETTSBFSH IPFS VSC FTY DEULTYRFPTTB - RHUFPK, DEULTYRFPT LPDB, DEULTYRFPT DBOOSCHI ។

អូ UFP EEJ UFPYF TBUULBЪBFSH, RTETSDE, YUEN NSCH RPRTPVKHEN RETEKFI CH ЪBEEIIOOSCHK TETSYN? RPTsBMHK, EEI UFPYF HRPNSOHFSH RTP HTPCHOY DPUFHRB ។ LPD SDTB UYUFENSCH Y LPD RTYMPTSEOYK PFDEMEOSCH DTHZ PF DTHZB U FPK GEMSHHA, YuFPVSHCH SDTP NPZMP RPMOPUFSHA HRTBCHMSFSH RTPGEUUPTPN, B RTYMPTSEOIS OE NPZMY CHNEYBFFSHP ។ LPD YURPMOSEFUS U PRTEDEMIOOSCHN HTPCHYEN RTYCHYMEZYK. h x86 YI GEMSHI 4 YFKHLY - PF 0 DP 3. OHMECHPK HTPCHEOSH UBNSCHK RTYCHYMEZYTPCHBOOSCHK (NPCEF CHSHCHRPMOSFSH MAVSHE LPNBODSCH Y NEOSFSH TETSYNSCH TBVPTBKFSCH) ។ LBB Comkhuba នៅ Uerezneoofbgyek, TBTBPFULY X86 RETEVPTAMYA នៅ Zholgypobmpn Yurpmshkhaf MYYSHA HTPCHOS YUEFSHTSHIEYA, BTIZYEEPHPHTHPHPHTHPHTHPHTHPHTHPHTBB FPPHEUUBUTBBUUPBUPPUPFUPHUPHEYA x LBTsDPZP UEZNEOFB CH EZP DEULTYRFPTE HLBBO DPL (កម្រិតសិទ្ធិអ្នកពណ៌នា)- HTPcheOSH DPUFHRB OEPVIPDYNSCHK DMS DBOOPZP UEZNEOFB ។ oERTYCHYMEZYTPCHBOOSCHK LPD OE NPTCEF RPMHYUYFSH DPUFHR L UEZNEOPH U HTPCHOYEN DPUFHRB 0, B RTYCHYMEZYTPCHBOOSCHK LPD NPTCEF RPMHYUYFSH DPUFHR LP CHUUNEZ ។

уЕМЕЛФПТ УЕЗНЕОФБ, ЛПФПТЩК УПДЕТЦЙФУС Ч УЕЗНЕОФОПН ТЕЗЙУФТЕ, СЧМСЕФУС ОЕ РТПУФП ОПНЕТПН ЬМЕНЕОФБ Ч ФБВМЙГЕ, ОП Й ХЛБЪБФЕМЕН ХТПЧОС ДПУФХРБ - НМБДЫЙЕ 2 ВЙФБ УПДЕТЦБФ ХТПЧЕОШ РТЙЧЙМЕЗЙК (ПФ 0 ДП 3), Б ХЦЕ УФБТЫЙЕ ОПНЕТ УБНПК ФБВМЙГЩ. fBLYN PVBPN UEMELFPT = (YODELU_DEULTYRFPTB shl 2) + RPL ។ RPL- កម្រិតឯកសិទ្ធិដែលបានស្នើសុំ RTY LFPN RPL DPMCEO VSCFS VPMSHY YMY TBCHEO NBLUINBMSHOPNH Ъ DPL й CPL (កម្រិតសិទ្ធិបច្ចុប្បន្ន)។ CPL TBCHEO RPL UEMELFPTB H CS ។ fBLYN PVTBBPN LPD OE NPTCEF RPMKHYuYFSH DPUFHRB អិល UEZNEOFBN, ក្រុមហ៊ុន H LPFPTSCHI HTPCHEOSH DPUFHRB CH YUYUMPCHPN CHYDE OYCE, YUEN X OEZP UBNPZP ។ s, CHETPSFOP, PRIUBM DPUFBFPYuOP BRHFBOOP, OP CHRPMOE NPTsOP PVPKFYUSH RPL = DPL, LBL NSCH Y RPUFHRIN ។

rPLB NSC RYYEN FPMSHLP SDTP, NSC VKHDEN TBVPFBFSH CH OKHMECHPN LPMShGE BEIFSHCH (FBL EEI OBSCCHBAF HTPCHOY RTYCHYMEZYK), YUFPVSH YNEFSH RPMOSHK DPUFHR L BRRBTBFKhTE ។

UEZNEOFBGYS OBN O OHTSOB, RPFPNKH S OE VKHDH PUFBOBCHMYCHBFSHUS RPLB UFP អំពី ZHPTNBFE DEULTYRFPTB, B DBN ZPFPCHSCHHE OBBYUEOYS ។ eUMY YOFETEUOP, NPTSEFE RPYUYFBFSH LFH UFBFSHHA ។ tBUUNPFTYN RTPUFEKYYK LPD RETEIPDB CH ЪBEYEIIOOSCHK TETSYN ។

; bBRHUL 32-TBTSDOPZP SDTB.start32: ; WHCHCHPDYN HCHEDPNMEOYE P BRHULE 32-VYFOPZP SDTB mov si, start32_msg call write_str ; bztkhjn bobyueoye h GDTR lgdt ; bBRTEFYN RTETSHCHCHBOYS cli ; RETEKDYN H BEEYEIIOOSCHK TEZYN mov eax, cr0 ឬ eax, 1 mov cr0, eax ; RETEKDIN អំពី 32-VYFOSHK LPD jmp 8: start32 ; fBVMYGB DEULTYRFPTPCH UEZNEOPFC DMS 32-VYFOPZP SDTB តម្រឹម 16 gdt32: dq 0; NULL - 0 dq 0x00CF9A000000FFFF ; លេខកូដ - 8dq 0x00CF92000000FFFF ; ទិន្នន័យ - 16 gdtr32: dw $ - gdt32 - 1 dd gdt32 ; 32-VYFOSHK LPD use32 start32: ; mov eax, 16 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax movzx esp, sp ; WHCHCHPDYN UYNCHPM អំពី LLTBO mov byte "!" ; jmp $

FFPF LPD UMEDHEF DPRYUBFSH អិល

рЕТЕД РЕТЕИПДПН Ч ЪБЭЙЭЈООЩК ТЕЦЙН ОЕПВИПДЙНП ЪБРТЕФЙФШ РТЙЈН БРРБТБФОЩИ РТЕТЩЧБОЙК (ЛМБЧЙБФХТБ, НЩЫШ, ФБКНЕТ Й ДТХЗЙЕ ХУФТПКУФЧБ), РПФПНХ ЮФП BIOS РПУМЕ РЕТЕИПДБ ПУФБЈФУС ОЕ Х ДЕМ, Б УЧПЙ ПВТБВПФЮЙЛЙ НЩ ЕЭЈ ОЕ ОБРЙУБМЙ, РПЬФПНХ РЕТЧПЕ ЦЕ РТЕТЩЧБОЙЕ ПВТХЫЙФ УЙУФЕНХ.

oERPUTEDUFCHEOOP RETEIPD H ЪBEYEIIOOSCHK TETSIN PUKHEEUFCHMSEF HUFBOPCHLB OHMECHPZP VYFB CH CR0 ។ yNEOOP LFP NSCH Y DEMBEN (RTSNPC DPUFKhR L CR0,2,3,4 OECHPЪNPTSEO FBL TSE LBL Y L UEZNEOFOSHCHN TEZYUFTBN, RPFPNKh YURPMSHEKHEN EAX) ។ oEUNPFTS OB FP, UFP NSC HCE RETEYMY CH BEEIEIOOSHCHK TETSIN, LPD RTPDPMTSBEF YURPMOSFSHUS RP-RTETSOENH 16-VYFOSHCHK ។ dms dYTELFYCHB BUUENVMETB ប្រើប្រាស់32 ZPCHPTYF ENH, UFP DBMSHOEKYK LPD CHSHCHRPMOSEFUS CH ЪBEEIЈOOPN TETSYNE Y OEVPVIPDYNP RETELMAYUYFSHUS CH TETSYN ZEOETBGYYY OPN ( OEVPYOPN POYFSHUS CH TETSYN ZEOETBGYYY LPN)

lPNBODB movzx TBUYTSEF CHFPTPK BTZHNEOF DP RETCHPZP ។ h UNSHUME, YUFP YЪ 16 VYFOPZP OBBYUEOYS SP RPMHYUBEFUS 32-VYFOPE ។ uFBTYYE VYFSCH PVOHMSAFUS (NBMP MY, UFP FBN VSCHMP DP OBU) ។ rTEDRPUMEDOSS LPNBODB DENPOUFTYTHEF OBN CHPЪNPTSOPUFY ЪBEYEIIOOPZP TETSYNB - NSC PVTBEBENUS RP BVUPMAFOPNKH 32-VYFOPPNKh BDTEUKH L CHYDEP-RBFFCHPCH ! CH RTBCHSHCHK OYTSOYK HZPM LTBOB (FELUFPCHSCHK LTBO YNEEF TBTEYOYE 80 x 25 Uinchpmch, LBCDShCHK UINCHPM BOINBEF CH RBNSFY DCHB VBKFB - LPD UINCHPMB Y EZP BCHYVH) ។

NSC VPMSHIE OE NPTSEN PVTBEBFSHUS L UETCHYUBN BIOS, FERETSH RTYYMP CHTENS OBN UFBFSH RPMOPUFSHHA UBNPUFPSFEMSHOSHCHNY Y UBNYN HRTBCHMSFSH CHUEN PVPTKHDPCHBOYEN ។ RETEBZTHTSBFSHUS Y TsDBFSH OBTSBFYS អំពី LMBCHYYH NSC RPLB OE HNEEN, RPFPPNKh RTPUFP ЪBCHYUBEN U RPNPESHA LPNBODSCH jmp $ (RETEIPD អំពី FX CE UBNHA LPNBODULM - ។

h ធម្មតា boot.cfg LPNBODH S64 RPLB JBNEOIN OB S32 ។ FERETSH, EUMY CHSHCHUY RTBCHYMSHOP UDEMBMY, OBY ЪBZTKHYUYL VKHDEF ЪBCHETYBFSH UCHPA TBVPFKH CHSHCHCHPDPN ChPULMYGBFEMSHOPZP ЪOBLB CH KhZPM LTBOBYЪ ЪBEZ FP FPMSHLP OBUBMP ។ NS OBLPOEG-FP RTBLFYUEULY KHYMYY YЪ TEBMSHOPZP TETSYNB (នៅលើ UBNPN DEME FBN EEI PUFBMPUSH OENPZP DEM) H BEEYEIIOOSCHK ។ Rpulpmshlh CHABZTHYUILEL CHCHRPMOSEFUS chMECHENEOFE TEBMshopzp Tekinb, Chueeoeeois Uppeffchhaf Zhyryotyipda Chuyoshchk Tsin, Oyuyuzp ។

h ЪBCHETEOYE CHSHCHHRULB, RPTsBMHK, DPVBCHMA RPUMEDOYK YFTYI - RTPCHETLKH, UFP RTPGEUUPT RPDDETSYCHBEF ЪBIEEIIOOSCHK TETSYN ។ UHFSH RTPCHETLY CH FPN, UFP OE CHUE VYFSCH ទង់ NPTsOP YЪNEOYFSH RTPZTBNNOP ​​។ FP EUFSH TEZYUFT OE UPCUEN 16-VYFOSHCHK ។ អំពី OPCHSCHI RTPGEUUPTBI DPUFHROP DMS YNEOEOYS VPMSHIE VYF Y FP NPTsOP PVOBTHTSYFSH ។ TBVETYFE LPD OYCE UBNY, ULBTSH FPMSHLP, UFP LPNBODB pushf RPNEEBEF TEZYUFT ZHMBZPCH H UFEL, B popf CHCHFBMLYCHBEF UPDETSYNPE UFELP PE ទង់។ fBLYN PVTBYPN EZP NPTsOP NEOSFSH GEMILPN, BOE PFDEMSHOSHCHNY LPNBODBNY ។ CHPF RPMOSHCHK LPD OBYEZP ЪBZTKHYULB៖

org 0x7C00 jmp boot ; bZPMCHPL 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 ? ; bZPMCHPL JBKMB និម្មិតនៅ 0x800 f_info: f_name rb 256 f_next dq ? f_prev dq ? f_parent dq ? f_flags dq ? f_data dq ? f_size dq ? f_ctime dq ? f_mtime dq ? f_atime dq ? និម្មិត; DBOOSH OBJUBMSHOPZP JBZTHYULB label sector_per_track word នៅ $$ label head_count byte at $$ + 2 label disk_id byte at $$ + 3 reboot_msg db "ចុច any key...",13,10,0 boot_file_name db "boot.bin",0 ; hHCHPD UFTPLY DS:SI OB LTLBO write_str: push si mov ah, 0x0E @: lodsb test al, al jz @f int 0x10 jmp @b @: pop si ret ; កំហុស lTYFYUEULBS PYVLB៖ pop si call write_str ; rete_bzthlb ចាប់ផ្ដើមឡើងវិញ៖ mov si, reboot_msg ហៅ write_str xor ah, ah int 0x16 jmp 0xFFFF:0 ; bZTHLB UELFPTB DX:AX H WCHET ES:DI load_sector: push dx add ax, word adc dx, word cmp byte, 0xFF je .use_EDD push bx cx si div mov cl, dl inc cl div mov dh, ah mov ch, al mov dl, mov bx, di mov al, 1 mov si, 3 @: mov ah, 2 int 0x13 jnc @f xor ah, ah int 0x13 dec si jnz @b .error: call error db "DISK ERROR",13,10 ,0 @: pop si cx bx dx ret .use_EDD: push si mov byte, 0x10 mov byte, 0 mov word, 1 mov, di pushes pop word mov, ax mov, dx mov word, 0 mov word, 0 mov ah , 0x42 mov dl, mov si, 0x600 int 0x13 jc .error pop si dx ret ; rPYUL JBKMB U YNEOEN DS:SI H LBFBMPZE DX:AX find_file: push cx dx di .find: cmp ax, -1 jne @f cmp dx, -1 jne @f .not_found: call error db "NOT FOUND", 13, 10,0 @: mov di, f_info call load_sector push di mov cx, 0xFFFF xor al, al repne scasb neg cx dec cx pop di push si repe cmpsb pop si je .found mov ax, word mov dx, word jmp .find ។ បានរកឃើញ៖ pop di dx cx ret ; ъBZTHЪLB FELHEEZP ZhBKMB Ch RBNSFSH RP BDTEUKh BX:0 ។ lPMYUEUFFCHP JBZTHCEOOOSCHI UELFPTPCH CHPCHTBEBEFUS H AX load_file_data: រុញ bx cx dx si di mov ax, word mov dx, word .load_list: cmp ax, -1 jne @f cmp dx, -1 jne @f .file_end: pop x cmp di mov ax, bx pop bx sub ax, bx shr ax, 9 - 4 ret @: mov di, 0x8000 / 16 call load_sector mov si, di mov cx, 512 / 8 - 1 .load_sector: lodsw mov dx, add si, 6 cmp ax, -1 jne @f cmp dx, -1 je .file_end @: push es mov es, bx xor di, di call load_sector add bx, 0x200 / 16 pop es loop .load_sector lodsw mov dx, jmp .load_list ; fPYULB CHIPDB CH OBYUBMSHOSHCHK ЪBZTHYUYL ចាប់ផ្ដើម៖ ; oBUFTPYN WEZNEOFOSHCHE TEZYUFTSH jmp 0:@f @: mov ax, cs mov ds, ax mov es, ax ; oBUFTPYN UFEL mov ss, ax mov sp, $$ ; tbteyyn rtetschchchboys sti ; bRPNOIN OPNET bZTHЪpyuopzp DYULB mov , dl ; mov ah, 0x41 mov bx, 0x55AA int 0x13 jc @f mov byte, 0xFF jmp .disk_detected @: mov ah, 0x08 xor di, di pushmov es int 0x13 pop es jc load_sector.error inc , dh 11 cx, 1 disk_detected: ; bZTHJIN RTPPMTSEOYE OBJUBMSHOPZP bZTKHJULB mov si, boot_file_name mov mov ax, word mov dx, word call find_file mov bx, 0x7E00 / 16 call load_file_data ; RETEIPDYN អំពី RTPDPMCEOJE jmp boot2 ; rHUFPE RTPUFTBOUFCHP Y UYZOBFHTTB rb 510 - ($ - $$) db 0x55,0xAA ; dRPMYFEMSHOSHE DBOOSHE JBZTHYULB load_msg_preffix db "កំពុងផ្ទុក "",0 load_msg_suffix db "". ..",0 ok_msg db "OK",13,10,0 config_file_name db "boot.cfg",0 start16_msg db "ចាប់ផ្តើមខឺណែល 16 ប៊ីត...",13,10,0 start32_msg db "ចាប់ផ្តើមខឺណែល 32 ប៊ីត។ ..", 13,10,0 ; tBVEOYE UFTPLY DS:SI RP UYNCHPMH UMEYB split_file_name: push si@: lodsb cmp al, "/" je @f test al, al jz @f jmp @b @: mov byte, 0 mov ax, si pop si ret ;bZTHJLB JBKMB U YNEOEN DS:SI N VHZET BX:0.tBNET JBKMB N UELFPTBI PPCHTBEBEFUS N AX load_file: push si mov si, load_msg_preffix call write_str pop si call write_str push si mov si, load_str 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 ; рТПДПМЦЕОЙЕ ОБЮБМШОПЗП ЪБЗТХЪЮЙЛБ boot2: ; ъБЗТХЪЙН ЛПОЖЙЗХТБГЙПООЩК ЖБКМ ЪБЗТХЪЮЙЛБ mov si, config_file_name mov bx, 0x1000 / 16 call load_file ; чЩРПМОЙН ЪБЗТХЪПЮОЩК ​​​​УЛТЙРФ mov bx, 0x9000 / 16 mov bp, 0x6000 mov dx, 0x1000 .parse_line: mov si, dx .parse_char: lodsb test al, al jz .config_end cmp al, 10 je .run_command cmp al, 13 je .run_command jmp .parse_chard x .run_com, 0. cmp byte, 0 je .parse_line ; rHUFBS UFTPLB cmp byte, "#" je .parse_line ; lPNNEOFBTYK cmp byte, "L" គឺ .load_file ; bZTHJLB JBKMB cmp byte, "S" je .start ; bBRHUL 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 NSC 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 mov word, dx mov word, 0 mov word, 0 pop ax shr ax, 9 - 4 បន្ថែម bx, ax បន្ថែម bp, 16 pop dx jmp .parse_line ; bBRHUL SDTB.start: ; rTPCHETYN, UFP ЪBZTKhTSEO IPFS VSH PYO ZHBKM cmp bx, 0x9000 / 16 ja @f កំហុសការហៅ db ​​"NO KERNEL LOADED",13,10,0 @: ; bBRPMOSEN RPUMEDOIK LMENEOF URYULB JBKMPCH xor ax, ax mov cx, 16 mov di, bp rep stosw ; RETEIPDYN L RTPGEDHTE YOYGYBMYYBGYY SDTB DMS OHTSOPK TBTSDOPUPY inc si cmp word, "16" je .start16 cmp word, "32" je .start32 ;cmp word, "64" ;je start64 ; oEYCHEUFOBS TSTSDOPUFSH SDTB កំហុសការហៅ db ​​"អាគុយម៉ង់ពាក្យបញ្ជាចាប់ផ្តើមមិនត្រឹមត្រូវ", 13,10,0 ; bBRHUL 16-TBTSDOPZP SDTB.start16: mov si, start16_msg mov bx, 0x6000 mov dl, jmp 0x9000 ; bBRHUL 32-TBTSDOPZP SDTB.start32: ; WHCHCHPDYN HCHEDPNMEOYE P BRHULE 32-VYFOPZP SDTB mov si, start32_msg call write_str ; rTPCHETYN, UFP RTPGEUUPT OE IHCE 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 @: ; bztkhjn bobyueoye h GDTR lgdt ; bBRTEFYN RTETSHCHCHBOYS cli ; RETEKDYN H BEEYEIIOOSCHK TEZYN mov eax, cr0 ឬ eax, 1 mov cr0, eax ; RETEKDIN អំពី 32-VYFOSHK LPD jmp 8: start32 ; fBVMYGB DEULTYRFPTPCH UEZNEOPFC DMS 32-VYFOPZP SDTB តម្រឹម 16 gdt32: dq 0; NULL - 0 dq 0x00CF9A000000FFFF ; លេខកូដ - 8dq 0x00CF92000000FFFF ; ទិន្នន័យ - 16 gdtr32: dw $ - gdt32 - 1 dd gdt32 ; 32-VYFOSHK LPD use32 start32: ; mov eax, 16 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax movzx esp, sp ; WHCHCHPDYN UYNCHPM អំពី LLTBO mov byte, "! " ; 'បួន' jmp $

ដើម្បីសរសេរ OS អ្នកត្រូវយល់ព័ត៌មានលម្អិតជាច្រើន។ នៅទីនេះខ្ញុំសូមបំភ្លឺអ្នកបន្តិច (ប៉ុន្តែសូមយល់ព្រមថាអ្នកនឹងអានម៉ាណាដោយខ្លួនឯងដើម្បីឱ្យមានរឿងដែលត្រូវនិយាយ) ។
និយាយឱ្យត្រង់ទៅ មានសម្ភារៈ PM ជាច្រើននៅលើបណ្តាញ ហើយ iley និង pehat បាននិយាយបន្តិចបន្តួចអំពីរបៀបនេះ ប៉ុន្តែខ្ញុំត្រូវបានគេសុំឱ្យពណ៌នាវាក្នុងន័យទូទៅយ៉ាងណាក៏ដោយ។ ឥឡូវនេះខ្ញុំនឹងបង្ហាញទ្រឹស្តីមួយដោយសង្ខេប (តាមពិតទៅ Intel បានសរសេរ mana ពិសេសសម្រាប់រឿងនេះ) បន្ទាប់មកយើងនឹងចាប់ផ្តើមសរសេរកូដ។

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

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

1. ដែនកំណត់ផ្នែក៖
គោលបំណងនៃវាលនេះគឺច្បាស់លាស់ពីឈ្មោះប៉ុន្តែមានល្បិចមួយ។ ឆ្កែត្រូវបានកប់នៅក្នុង G (Granularity) ប៊ីត។
ប្រសិនបើវាមិនត្រូវបានកំណត់ នោះអង្គចងចាំត្រូវបាន 'រាប់' ជាបៃ។ ក្នុងករណីបែបនេះ ទំហំផ្នែកអាចប្រែប្រួលពី 1 បៃទៅ 1 មេហ្គាបៃក្នុង 1 បៃ។
ប្រសិនបើយើងកំណត់វាទៅជា 1 នោះទំព័រសតិនឹងត្រូវបានណែនាំ។ បន្ទាប់មកយើងនឹងអាចដោះស្រាយពី 4 គីឡូបៃទៅ 4 ជីហ្គាបៃនៃ RAM ជាមួយនឹងការផ្លាស់ប្តូរទំហំ 4 គីឡូបៃ (ទំហំទំព័រ) ។ ជាទូទៅ អាសយដ្ឋានទំព័រគឺល្អជាង (ប្រៀបធៀប (1Mb+64Kb-16byte) និង 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's, I note, the address)។
នៅទីនេះអ្វីគ្រប់យ៉ាងនឹងមិនរលូនដូចនៅក្នុង manas ទាំងនោះនៅពេលដែលពួកគេប្តូរទៅ PM ដោយផ្ទាល់ពីកម្មវិធីចាប់ផ្ដើមប្រព័ន្ធ។ អ្វីគ្រប់យ៉ាងគឺស្មុគស្មាញបន្តិច។ ប៉ុន្តែជាដំបូង សូមក្រឡេកមើលកូដដែលកម្មវិធីចាប់ផ្ដើមប្រព័ន្ធនឹងផ្ទុក (យើងសរសេរអ្វីៗទាំងអស់ជា FASM "e) នេះជាប្រភេទ helloworld តោះ boot ទៅ PM ហើយព្រីនសារជូនពរនោះហើយ។

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

Jmp 1000h: r_start

ផ្លាស់ទី 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
ddGDT+10000 ម៉ោង។
; អ្នកត្រូវសរសេរអាសយដ្ឋាន 32 ប៊ីត។ ឥឡូវនេះយើងស្ថិតនៅក្នុងផ្នែក 1000h ដែលមូលដ្ឋានគឺ 1000h * 10h (ដោយ; អាសយដ្ឋានរូបវន្ត) => អាសយដ្ឋានរូបវន្តនៃ GDTR (ស្លាក!) = 10000h (អាសយដ្ឋានរូបវិទ្យានៃផ្នែកមូលដ្ឋាន) + អុហ្វសិត

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

Startup32: ;ចំណុចចូល PM
mov ax,10h;shove selectors នៅទីនេះ។ ជាញឹកញាប់ (! កុំភ្លេចអំពីលេខស៊េរីនៅក្នុង
mov es,ax ;table) កម្មវិធីជ្រើសរើសផ្នែកកូដ - 08h. ទិន្នន័យ - 10 ម៉ោង, ផ្នែកវីដេអូ - 18 ម៉ោង។
mov ds,ax
mov fs,ax
mov ss, ax
mov esp,10000h; ជង់
movax, 18 ម៉ោង។
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 និងរហូតដល់ចុងក្រោយបំផុត នៅពេលបើកថាមពល (បន្ទាប់ពី "កំណត់ឡើងវិញ" ដំបូង) ដំណើរការក្នុងរបៀបអាសយដ្ឋានពិត (របៀបពិត)។ ជាធម្មតា របៀបពិតត្រូវបានប្រើជាកម្រិតមធ្យមសម្រាប់ការប្តូរទៅរបៀបការពារបន្ទាប់ពីការចាប់ផ្តើមនៃប្រព័ន្ធ microprocessor ឬសម្រាប់ដំណើរការលឿនជាងមុននៃកម្មវិធីដែលបានសរសេរសម្រាប់ 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 មិន​បាន​ចាប់​ផ្តើម​ភ្លាមៗ​ក្នុង​របៀប​ការពារ​ទេ ប៉ុន្តែ​បាន​ធ្វើ​ការ​នៅ​ក្នុង​អ្វី​ដែល​ហៅ​ថា​របៀប​ពិត (" របៀបពិត") លើសពីនេះ របៀបនីមួយៗមានទម្រង់រងមួយ ឬច្រើន។ សូមវិភាគពួកវា។

របៀបពិត

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

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

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

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

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

របៀបការពារ

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

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

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

Multitasking Protected Mode Submode

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

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

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

របៀបមិនពិត

នេះគឺជាមុខងាររងពិសេសនៃរបៀបពិត។ ខួរក្បាលស្ថិតនៅក្នុងរបៀបពិត ប៉ុន្តែវាកំពុងដោះស្រាយសតិដោយបង្កើត " ឧបករណ៍ជ្រើសរើស៖ អុហ្វសិត"។ ដូច្នេះ អង្គចងចាំលើសពី 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, eax


; វដ្តពីរតូច

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

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

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

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

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

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

ស្ទី ;*

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

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

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

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

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

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

1. កម្មវិធីកំពុងដំណើរការ V86(និម្មិត 8086 );

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

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

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

នៅក្នុងជំពូកមុន យើងមានបញ្ហាដូចខាងក្រោម៖ កម្មវិធីមិនទទួលស្គាល់ថាវាស្ថិតក្នុងរបៀបការពារ ឬ V86ដែលធ្វើឱ្យប្រព័ន្ធព្យួរ ឬចាប់ផ្ដើមឡើងវិញ។ ប្រសិនបើយើងព្យាយាមដំណើរការកម្មវិធីក្រោមប្រព័ន្ធប្រតិបត្តិការ វីនដូ, នោះ។ វីនដូនឹងចាប់បានការប៉ុនប៉ងរបស់កម្មវិធីដើម្បីប្តូរទៅរបៀបការពារ ហើយជម្រុញឱ្យអ្នកចាប់ផ្តើមឡើងវិញនៅក្នុងរបៀបត្រាប់តាម 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 ម៉ោង al

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

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

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

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

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

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

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

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

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

; បិទបន្ទាត់ 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 Assembler ដើម្បីបង្កើនជំនាញសរសេរកម្មវិធីកម្រិតទាបរបស់ខ្ញុំ។ បច្ចុប្បន្នខ្ញុំមានបញ្ហាតូចមួយជាមួយគ្រោងការណ៍អាសយដ្ឋាននៅក្នុងរបៀបការពារ 32 ប៊ីត។

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

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

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

រហូតមកដល់ពេលនេះអ្វីៗដំណើរការបានល្អ។ "Jmp ProtectedMode" ដំណើរការដោយមិនមានការលោតឆ្ងាយច្បាស់លាស់ដើម្បីជម្រះជួរ prefetch ចាប់តាំងពីកម្មវិធីនេះត្រូវបានផ្ទុកនៅ offset 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 តាមរយៈ

lgdt

អ្វី​ដែល​ខ្ញុំ​នៅ​តែ​មិន​យល់​គឺ​ថា​តើ​ឥឡូវ​នេះ​ខ្ញុំ​ផ្លាស់​ប្តូ​រ​ទៅ​អាសយដ្ឋាន​រូបវន្ត 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 bit 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