Njia Iliyolindwa ni nini na inakuja na nini? Kubadilisha vichakataji vya Intel hadi hali iliyolindwa Inabadilisha hadi hali iliyolindwa ya kiunganishi

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

yFBL, LBL CHSH RPNOIFE, CH TEBMSHOPN TETSYNE TBVPFSH RTPGEUUPTB OBN DPUFHREO CHUEZP MYYSH 1 NEZBVBKF BDTEUOPZP RTPUFTBOUFCHB (YЪ LPFPTSCHI PVSHUSCHUPSCH6 LPFPTSCHI PVSHUSCHUSK6 KF). 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.

KUHUSU FPZP, UFP DPVBCHMSEFUS CH TEBMSHOPN TETSYNE KUHUSU RTPGEUUPTBI, LPFPTSHCHE RPDDETSYCHBAF 32-VYFOSCHK BDTEU (i386 Y CHCHYE) - DPVBCHMSAFUS OPCHUSCH, UVTEFCH, UVTEFCH TEZYU, UVTEFUS TEZYU TEZYU TEZYU, UVTEFUS ECX, EDX, ESP, EBP, EIP, ESI, EDI, EFLAGS. lBL NPTsOP DPZBDBFSHUS, LFP 32-VYFOSCH CHETUY PVSHYUOSCHI TEZYUFTPCH TEBMSHOPZP TETSINB (LYNEOY TEZYUFTB DPVBCHMSEFUS RTYUFBCHLB "E"). CHUE LFY 32-VYFOSCH TEZYUFTSH LTPNE EIP DPUFHROSCH Y CH TEBMSHOPN TETSYNE, OP CH FBLPN UMHYUBE VHDHF ЪBOINBFSH KUHUSU 1 VBKF VPMSHYE (LOYN DPVBCHMSEZFUS UCHULUU). KUHUSU RTPGEUUPTE NMPPTSE 286 FY LPNBODSCH VHDHF OELPTTELFOSCH. nsch NPTSEN, OBRTYNET, OBRYUBFSH mov eax, 0x12345678 Y RPUME bFPZP CH AX VHDEF 0x5678, RPFPNH YuFP JUU YA LBL VSH SCHMSEFUS "PLOPN" CH NMBDIKHA YUBUFSH TEZBUXUFNMB AXUFBSH (ALBUFSH TEZYUFTB), ALBUB. TEZYUFTB-PFPVTBTTSEOYS UFBTYEK YUBUFY 32-VYFOSHI TEZYUFTPC OE UHEEUFCHHEF - NPTsOP EЈ YICHMEYUSH FPMSHLP U RPNPESH BTYZHNEFYLY (OBRTYNET, UDCHYOKHFSH EAX6TB EAX ABOUT6TB eax1, UDCHYOKHFSH EAX ABOUT6TB eax FPZDB CH AX VHDEF UFBTYBS RPMPCHYOB, OP UPDETTSYNPE NMBDYI VYF VHDEF KHFETSOP) . YuFP IBTBLFETOP, CH ЪBEEYEOOOPN TETSYNE OBPVPTPF, LPNBODSCH TBVPFSCH U 16-VYFOSHNY TEZYUFTBNY (OP OE 8-VYFOSHCHNY) FTEVHAF RTEZHYLU, RPFPNH OUNPFTS ABUT ABCH TBPM, DPUPU ABUT ABCH TBPM, ЪBEEYEOOOPN TETSYNE VSCHUFTEE CHSHRPMOSAFUS Y BOYNBAF 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 UCHPVPPDOP 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 PRET BGYFTGYPPYPPYPPYPPYPPYPPYPPYPPYPPY PRET BGYDPYPLYPLNYSNYPNYSNYPNYSNYPNYSNYPNYPNYSNYSNYPNYSNYPSPNY) SCHOP KHLBYSCHBFSH, YuFP CHSH IPFYFE PVTBEBFSHUS YUETE OYI. oBRTYNET, mov shoka, .

rPNYNP bFPZP TBUYYTEOYS TEZYUFTPC, DPVBCHMSAFUS OPCHCHCHE HRTBCHMSAEYE TEZYUFTSH (TBOSHYE CHMYSM KUHUSU TETSYN TBVPFSH RTPGEUUPTB FPMSHLP FLAGS) - CR0, CR2, CR3 NA CR3. eUFSH Y DTHZYE (OBRTYNET, PFMBDPUOSCH TEZYUFTSHCH), OP SING OBU UEKUB OE YOFETEUHAF. yNEOOOP U RPNPESHA LFYI TEZYUFTPC RTPYCHPDYFUS RETELMAYUEOYE RTPGEUUPTB CH ЪBEEYEЈOOOSCHK TETSYN Y OBUFTPKLB OPCHSHHI ZHKHOLGYK CHTPDE UFTBOYUOPK BDTEUBGYY. imba 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 TETSINB. LBTSDSCHK BMENEOF FBVMYGSH ЪBOYNBEF 8 VBKF Y CH UREGYBMSHOPN ZHTNBFE PRYUSCHCHBEF VBPCHSHCHK BDTEU UEZNEOFB, TBNET, RTBCHB DPUFHRB Y F. D.

UEZNEOFSH ЪBEEYEOOOPZP TETSYNB DEMSFUS KUHUSU DCHB FIRB - UEZNEOFSH LPDB Y UEZNEOFSH DBOOSCHI (KUHUSU UBNPN DEM EUFSH EE CHUSLYE TSS Y LDT, OP RPLB POY OBNOE CHBTSOSH CHBTSOSH). h CS NPTsOP ЪБЗТХЦБФШ FПМШЛП OPNETB DEULTYRFPTCH, PRYUBOOSCHI LBL UEZNEOF LPDB, h PUFBMSHOSHE UEZNEOFOSHE TEZYUFTSH NPTsOP ЪBZTHTSBFSH MAVSHIP, FBLENE LUBNEOF LPDB. chBTSOBS TBJOYGB CH FPN, YuFP UEZNEOF LPDB NPTsOP FPMSHLP YUYFBFSH Y YURPMOSFSH, B UEZNEOF DBOOSHI FPMSHLP YUYFBFSH Y RYUBFSH. l UYUBUFSHA, UEZNEOFSH NPZKhF RETELTSHCHBFSHUS CH RBNSFY, RPFPNH NPTsOP UPJDBFSH DCHB DEULTYRFPTB, UUSHMBAEYEUS KUHUSU PDYO Y FPF TSE TEZYPO RBNSFY, OP PDYOMBYUMBYUSCHY DFFNCHY DFECH OSH DMS ЪBRYUY.

oEUNPFTS KUHUSU RPDDETSLH UEZNEOFBGYY, POB UYFBEFUS KHUFBTECHYEK. OH Windows, OH Linux OE YURPMSHJHAF EЈ CH RPMOPC NETE, B KUHUSU 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Ъ LPFPTSCHI VBPCHSHCHK BDTEU 0, B TBSHONET 4 stars (MCHKHES PKNTBNTBK 4 TB) MCH KHESPENCH -VYFOPN TETSYNE). h FBLPN UMKHYUBE ZPCHPTSF, YuFP NSCH CHLMAYUYUYUMY TETSYN MYOEKOSCHI BDTEUPCH - UNEOOYE UPPFCHEFUFCHHEF ZHIYYUUEULPNH BDTEUKH. lFP PYUEOSH HDPVOP Y S RPKDH RP FPNH TSE RKhFY. OE UMEDHEF RSCHFBFSHUS YURPMSHЪPCHBFSH UEZNEOFBGYA CH UCHPEK PRETBGYPOOPK UYUFENE - LFP UYMSHOP HUMPTSOSEF LPD SDTB, SJSHLY CHSHUPLPZP HTPCHOS (OBRTYNETNETY+ET YTSFTMY EEUFEZ+ET YTSFFEZY+YTSFTMY ET YTSFFEZY CHCH UNPTSEFE RPMOPGEOOOP RTPZTBNNYTPCHBFSH FPMSHLP KUHUSU Assembler) Y, OBLPOEG, CHCH OE UNPTSEFE RETEOUFY UYUFENKH KUHUSU DTHZHA BTIYFELFHTH, RPFPNKH YuFP x86 EDYOUFCHEOOBS, LPFPTBS KHNEEF LFPF NEIBOYN (Y FP, Ch 64-VYFOPN TETSYNE RPMS VBPCHPZP BDTEUB Y TBNETB UEZNEOFMUSSH' ZOPSHEUSCH UEZNEOFMUSSH' ZOPSHEUSH Y FPYFY FPY FPY FP LFPF NEIBOYN RTBCHBI DPUFHRB).

lBL S HCE ULBBM, FBVMYGB DEULTYRFPTPCH UEZNEOFPCH ZHTNYTHHEFUS UBNPK PRETBGYPOOPK UYUFENPK. YuFPVSH KHLBBBFSH RTPGEUUPTH, ZDE POB OBIPDFUS YURPMSH'HEFUS UREGYBMSHOBS LPNBODB - lgdt (Load Global Descriptor Jedwali). pOB RTOYNBEF 6-VBKFPCHHA RETENEOOKHA CH RBNSFY. RETCHCHE EЈ 16 VYF UPDETSBF TBNET FBVMYGSHCH VBKFBI (FBLYN PVTBBPN, NBLUINBMSHOPE LPMYUUEUFCHP DEULTYRFPTPCH - 65536 / 8 = 8192), RPUMEDHAEYE 32 VYFBY FUBTESHKOH VYCHYOH VYCHYOH VYCHYOH -PCH UBNPK FBVMYGSHCH (FP EUFSH VE KHYUFB CHUEI UEZNEOFPC). yNEEF UNSHUM CHSTTBCHOSFSH OBYUBMP FBVMYGSHCH KUHUSU 16 VBKF, RPFPNKH YuFP LFP KHMKHYUYBEF ULPTPUFSH DPUFHRB L E Ј MENEOFBN. RETCHSHCHK BMENEOF FBVMYGSCHUEZDB DPMTSEO VSCHFSH TBCHEO OKHMA Y MAVPE YURPMSHЪPCHBOIE OHMECHPZP UEMELFPTB(HLBBBFEMSH KUHUSU BMENEOF FBVMYGSH DEULTYRFPTPCH CH UEZNEOFOPN TEZYUFTE OBSCCHBEFUS FBL) RTYCHPDYF L PYYVLE. ъOBYUIF VPMEE-NEOOEE TVPFPURPUPVOBS FBVMYGB DEULTYRFPTPCH DPMTSOB UPDETSBFSH IPFS VSH FTY DEULTYRFPTB - RHUFPK, DEULTYRFPT LPDB, DEULTYRFPT DBOSCHI.

OH 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 rtypsk OBU NOPZPъBDBUOBS PU). lPD YURPMOSEFUS U PRTEDEMOOOSCHN KHTPCHOEN RTYCHYMEZYK. h x86 YI GEMSHCHI 4 YFKHLY - PF 0 DP 3. oKHMECHPK KHTPCHEOSH UBNSCHK RTYCHYMEZYTPCHBOOSCHK (NPTSEF CHSHCHRPMOSFSH MAVSHCH LPNBODSCH Y NEOSFSH TETSYNSCH FTETSUPSCH "TBVPFUPSCH RTCHEUPSCH RTCHEUPTCH." lBL Y CH UMHYUBE U UEZNEOFBGYEK, TBTBVPFYUYLY x86 RETEVPTEYMY U ZHKHOLGYPOBMPN Y CHUE pu YURPMSHJHAF MYYSH DCHB KHTPCHOS YYUEFSHCHTI CHPNPTSOSCHI, B DTHZIE BTICHYFELPHETYIE BTICHYFLTEUPSPHTEUPSPSYMPGE BTICHYFLETYI BTCHYFLTEUPSH TBPSCH. x LBTSDPZP UEZNEOFB CH EZP DEULTYRFPTE KHLBBO DPL (Kiwango cha upendeleo wa Kielezi)- HTPCHEOSH DPUFHRB OEPVIPDYNSCHK DMS DBOOZP UEZNEOFB. OERTYCHYMEZYTPCHBOOSCHK LPD OE NPTsEF RPMKHYUFSH DPUFHR L UEZNEOFH U HTPCHOEN DPUFKHRB 0, B RTYCHYMEZYTPCHBOOSCHK LPD NPTsEF RPMKHYUFSH DPUFHR LP CHUEN UEZNEOFBN.

uEMELFPT UEZNEOFB, LPFPTSCHK UPDETSYFUS CH UEZNEOFOPN TEZYUFTE, SCHMSEFUS OE RTPUFP OPNETPN BMENEOFB CH FBVMYGE, OP Y KHLBBBFEMEN KHTChOS DPUFHRB - NMBDYE UE RTPUFP OPNETPN BMENEOFB CH FBVMYGE, OP Y KHLBBBFEMEN KHTChOS DPUFHRB - NMBDYE UPADY 2 VDPMKEZHH B HCE UFBTYYE OPNET UBNPK FBVMYGSHCH. fBLYN PVTBBN UEMELFPT = (YODELU_DEULTYRFPTB shl 2) + RPL. RPL- Kiwango cha upendeleo kilichoombwa - ЪBRTBYCHBENSCHK HTPCHEOSH RTYCHYMEZYK. rTY LFPN RPL DPMTSEO VSHFSH VPMSHYE YMY TBCHEO NBLUINBMSHOPNKH YЪ DPL Y CPL (Kiwango cha sasa cha upendeleo). CPL TBCHEO RPL UEMELFPTB CH CS. fBLYN PVTBBPN LPD OE NPTSEF RPMKHYUFSH DPUFKHRB L UEZNEOFBN, KH LPFPTSCHI KHTPCHEOSH DPUFKHRB CH YUYUMPCHPN CHYDE OITSE, YUEN X 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 RPMOSHCHTEK DBPUFKHTEK DBHFHRCH.

UEZNEOFBGYS OBNOE OHTSOB, RPPFPNH S OE VHDH PUFBOBCHMYCHBFSHUS RPLB YuFP KUHUSU ZHTNBFE DEULTYRFPTB, B DBN ZPFPCHSHCHE 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 au eax, 1 mov cr0, eax; RETEKDEN KUHUSU 32-VYFOSHCHK LPD jmp 8:start32; fBVMYGB DEULTYRFPTPCH UEZNEOFPPCH DMS 32-VYFOPZP SDTB panga 16 gdt32: dq 0 ; NULL - 0 dq 0x00CF9A000000FFFF ; MSIMBO - 8 dq 0x00CF92000000FFFF ; DATA - 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 KUHUSU BLTB mov byte, "!" ; ъБЧТЭТІІе jmp $

ьFPF LPD UMEDHEF DPRYUBFSH L OBYENH OBYUBMSHOPNH ЪBZTHYUYLH.

RETED RETEIPDPN CH ЪBEEYEЈOOOSCHK TETSYN OEPVIPDYNP ЪBRTEFIFYFSH RTYEN BRRBTBFOSCHI RTETSCHCHBOYK (LMBCHYBFKHTB, NSHCHYSH, FBKNET Y DTHZIE KHUFTPKUFCHTE YuFP), RPFDPBUME YUFP, RPFPPKUFCHB CHPY 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, RPFPNH YURPMSHJKHEN EAX). oEUNPFTS KUHUSU FP, YuFP NSCH HCE RETEYMY CH ЪBEEYEOOOSCHK TETSYN, LPD RTDPDPMTSBEF YURPMOSFSHUS RP-RTETSOENH 16-VYFOSHCHK. dMS PLPOYUBFEMSHOPZP RETEIPDB OBN OHTSOP PVOPCHYFSH UPDETSYNPE UEZNEOFOSCHI TEZYUFTPC. DYTELFYCHB BUUENVMETB tumia32 ZPCHPTYF ENKH, YuFP DBMSHOEKYK LPD CHSHRPMOSEFUS CH ЪBEEYEOOOPN TETSYNE Y OEPVIPDYNP RETELMAYUIFSHUS CH TETSIN ZEOETBGYY LPNSHP-VHE OPNSHMPBOD OPNSHP-VHE OPZMPBOD DMS RP KHNPMMYUBOYA) .

lPNBODB movzx TBUYYTSEF CHFPTPK BTZKHNEOF DP RETCHPZP. h USHUME, YuFP JЪ 16 VYFOPZP OBYUEOYS SP RPMHYUBEFUS 32-VYFOPE. UFBTYYE VYFSH PVOHMSAFUS (NBMP MY, YuFP FBN VShchMP DP OBU). rTEDRPUMEDOSS LPNBODB DENPOUFTYTHEF OBN CHPNPTSOPUFY ЪBEEYEЈOOOPZP TETSYNB - NSCH PVTBEBENUS RP BVUPMAFOPNH 32-VYFOPNH BDTEUKH L CHYDEP-RBNSFY "CHYDEP-RBNSFY CHYDEP-RBNSFY FELUSPYNSFY FELUMCHHPY FELUMCHPSYPY FELUMCHPSYPY UCHPSYPY UCHPSYPY UCHPSYPY UCHPSYPY NSCH PVTBEBENUS!" CH RTBCHSHCHK OYTSOYK KHZPM LBOBOB (FELUFPCHSHCHK BLTBO YNEEF TBTEYEOYE 80 x 25 UYNCHPMPCH, LBTSDSCHK UYNCHPM ЪBOINBEF CH RBNSFY DCHB VBKFB - YPDh UYNCHPMB FEDHA).

nsch VPMSHYE OE NPTSEN PVTBEBFSHUS L UETCHYUBN BIOS, FERETSH RTYYMP CHTENS OBN UFBFSH RPMOPUFSHA UBNPUFPSFEMSHOSCHNY Y UBNYN HRTBCHMSFSH CHUEN PVPTHDPHBOYEN. RETEBZTHTSBFSHUS Y TsDBFSH OBTSBFYS KUHUSU LMBCHYYH NSCH RPLB OE KHNEEN, RPFPNH RTPUFP UBCHYUBEN U RPNPESH LPNBODSCH jmp $ (RETEIPD KUHUSU FH CE UBNHA LPNPOYUSH - VELMKY VELMK ).

h OBYEN boot.cfg LPNBODH S64 RPLB ЪBNEOYN KUHUSU S32. FERETSH, EUMY CHU CHU RTBCHYMSHOP UDEMBMY, OBY ЪBZTHYUYL VKhDEF ЪBCHETYBFSH UCHPA TBVPFKH CHCHPDPN CHPULMYGBFEMSHOPZP ЪOBLB Ch KHZPM LBOB YЪ ЪOPZPY. lFP FPMSHLP OBYBMP. nsch OBLPOEG-FP RTBLFYUEULY KHYMY YY TEBMSHOPZP TETSYNB (KUHUSU UBNPN DEM FBN EEЈ PUFBMPUSH OENOPZP DEM) CH ЪBEEYEЈOOSHCHK. rPULPMSHLH OBZTHYUYL CHSHRPMOSEFUS CH OHMECHPN UEZNEOFE TEBMSHOPZP TETSINB, CHUE UNEEEOYS UPPFCHEFUFCHHAF ZHJYUEULYN BDTEUBN Y RTY RETEEIPDE CH ЪBEOBEYEOUTSUTEOOOSCH OSHUTEOOSCH, SHCHBFSH.

h ЪBCHETYEOYE CHSHCHRKHULB, RPTSBMKHK, DPVBCHMA RPUMEDOYK YFTYI - RTPCHETLH, YuFP RTPGEUUPT RPDDETSYCHBEF ЪBEEYEOOOSCHK TETSIN. UHFSH RTPCHETLY CH FPN, YuFP OE CHUE VYFSH BENDERA NPTsOP YYNEOIFSH RTPZTBNNOP. FP EUFSH TEZYUFT OE UPCHUEN 16-VYFOSHCHK. KUHUSU 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 UPDETTSYNPE UFELB PENDERA. fBLYN PVTBUPN EZP NPTsOP NEOSFSH GEMYLPN, BOE PFDEMSHOSCHNY LPNBODBNY. ChPF RPMOSCHK LPD OBEZP ЪBZТХЪУЛБ:

Org 0x7C00 jmp boot ; ъБЗПМПЧПЛ ListFS pangilia 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 ? ; ъБЗПМПЧПЛ ЖБКМБ pepe kwa 0x800 f_info: f_name rb 256 f_next dq ? f_prev dq ? f_mzazi dq ? f_bendera dq ? f_data dq ? f_size dq ? f_ctime dq ? f_mtime dq ? f_atime dq ? mwisho wa mtandao; dBOOSHE OBYUBMSHOPZP ЪБЗТХЪУЛБ label sector_per_track word at $$ label head_count byte at $$ + 2 label disk_id byte at $$ + 3 reboot_msg db "Bonyeza kitufe chochote...",13,10,0 boot_file_name db", "boot_file_name db", ; hCHCHPD UFTPLAY DS:SI KUHUSU BLTB write_str: push si mov ah, 0x0E @: lodsb test al, al jz @f int 0x10 jmp @b @: pop si ret ; lTYFYUEULBS Hitilafu ya PYYVLB: pop si call write_str ; RETEЪБЗТХЛБ washa upya: mov si, reboot_msg call write_str xor ah, ah int 0x16 jmp 0xFFFF:0 ; ъБЗТХЛБ UELFPTB DX:AX CH VHJET ES:DI load_sekta: sukuma dx ongeza shoka, neno adc dx, neno cmp byte, 0xFF je .use_EDD push bx cx si div mov cl, dl inc cl div mov dh, ah mov dl, mov bx, di mov al, 1 mov si, 3 @: mov ah, 2 int 0x13 jnc @f xor ah, ah int 0x13 dec si jnz @b .kosa: kosa piga 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 push es pop word mov , ax mov , dx mov word, 0 mov word, 0 mov ah , 0x42 mov dl, mov si, 0x600 int 0x13 jc .kosa pop si dx ret ; rPYUL ZHBKMB U YNEOEN DS:SI CH LBFBMPZE DX:AX find_file: push cx dx di .tafuta: cmp ax, -1 jne @f cmp dx, -1 jne @f .haijapatikana: kosa piga db "HAIJAPATIKANA",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 .imepata mov ax, neno mov dx, neno jmp .pata . pop di dx cx ret; ъБЗТХЛБ FELHEEZP ZHBKMB CH RBNSFSH RP BDTEUKH BX:0. lPMYUEUFCHP ЪБЗТХЦЕОШИ UELFPTPCH CHPCHTBEBEFUS CH AX load_file_data: push bx cx dx si di mov ax, neno mov dx, neno .load_list: cmp ax, -1 jne @f cmp dx, -1 jne dix mov dx, -1. shoka, bx pop bx shoka ndogo, bx shr ax, 9 - 4 ret @: mov di, 0x8000 / 16 call load_sector mov si, di mov cx, 512 / 8 - 1 .load_sekta: lodsw mov dx, ongeza si, 6 cmp ax, -1 jne @f cmp dx, -1 je .file_end @: push es mov es, bx xor di, di call load_sector ongeza bx, 0x200 / 16 pop es loop .load_sector lodsw mov dx, jmp .load_list ; fPULB CHIPDB CH OBYUBMSHOSHCHK ЪBZTHYUYL buti: ; oBUFTPYN UEZNEOFOSHE TEZYUFTSH jmp 0:@f @: mov ax, cs mov ds, ax mov es, shoka ; oBUFTPYN UFEL mov ss, shoka mov sp, $$ ; TBTEYIN RTETSCHCHBOYS sti; ъBRPNOYN OPNET ЪБЗТХЪПУОПЗП ДУЛБ mov, dl; prtedemyn RBTBNEFTSH ЪБЗТХЪПУОПЗП ДУЛБ mov ah, 0x41 mov bx, 0x55AA int 0x13 jc @f mov byte, 0xFF jmp .disk_detected @: mov ah, 0xs3 push_error katika c dh mov , dh na cx, 111111b mov , cx .disk_gunduliwa: ; ъБЗТХЪН РТПДПМЦЭОЕ ОБИБМШОПЗП ъБЗТХЪУЛБ mov si, boot_file_name mov shoka, neno mov dx, neno piga find_file mov bx, 0x7E00 / 16 call load_file_data ; RETEIPDYN KUHUSU RTDDPMCEOYE jmp boot2; rKHUFPE RTPUFTBOUFCHP Y UYZOBFKHTB rb 510 - ($ - $$) db 0x55.0xAA ; dPRPMOYFEMSHOSH DBOOSH ЪБЗТХЪУЛБ load_msg_preffix db "Inapakia "",0 load_msg_suffix db "". ..",0 ok_msg db "Sawa",13,10,0 config_file_name db "boot.cfg",0 start16_msg db "Kuanzia 16 bit kernel...",13,10,0 start32_msg db "Kuanzia 32 bit kernel. ..",13,10,0 ; tБВЪВЪОЕУФТПЛИ 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 shoka, si pop si ret ; write_str pop si push si bp mov dx, neno mov ax, neno @: push ax call split_file_name mov bp, shoka pop call find_file test byte, 1 jz @f mov si, bp mov dx, neno mov ax, neno jmp @b @ : piga simu load_file_data mov si, ok_msg piga write_str pop bp si ret ; rTPDPMTSEOYE OBYUBMSHOPZP ЪБЗТХЪУИЛБ boot2: ; mov si, config_file_name mov bx, 0x100 0 / 16 call load_file ; CHSHRPMOYN ЪБЗТХЪПУОШК УЛТИРФ mov bx, 0x9000 / 16 mov bp, 0x6000 mov dx, 0x1000 .mstari_wa_changanuzi: mov si, dx .parse_char: jaribio la lodsb al, al jz .config_end cmp al, 10 je .run_command jemp3 par_run mtu : mov byte, 0 xchg dx, si cmp byte, 0 je .parse_line ; rHUFBS UFTPLB cmp byte, "#" je .parse_line ; lPNNEOFBTYK cmp byte, "L" je .load_file ; ъБЗТХЛБ ЖБКМБ cmp byte, "S" je .anza ; эBRHUL SDTB; oEYCHEUFOBS LPNBODB mov al, mov [.cmd], al call error db "Amri ya hati ya kuwasha isiyojulikana "" .cmd db ? db ""!",13,10,0 .config_end: ; rTY RTBCHYMSHOPN LPOZHYZHTBGYPOOPN ZHBKME NSCH OE DPMTSOSCH UADB RPRBUFSH; jmp kuwasha upya; ъБЗТХЛБ ЖБКМБ.load_file: push dx inc si call load_file push ax mov cx, 512 mul cx mov neno, shoka mov neno, dx mov neno, 0 mov neno, 0 mov ax, bx mov cx, 16 mul cx mov neno, a neno, neno la dx mov, neno la mov 0, 0 pop ax shr ax, 9 - 4 ongeza bx, shoka ongeza bp, 16 pop dx jmp .parse_line ; ъBRHUL SDTB.start: ; rTPCHETYN, YuFP ЪBZTHTSEO IPFS VSC PDYO ZhBKM cmp bx, 0x9000 / 16 ja @f kosa la simu db "NO KERNEL LOADED",13,10,0 @: ; ъBRPMOSEN RPUMEDOYK BMENEOF URYULB ZHBKMPCH xor shoka, shoka mov cx, 16 mov di, bp rep stosw ; RETEIPDYN L RTPGEDHTE YOYGYBMYBGYY SDTB DMS OKHTSOPK TBTSDOPUFY inc si cmp neno, "16" je .anza16 cmp neno, "32" je .start32 ;cmp neno, "64" ;je start64 ; oEYCHEUFOBS TSTSDOPUFSH SDTB kosa la simu db "Hoja batili ya amri ya kuanza",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 "Inahitajika i386 au bora",13,10,0 @: ; ъБЗТХХЪН ЪБУУЭОЭ Ч GDTR lgdt ; ъBRTEFYN RTETSCHCHBOYS cli; RETEKDEN CH ЪBEEYEЈOOOSCHK TETSYN mov eax, cr0 au eax, 1 mov cr0, eax; RETEKDEN KUHUSU 32-VYFOSHCHK LPD jmp 8:start32; fBVMYGB DEULTYRFPTPCH UEZNEOFPPCH DMS 32-VYFOPZP SDTB panga 16 gdt32: dq 0 ; NULL - 0 dq 0x00CF9A000000FFFF ; MSIMBO - 8 dq 0x00CF92000000FFFF ; DATA - 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 KUHUSU BLTB mov byte, "! ";

Ili kuandika mfumo wa uendeshaji, unahitaji kuelewa maelezo mengi. Basi ngoja nikuelimishe kidogo (lakini tukubaliane kwamba utasoma mana mwenyewe ili uwe na cha kuzungumza).
Kuwa waaminifu, kuna tani ya vifaa kwenye PM kwenye mtandao, na iley na pehat walizungumza kidogo kuhusu hali hii, lakini niliulizwa kuelezea kwa maneno ya jumla hata hivyo. Sasa nitaelezea kwa ufupi nadharia (kwa kweli, Intel aliandika mana hasa kwa hili), basi tutaanza kuandika msimbo.

Utangulizi wa Hali Iliyolindwa.
Kwa hivyo, PM ni tofauti sana na hali halisi (RM) ambayo imekuwa ikijulikana kwa kila mtu tangu siku za DOS. Sasa itabidi uizoea: hakuna sehemu za kilobyte 64 tuli, hakuna meza za kukatiza katika kilobyte 1, hakuna anwani za msingi za sehemu kwenye rejista za sehemu, kwa ujumla ulimwengu mpya kabisa.
Sasa sehemu zimeelezewa ndani Jedwali la Wafafanuzi wa Ulimwengu (GDT). Jedwali hili linaweza kuwa katika nakala moja pekee. Yeye ni muundo katika kumbukumbu. Sio sehemu! Inaweza kupatikana mahali popote kwenye kumbukumbu, lakini anwani na kikomo chake zimeandikwa kwenye rejista ya GDTR. Hapa kuna muundo wake:

Jedwali lenyewe lina rekodi za muundo ufuatao (kwa njia, rekodi ya sifuri haina tupu. Hii ni muhimu. Unapopata kumbukumbu 'iliyoelezewa' na maelezo ya sifuri, utapata #GP - Kosa la Ulinzi wa Jumla):
Wacha tuangalie kwa karibu muundo huu.

1. Ukomo wa Sehemu:
Madhumuni ya uwanja huu ni wazi kutoka kwa jina, lakini kuna hila. Mbwa huzikwa kwenye sehemu ya G (Granularity).
Ikiwa haijawekwa, basi kumbukumbu 'huhesabiwa' kwa ka. Katika kesi hii, saizi ya sehemu inaweza kutofautiana kutoka kwa 1 hadi megabyte 1 kwa saizi 1 ya baiti.
Ikiwa tutaiweka kwa 1, anwani ya kumbukumbu ya ukurasa itaanzishwa. Kisha tutaweza kushughulikia kutoka kwa kilobytes 4 hadi 4 gigabytes ya RAM na mabadiliko ya ukubwa wa kilobytes 4 (ukubwa wa ukurasa). Kwa ujumla, kushughulikia ukurasa ni vyema (linganisha (1MB+64Kb-16bytes) na 4GB). Wacha tuzungumze tu juu ya anwani ya sehemu katika chapisho hili. Ukurasa unastahili mjadala tofauti.

2.Anwani ya Msingi:
Hapa tunaonyesha anwani ya kimwili ya msingi.

3.Aina uga:
Mchanganyiko kidogo huamua aina ya sehemu:

4. S (aina ya kifafanuzi):
Nyaraka za Intel zinasema kwamba ikiwa kidogo hii haijawekwa, basi maelezo haya ni ya sehemu ya mfumo, vinginevyo - kanuni au data. Kwa mfumo tunamaanisha LDT, TSS, Interrupt Gates na wengine kama wao (zaidi juu yao baadaye).

5. DPL (Kiwango cha Upendeleo wa Kielezi):
Haki za sehemu iliyoelezwa. Kila mtu anajua pete.

6. P (sehemu ipo):
Ikiwa kidogo hii imewekwa, basi processor 'inajua' kwamba sehemu tayari iko kwenye kumbukumbu (ingawa itakuwa bora kusema halali). Ukipakia kichaguzi cha kifafanuzi na P kidogo haijawekwa kwenye rejista ya sehemu, ubaguzi wa #NP (haupo) utatokea. Kwa ujumla, nitaelezea maana ya kifungu hiki cha kupendeza baadaye kidogo.

7.D/B:
Inafasiriwa tofauti kwa makundi ya aina tofauti.
1. Kwa sehemu za msimbo:
Urefu wa anwani 32 au 16 unaofaa na saizi ya uendeshaji.
(1-32; 0-16);
2. Kwa stack:
Kiashiria cha rafu ni 32 au 16 kidogo. (1-32; 0-16);

8.G:
Huathiri vitengo (baiti, kurasa) ambamo kikomo cha sehemu kinapimwa. Kwa ujumla, Paging inaweza kuwashwa wakati wa kuhamia PM kwa kuweka biti 31 za rejista ya CR0.

Taarifa zingine zaidi:
Tunadhani kuwa neno Global halikuwekwa bure. Kwa hivyo kuna ishara nyingine. Hiyo ni kweli, kuna pia Jedwali la Kielezi la Ndani. Kunaweza kuwa na aina kubwa kati yao. Kwa mfano, zinaweza kutumika katika utekelezaji wa kazi, nk. Na hapa LDT tayari inajumuisha sehemu! Kwa hivyo zoea misemo kama 'maelezo ya sehemu ya jedwali la maelezo ya ndani'.

Baada ya kuelezea meza, tunahitaji kuipakia kwenye rejista GDTR. Hii haifanywi na mov. GDTR kujazwa na amri lgdt fword (thamani). Hiyo ni, unahitaji kuunda muundo huu mwenyewe na upakie kwenye rejista iliyotajwa hapo juu. Bado kuna timu zinazofanya kazi na sajili hii, lakini tunakimbia kote Ulaya.

Kitu kimoja zaidi. Katika PM, rejista za sehemu huhifadhi sio anwani za msingi za sehemu (kama katika RM), lakini vitu vilivyofunzwa haswa vinavyoitwa. wateuzi. Muundo wao ni kama ifuatavyo:

Hapa Index ndio nambari ya kawaida ya kielezi kwenye jedwali.
TI inaonyesha mahali pa kutafuta maelezo (in GDT au LDT).

Sasa kwa kuwa tayari ni wazi jinsi ya kujenga meza, hebu tuzungumze kuhusu jinsi ya kwenda kwa PM (kumbuka, hii inaweza kufanyika tu kutoka kwa RM). Kwa ujumla ... unahitaji tu kuweka kidogo 0 ya rejista ya kudhibiti CR0. Ingawa ninadanganya. Kwanza unahitaji kuzima usumbufu wote ( NMI (Vikwazo Visivyoweza Kuonekana) ikiwa ni pamoja na), fungua mstari wa anwani A20(ili anwani ya 32-bit inapatikana), pakua GDTR, na kuruka kwenye alama - kuanza.

Wacha tutumie kipakiaji (unaweza kutumia KOLIBRI's), ambayo itapakia nambari yetu kwa anwani 1000h:0 (anwani ya RM, naona).
Hapa, sio kila kitu kitakuwa laini kama katika manas hizo wakati wanabadilisha PM moja kwa moja kutoka kwa kiboreshaji. Kila kitu ni ngumu zaidi kidogo. Lakini kwanza, hebu tuangalie msimbo ambao bootloader itapakia (tunaandika kila kitu kwenye FASM) Hii ni aina ya helloworld. Hebu tuanze, nenda kwa PM na uchapishe salamu. Hiyo ni.

Umbizo la binary
shoka, shoka
cli ;anzisha upya rejista za sehemu
mov ss, shoka
sp, sp
sti
shoka shoka,3
ndani 10h

Jmp 1000h:r_start

Mov ax,1000h;rekebisha rejista
mov ds, shoka
hoja, shoka

Katika al, 0x92; wezesha A20
au al, 2
kwa 0x92, al

Lgdt fword ;pakia rejista ya GDTR
mov eax,cr0
au al,1;seti kidogo 0
mov cr0,eax;washa PM

Jmp fword 08h:Startup32; ruka kwa PM

Pangilia 8 ;kichakataji hushughulikia sahani iliyopangwa kwa kasi zaidi
GDT:
dq 0; tupu
db 0FFh,0FFh,0,0,0.9Ah,0CFh,0 ;msimbo
db 0FFh,0FFh,0,0,0.92h,0CFh,0;data
db 0FFh,0FFh,0,80h,0Bh,92h,40h,0 ;sehemu ya video
weka lebo GDT_SIZE kwa $-GDT
GDTR:
dw GDT_SIZE-1
dd GDT+10000h
; unahitaji kuandika anwani ya 32-bit. Sasa tuko katika sehemu ya 1000h, ambayo msingi wake ni 1000h*10h (kwa anwani halisi) => anwani ya kimwili ya GDTR (vitambulisho!) = 10000h (anwani ya kimwili ya msingi wa sehemu) + kukabiliana

Kweli ;sasa, kwa kweli, tunajaza nafasi hadi mwisho wa sehemu
rb 10000h-$;
mwisho wa mtandaoni
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PM32 Entry;;;;;;;;;;;;;; ;;
matumizi32
org $+10000h;hii ndiyo sababu: katika PM tunafanya kazi na sehemu za Flat, na ikiwa tutaacha msimbo;kwa PM kabla ya org, basi;anwani ya sehemu ya ndani haitaambatana na anwani ya Flat. Hivyo hapa ni.

Startup32: ; sehemu ya kuingia kwa PM
mov ax,10h ; hapa tunasukuma wateuzi. Mara nyingi (! usisahau kuhusu nambari ya serial ndani
mov es,ax ;meza) sehemu ya msimbo ya kichagua - 08h. data - 10h, sehemu ya video - 18h
mov ds, shoka
mov fs, shoka
mov ss, shoka
mov esp,10000h;stack
mov shoka,18h
mov gs, shoka

Mov esi,hi_string ;hebu tuonyeshe kuwa tumevuka kwa mafanikio
piga chapa
jmp$

;ESI - anwani ya mstari
chapa:
sukuma
ebx, ebx
mov ah,07h;sifa
inaweka:
mov al,
mov, shoka
pamoja na ebx
mtihani al, al
jnz anaweka
papadi
ret
hi_string db ‘Karibu PM, jamani’,0

Tumefanya nini? Kipakiaji kilitupakia kwa mafanikio katika anwani 1000h:0, kutoka ambapo tuliendelea kutekeleza. Kwanza imewashwa A20, imezima vikatizo vyote, vilivyopakiwa ndani GDTR thamani inayofaa, imeruka hadi kwenye lebo ya ingizo. Ninaona kwamba tuliruka
jmp fword 08h:Startup32
Hiyo ni, 08h ni kichaguzi cha maelezo ya msimbo. Izoee.

Sasa jinsi ya kuzindua muujiza huu. Binafsi, mimi hutumia WinImage na VirtualBox. Tunasukuma bootloader kwenye sekta ya boot ya diski ya floppy na kuweka faili ya .bin kwenye mizizi. Tunaihifadhi katika .vfd, taja njia ya picha ya diski ya floppy katika mali ya mashine ya virtual, uzinduzi na uone matokeo.

Katika toleo lijalo tutaangalia vikatizo, makosa, mitego, uavyaji mimba na jinsi zinavyofanya kazi, hunaswa na kutatuliwa. Hebu tuanze kuzungumza juu ya usanifu.

Vyanzo vya habari.
1) Ningependa kutoa shukrani zangu mara moja kwa Phantom_84 aka egos kwa kunionyesha njia sahihi na kunisaidia mwanzoni kabisa. Bila yeye ingekuwa vigumu zaidi kwangu kufahamu.

Wasindikaji wote Intel, kuanzia i80286 na hadi na ikiwa ni pamoja na ya mwisho, wakati ugavi wa umeme umegeuka (baada ya "kuweka upya" ya awali) wanafanya kazi katika hali halisi ya anwani (hali halisi). Kwa kawaida, hali halisi hutumiwa ama kama hali ya kati kubadili hadi hali iliyolindwa baada ya kuanzisha mfumo wa microprocessor, au kwa ajili ya utekelezaji wa haraka wa programu zilizoandikwa kwa ajili ya wasindikaji wadogo. 8086 , 80186 , lakini, ikilinganishwa na 8086 , 80186 , microprocessors za kisasa katika hali halisi zina seti pana ya maelekezo inayoweza kutekelezwa na uwezo wa kusindika uendeshaji wa 32-bit.
Kubadilisha processor kwenye hali iliyolindwa kutoka kwa hali halisi hufanywa kwa kupakia ndani CR0(Mchoro 1) maneno yenye thamani moja ya biti ya PE ( Linda Wezesha) Kwa upatanifu na programu ya 80286, biti ya PE inaweza pia kuwekwa kwa kutumia maagizo ya LMSW. Kabla ya kubadili, meza muhimu za maelezo lazima zianzishwe kwenye kumbukumbu IDT Na GDT. Mara baada ya kuwezesha hali ya ulinzi, processor ina CPL = 0.

Mchele. 1

Kwa vichakataji vyote vya 32-bit, mlolongo ufuatao wa hatua unapendekezwa kubadili hali iliyolindwa:
1. Lemaza ukatizaji unaoweza kufichamana kwa kuweka upya alama ya IF, na uzuie kutokea kwa ukatizaji usioweza kushikamana na mantiki ya nje. Msimbo wa programu wakati wa "kipindi cha mpito" lazima uhakikishe kutokuwepo kwa vighairi na usitumie kukatizwa kwa programu. Mahitaji haya yanasababishwa na mabadiliko katika utaratibu wa kuita vidhibiti vya kukatiza.
2. Pakia kwa GDTR anwani ya msingi GDT(Maelekezo ya LGDT).
3. Maagizo MOV CRO weka bendera ya PE, na ikiwa usimamizi wa kumbukumbu ya ukurasa unahitajika, basi bendera ya PG.
4. Mara tu baada ya hii, amri ya kuruka ya makutano ( JMP Mbali) au piga simu ( PIGA SIMU Mbali) ili kufuta foleni ya maagizo yaliyotolewa msimbo katika hali halisi, na kufanya usakinishaji wa kichakataji. Ikiwa paging imewezeshwa, basi misimbo ya maagizo MOV CRO Na JMP au WITO lazima iwe katika ukurasa ambao anwani ya kimwili ni sawa na anwani ya kimantiki (kwa kanuni ambayo udhibiti huhamishiwa, hitaji hili halijawekwa).
5. Ikiwa unapanga kutumia jedwali la maelezo ya ndani, maagizo LLDT kichaguzi cha sehemu ya kupakia LDT kwa rejista LDTR
6. Maagizo LTR pakia kichaguzi kwenye rejista ya kazi TSS kwa kazi ya awali ya hali iliyolindwa.
7. Pakia upya madaftari ya sehemu (isipokuwa CS), yaliyomo ambayo bado ni ya hali halisi, au fanya mpito au piga kazi nyingine (katika kesi hii, rejista zitapakiwa upya moja kwa moja). Rejesta za sehemu ambazo hazijatumiwa hupakiwa na kiteuzi cha thamani ya sifuri.
8. Maagizo LIDT kupakia kwenye rejista IDTR anwani na kikomo IDT- majedwali ya modi iliyolindwa kukatiza maelezo.
9. Ruhusu kukatizwa kwa maunzi inayoweza kuficha uso na yasiyoweza kushikamana

Makala haya yanatoa utangulizi wa kutengeneza programu zinazofanya kazi katika hali ya kichakata kilicholindwa. Hapa kazi kuu za programu yoyote inayofanya kazi katika hali ya ulinzi itasemwa na ufumbuzi wao utapewa. Kimsingi, programu zitaandikwa kwa lugha FASM.

Njia za uendeshaji za processor ya Intel 80386

Pamoja na ujio wa processor Intel 80386 usanifu uliibuka IA32. Ilichukua kuibuka kwa hali mpya ya kufanya kazi ya processor - iliyolindwa (" Hali Iliyolindwa") Kwa uoanifu na vichakataji vilivyotangulia kwenye mstari Intel 80x86 CPU 80386 haikuanza mara moja katika hali iliyolindwa, lakini ilifanya kazi katika ile inayoitwa hali halisi (" Hali Halisi"). Kwa kuongeza, kila hali ina submodes moja au zaidi. Hebu tuziangalie.

Hali halisi

Kichakataji kiko katika hali hii mara baada ya kushinikiza " Nguvu" kompyuta. Ufikiaji wa kumbukumbu katika hali halisi unafanywa na ujenzi " segment:offset", ambayo inaelezea anwani ya kimantiki. Thamani ya sehemu, kama vile mkato, inaanzia 0 kabla 0FFFFh.

Kwa kuwa kushughulikia kunaweza tu kufanywa ndani ya sehemu moja, ukubwa wa juu wa sehemu ni 64 kilobaiti Anwani ya kimwili, ambayo imewekwa kwenye basi ya anwani ya processor, imehesabiwa kulingana na formula:

linear anwani = sehemu * 16 + kukabiliana

Wasindikaji wa hali halisi 80186 Na 8086 thamani ya sehemu ilianzia 0 kabla 0F000h. Kwa hivyo, anwani ya juu iliyo wazi kwenye basi ya anwani ni 0FFFFh, ambayo inalingana na (2^20)-1 , i.e. megabaiti 1.

Kwa kweli, mwanzoni kiasi cha kumbukumbu kama hicho kilionekana kuwa kikubwa, lakini baada ya muda megabyte moja ikawa haitoshi. Pamoja na ujio wa processor 80286 kinachojulikana kuzuia kumbukumbu ikawa inapatikana U.M.B., kuanzia na anwani 0FFFFh:0010h na kumalizia na anwani 0FFFFh:0FFFFh(Baiti 65520 zaidi ya megabyte moja). Sasa unaweza kusanidi upya mfumo wa uendeshaji MS-DOS ili ichukue kizuizi hiki, ikitoa kilobytes 64 kwenye RAM.

Hali Iliyolindwa

Hali hii ina muundo tata ikilinganishwa na halisi. Anwani yenye mantiki inawakilishwa na ujenzi " kichaguzi:kupunguza". Kiteuzi kinaanzia 0 kabla 0FFFFh(kwa kweli, kuna wateuzi wachache mara 4 - zaidi juu ya hili katika makala zifuatazo). Kukabiliana, tofauti na hali halisi, ni 32-bit, ambayo inakuwezesha kushughulikia sehemu 4 za gigabyte. Anwani ya kimantiki inabadilishwa kuwa mstari kulingana na mpango ufuatao:

anwani ya mstari = msingi wa sehemu + kukabiliana

Anwani ya mstari huwekwa kwenye basi ya anwani ikiwa hali ya kuhutubia ukurasa haijawashwa. Vinginevyo, anwani ya mstari inabadilishwa kuwa ya kimwili, na kisha tu inawekwa kwenye basi ya anwani. Kwa kuongezea, hali iliyolindwa hukuruhusu kupanga kumbukumbu halisi, kufikia saizi ya hadi terabytes 64 na kutegemea tu saizi ya diski kuu (kwa mfano, faili sawa ya paging katika Windows hutumia kumbukumbu ya kawaida). Karibu mifumo yote ya uendeshaji ya kisasa inafanya kazi katika hali iliyolindwa.

Modi ndogo ya kufanya kazi nyingi ya hali iliyolindwa

Hali hii inakuwezesha kuandaa multitasking, yaani, uwezo wa kufanya kazi kadhaa wakati huo huo au mfumo wa watumiaji wengi.

Hali ya Virtual 8086

Hii pia ni hali ndogo ya Hali Iliyolindwa ambayo inakuruhusu kuunda mashine pepe ambayo hufanya kazi kana kwamba iko katika hali halisi, lakini inaendeshwa katika Hali Iliyolindwa.

Hali isiyo halisi

Hii ni hali maalum ndogo ya hali halisi. Kichakataji kiko katika hali halisi, lakini inashughulikiwa kwa kumbukumbu na " kichaguzi: kukabiliana". Kwa njia hii, kumbukumbu juu ya megabyte 1 inapatikana. Katika siku zijazo, hali ya ulinzi na submodes zake zitazingatiwa.

Mpango wa kwanza: badilisha hadi hali iliyolindwa

Mpito kwa hali ya ulinzi unafanywa kwa kuweka kidogo 0 kujiandikisha CR0. Mpito kwa hali halisi unafanywa kwa kuweka upya sifuri sawa. Fikiria programu inayofanya operesheni hii (lugha - Mkusanyaji wa gorofa):

matumizi16 ; Inatumia maagizo ya 16-bit

org 100h

Anza:

; Tuko katika hali halisi

hoja eax, cr0 ; Kusoma thamani ya rejista CR0
au al, 1 ; Weka sifuri kidogo
hoja cr0, kwa ; Andika thamani mpya ya CR0

; Tuko katika hali ya ulinzi

hoja eax, cr0 ; Kusoma thamani ya CR0
na al, 0fe ; Weka upya sifuri kidogo hadi 0
hoja cr0, kwa ; Hebu tuende kwenye hali halisi

; Tuko katika hali halisi

ret ; Ondoka kwenye programu

Hata hivyo, mpango huu ni ghafi kabisa kwa sababu looping haiwezi kutekelezwa ndani yake. Ukiandika amri kama hlt au jmp$, basi wakati usumbufu wa kwanza unapoanzishwa, kompyuta itaanza upya.

Kwa upande wetu, amri husababishwa haraka sana, lakini inawezekana kwamba katika muda kati ya utekelezaji wa amri yoyote katika programu yetu, usumbufu bado utasababisha, ambayo itasababisha kushindwa mara moja na kuanzisha upya. Kwa hivyo, unapaswa kutunza usumbufu. Kwa hivyo, wacha tuangalie orodha tena. Hii haiwezi kuitwa programu ya kwanza (badala yake, ingeenda zaidi ya sifuri), kwani haitekelezi vitendo vya msingi vya kubadili hali iliyolindwa. Ili kubadilisha kikamilifu hadi hali iliyolindwa na mipangilio ndogo, unahitaji kufanya hatua zifuatazo:

1. angalia ikiwa inawezekana kubadili hali iliyolindwa;

2. anzisha meza za maelezo;

3. lemaza kukatiza (zote zinazoweza kuficha na zisizoweza kuficha);

4. mstari wa wazi A20;

5. rejista za udhibiti wa kumbukumbu;

7. hamia kwenye sehemu ya msimbo ya biti 32 kwa kubatilisha rejista ya CS.

Lakini ni ya kutosha kwa programu ya kwanza kufanya hatua 3, 4, 5. Kisha kuifungua haitasababisha upya upya wa kompyuta. Hebu tuangalie kila tendo.

Kuzima ukatizaji hutuzuia kuwasha upya. Vikwazo vimegawanywa kuwa vinavyoweza kuficha na visivyoweza kushikamana. Ili kuzima ukatizaji unaoweza kuficha, unahitaji kuweka upya bendera KAMA kujiandikisha EFLAGS timu cli, kukatizwa kunawezeshwa na amri sti. Vikatizo visivyoweza kushikamana vimepigwa marufuku kwa njia tofauti kidogo. Kuna njia mbili za kufanya hivi: kupanga rejista za mtawala wa kukatiza (njia hii itajadiliwa baadaye kidogo) au kubadilisha sehemu ya saba ya bandari. 70h: ikiwa biti imewekwa, basi usumbufu umezimwa, ikiwa biti imewekwa upya, usumbufu unaweza kutekelezwa.

Sasa hebu tujiulize ni nini kazi ya mstari A20, Kwa hivyo ni nini hii. Mstari A20- moja ya mistari 32 ya anwani. Wakati boti za kompyuta, mstari A20 imefungwa. Hii inasababisha kizazi cha anwani 20-bit (yaani, nafasi nzima ya anwani ni sawa na (2^20)=1 megabyte). Hii imejumuishwa kwa utangamano wa processor. 8086 : kwa hivyo, kujaribu kuandika kwa anwani ya mstari 12345678h, tutaiandika kwa kweli 00045678h, ambayo inaweza kusababisha matokeo yasiyotarajiwa kabisa. Kwa hiyo, kwa utendaji kamili wa maombi ya 32-bit, mstari A20 lazima iwe wazi. Hii inafanywa kwa kuweka bit 1 bandari 92h, kufunga mstari A20- weka upya sehemu hii.

Msomaji tayari anafahamu hatua ya mwisho, na haipaswi tena kumuuliza maswali.

Kwa hiyo, hebu tuangalie orodha ya programu yetu mpya, ya kwanza, ambayo mzunguko mdogo tayari unatekelezwa. Mistari ambayo imeongezwa kwenye orodha iliyotangulia imewekwa alama ya nyota (*).

org 100h

Anza:

; Tuko katika hali halisi

cli ;*

katika al, 70h ;*
au al, 80h ;*
nje 70h , al ;*

; Fungua mstari A20

katika al, 92h ;*
au al, 2 ;*
nje 92, al ;*

hoja eax, cr0
au al, 1
hoja cr0, kwa


; Kitanzi kidogo mara mbili

hoja cx, 20 ;*

mzunguko: ;*
hoja shoka, cx ;*
hoja cx, 0ffffh ;*
kitanzi $ ;*
hoja cx, shoka ;*
kitanzi mzunguko;*

hoja eax, cr0
na al, 0fe
hoja cr0, kwa

; Funga mstari wa A20

katika al, 92h ;*
na al, 0fdh ;*
nje 92, al ;*

katika al, 70h ;*
na al, 7fh ;*
nje 70h , al ;*

sti ;*

ret ; kamilisha programu

Unaweza kuhakikisha kuwa programu inafanya kazi kwa kuendesha faili inayoweza kutekelezwa kutoka kwa safi MS-DOS. Ikiwa mpango unatoka kwa usahihi, basi kila kitu ni sawa.

Walakini, shida zifuatazo zinaweza pia kutokea:

1. kompyuta inafungia";

2. kompyuta inaanza upya.

Hii inaweza kutokea kwa sababu zifuatazo:

1. programu inazinduliwa katika hali V86(hali halisi 8086 );

2. programu inazinduliwa katika hali ya ulinzi au chini ya mfumo maalum wa uendeshaji.

Kwa hivyo, kabla ya kuzindua programu yoyote inayoendeshwa katika hali iliyolindwa, unapaswa kuangalia ikiwa programu inaweza kuendelea kufanya kazi. Hili litajadiliwa zaidi.

Kuangalia uwezekano wa kubadili hali iliyolindwa

Katika sura iliyotangulia tulikuwa na shida ifuatayo: programu haitambui kuwa iko katika hali iliyolindwa au hali V86, ambayo inaongoza kwa kufungia mfumo au kuanzisha upya. Ikiwa tunajaribu kuendesha programu chini ya mfumo wa uendeshaji Windows, Hiyo Windows itashika jaribio la programu kubadili hadi hali iliyolindwa na kutoa kuwasha upya katika hali ya kuiga MS-DOS(kwa jukwaa 9x), au kusitisha programu kwa nguvu (jukwaa NT).

Kwa hivyo, ili kuangalia kuwa kweli tuko katika hali halisi, tunapaswa kufanya shughuli zifuatazo:

1. angalia sehemu ya sifuri ya rejista CR0;

2. Hakikisha mfumo wa uendeshaji wa Windows haujapakiwa.

Operesheni ya kwanza inafanywa kwa kusoma moja kwa moja rejista CR0 kwa kuangalia zaidi sehemu ya sifuri ya rejista EAX, AX au AL. Ikiwa kidogo haijawekwa, basi tuko katika hali halisi. Vinginevyo, utekelezaji zaidi wa programu huwa hauna maana.

Hatua ya pili inafanywa kwa kupiga kazi 1600h hukatiza 2fh. Kazi hii inakuwezesha kupata toleo la sasa la mfumo wa uendeshaji Windows. Ikiwa baada ya kupiga kazi kwenye rejista AL ina sifuri, basi mfumo wa uendeshaji haujapakiwa. Vinginevyo, tena, hakuna maana katika programu yetu kuendelea zaidi.

Fikiria mfano wa programu ifuatayo. Ni marekebisho ya programu iliyotangulia; maagizo yote mapya yana alama ya nyota (*).

Shirika 100h

Anza:

; Weka rejista za sehemu

hoja shoka, cs ;*
hoja ds, shoka ;*

; Kuangalia kuwa kweli tuko katika hali halisi

hoja eax, cr0 ;* angalia biti sifuri
mtihani al, 1 ;* sajili CR0
jz hapana_pm ;*

hoja ah, 09h ;* kitendakazi cha DOS 09h
hoja dx, pm_msg ;* pato la mstari
int 21 ;*
ret;* na utoke

no_pm:
; Kuangalia ikiwa programu inaendeshwa chini ya Windows

hoja shoka, 1600h ;* kitendakazi cha kuzidisha cha 1600h
int 2fh ;* inakatiza - pata toleo la Windows
mtihani al, al ;* ikiwa sio 0 - kosa
jz hakuna_madirisha

; Onyesha ujumbe wa hitilafu

hoja ah, 09h ;*
hoja dx, win_msg ;*
int 21 ;*
ret ;*

no_windows:
; Hakika tuko katika hali halisi
; Lemaza ukatizaji unaoweza kujificha

; Zima vikatizo visivyoweza kushikamana (NMI)

katika al, 70h
au al, 80h
nje 70h, na

; Fungua mstari A20

katika saa 92
au al, 2
nje saa 92, na

; Badili hadi hali iliyolindwa

hoja eax, cr0
au al, 1
hoja cr0, kwa

; Sasa tuko katika hali ya ulinzi
; Kitanzi kidogo mara mbili

hoja cx, 20

mzunguko:
hoja shoka, cx
hoja cx,0ffff
kitanzi $
hoja cx, shoka
kitanzi mzunguko

; Badili hadi hali halisi

hoja eax, cr0
na al, 0fe
hoja cr0, kwa

; Funga mstari wa A20

katika al, 92h ;*
na al, 0fdh ;*
nje 92, al ;*

; Washa visumbufu visivyoweza kuficha (NMI)

katika al, 70h ;*
na al, 7fh ;*
nje 70h , al ;*

; Washa ukatizaji unaoweza kuficha

sti ;*

; Tumerudi katika hali halisi

ret ; kamilisha programu

; Ujumbe wa hitilafu

pm_msg: ;*
db "Hitilafu: tayari inaendeshwa katika hali iliyolindwa!$" ;*
win_msg: ;*
db "Hitilafu: Microsoft Windows imegunduliwa!$" ;*
Mfano huu pia hauonyeshi utekelezaji wa amri 32-bit. Ili kufanya hivyo, unapaswa pia kujijulisha na nyenzo katika sura inayofuata. Kwa kuongeza, mfano una drawback ifuatayo: kazi zinaitwa DOS (ndani ya 21h), ambayo tayari huanza kupingana na uhuru wa programu yetu kutoka kwa mfumo wa uendeshaji MS-DOS. Katika siku zijazo, itabidi uondoe kutumia kazi za mfumo wa uendeshaji na ubadilishe kutumia kazi BIOS. Lakini kwa sasa inatosha kujiwekea kikomo kwa kanuni hii.

Kwa sasa ninacheza na x86 Assember ili kuboresha ujuzi wangu wa kupanga programu wa kiwango cha chini. Kwa sasa nina shida ndogo na mpango wa kushughulikia katika hali iliyolindwa ya 32-bit.

Hali ni hii:

Nina programu iliyopakiwa kwa 0x7e0 ambayo hubadilisha CPU kuwa hali iliyolindwa na kuruka hadi alama inayofaa kwenye nambari:

[...] msimbo wa kubadili CPU katika Hali Iliyolindwa [...] jmp ProtectedMode [...] bits 32 ProtectedMode: .halt: hlt jmp .halt

Hadi sasa kila kitu kinafanya kazi vizuri. "Jmp ProtectedMode" hufanya kazi bila kuruka mbali wazi ili kufuta foleni ya kuleta mapema, kwa kuwa programu hii inapakia kwa 0 (org 0 mwanzoni), na kulazimisha sehemu ya msimbo kuelekeza mahali pazuri.

Shida yangu ya sasa ni kwamba katika njia ya mkato ya "ProtectedMode" nataka kwenda kwenye programu nyingine iliyopakiwa kutoka 0x8000 (nilijaribu hii na dampo la kumbukumbu, kazi ya mzigo ilifanya kazi kwa usahihi na programu ilipakiwa kwa usahihi hadi 0x8000).

Kwa kuwa CPU sasa iko katika Modi Protected badala ya RealMode, mpango wa kushughulikia ni tofauti. ProtectedMode hutumia vifafanuzi kutafuta anwani ya msingi na kikomo kwenye jedwali la maelezo ili kuongeza suluhu uliyopewa na kupata anwani halisi (kama ninavyoielewa). Kwa hivyo, GDT ilibidi kusakinishwa kabla ya ProtectedMode kuingizwa.

Yangu inaonekana kama hii:

%ifndef __GDT_INC_INCLUDED__ %define __GDT_INC_INCLUDED__ ;********************************* ;* Jedwali la Global Descriptor (GDT) * ; ********************************* NULL_DESC: dd 0 ; null descriptor dd 0 CODE_DESC: dw 0xFFFF ; kikomo cha chini dw 0; msingi chini db 0; msingi katikati db 10011010b ; fikia db 11001111b; granularity db 0; msingi wa juu DATA_DESC: dw 0xFFFF ; maelezo ya data dw 0; kikomo chini db 0; msingi wa chini db 10010010b ; fikia db 11001111b; granularity db 0; msingi wa juu gdtr: Kikomo dw 24; urefu wa GDT Base dd NULL_DESC ; msingi wa GDT %endif ;__GDT_INC_INCLUDED__

na kupakiwa kwenye rejista ya GDT kupitia

LGdt

Kile bado sijafikiria ni jinsi gani ninaweza kwenda kwa anwani ya kawaida 0x8000 kwenye Njia Iliyolindwa kwa kutumia GDT?

Mawazo yangu ya kwanza yalikuwa kuchagua maelezo ya msimbo (CODE_DESC) ambayo yanapaswa kuelekeza kwa 0x7e00 (programu za sasa zilipakiwa) na kutumia suluhu inayohitajika kupata 0x8000 (512 byte), na kusababisha amri ya kuruka:

Jmp CODE_DESC:0x200

Lakini haifanyi kazi.

Jmp 0x7e0:0x200

pia haifanyi kazi...

Je! unafahamu ninachokosa hapa? Huenda nimekosa jambo muhimu kuhusu mpango wa kushughulikia wa 32-bit ProtectedMode na matumizi ya GDT.

Msimbo kamili:

Bits 16 org 0; iliyopakiwa na kukabiliana na 0000 (phys addr: 0x7e00) jmp Anza Anza: xor shoka, shoka mov shoka, cs mov ds, shoka ; sasisha sehemu ya data cli ; wazi hukatiza lgdt ; pakia GDT kutoka GDTR (tazama gdt_32.inc) piga simu OpenA20Gate ; fungua simu ya lango la A20 WezeshaPMode ; inaruka hadi kwenye Hali Iliyolindwa ;******************** ;* Hufungua Lango la A20 * ;********************* OpenA20Gate: ndani al, 0x93 ; kubadili lango la A20 kupitia bandari ya A20 ya haraka 92 au al, 2; weka A20 Lango biti 1 na al, ~1 ; futa INIT_NOW kidogo nje 0x92, al ret ;************************** ;* Huwasha Hali Inayolindwa * ;******** ****************** WezeshaPMode: mov eax, cr0 au eax, 1 mov cr0, eax jmp ProtectedMode ; hii inafanya kazi (inaruka kuweka lebo na kusimamisha) ;jmp (CODE_DESC-NULL_DESC):ProtectedMode ; => haifanyi kazi ;jmp 08h:ProtectedMode , => haifanyi kazi ;*************** ;* sehemu za data * ;* &pamoja na * ;******** ******* %ni pamoja na "gdt_32.inc" ;****************** ;* Hali Iliyolindwa * ;*********** * ******* bits 32 ProtectedMode: ;hapa nataka kurukia physical addr 0x8000 (programu ya elf64 asm) .halt: hlt jmp .halt

11