?? 10.txt
字號(hào):
X』、『EE OUT DX,AL』 ,或是其它程式碼 ,就可以分
> 辨發(fā)生的原因是讀或?qū)懏a(chǎn)生的 ,d到 I/O 後 ,你是否會(huì)寫騙 I/O 的程式 ?
>
> 以 S-ICE 的攔 I/O 能力為例 ,它先使用 IO-MAP 的方式去攔 I/O ,然後再判別
> "EE.E4.EC.E6...." 等等程式碼。
>
> 注:IOMAP 表是也是 TSS 表格的一部份。
> --------------------------------------------------------------------------
> ┌───────┐
> │相容性的處理一│ 系統(tǒng)暫存器的相容處理法
> └───────┘
>
> 或許您曾經(jīng)在掛入 QEMM386、EMM386 之後 ,在 V86 下執(zhí)行 MOV EAX,CR0 的指
> 令 ,但是前面筆者提到讀寫系統(tǒng)暫存器必需在最高等級(jí)才可執(zhí)行 ,為什麼 User 仍可
> 在最低等級(jí)下執(zhí)行本命令呢 ? 底下是欺騙方式。
>
>
> (User) V86 下執(zhí)行 MOV EAX,CR0
> ↓
> 發(fā)生 General Protection 0D
> CPU 自動(dòng)切入保護(hù)模式 ,并執(zhí)行 INT_0D 的處理程式
> (堆疊里多儲(chǔ)存了錯(cuò)誤代碼 DWORD)
> ↓
> (EMM) 檢查發(fā)生錯(cuò)誤的原因
> 讀取 EAX,CR0 (因此時(shí)已是最高等級(jí) ,本行可以正確執(zhí)行)
> ↓
> (EMM) 修改堆疊內(nèi)的 EIP 值 ,指向下一行指令
> ↓
> (EMM) 修改使用者等級(jí) 3 / 設(shè)定 VM 旗標(biāo)等於 1
> ↓
> (EMM) ESP 值扣掉錯(cuò)誤代碼 4byte
> ↓
> (EMM) IRETD 切回 V86
> ↓
> (User) 使用者取得 EAX 的數(shù)值
>
> 由於程式有一大半在保護(hù)模式下執(zhí)行 ,所以使用者根本感覺不到 ,只知道自己真
> 的讀到系統(tǒng)暫存器。這便是 EMM 系的欺騙手段。
>
> 本來標(biāo)準(zhǔn)的程式是不會(huì)在 V86 下讀寫系統(tǒng)暫存器 ,可是確實(shí)也有不正常的程式
> O這樣搞的 ,例如倚天中文會(huì)執(zhí)行 MOV EAX,CR3 ,或是一些保護(hù)程式會(huì)寫入除錯(cuò)暫存
> 器 (DRx)。所以為了相容性 ,這些最好做進(jìn)去。
>
> 注:判別發(fā)生的原因也可以利用判斷 I/O 的那種方法 ,但寫起來很麻煩。
> --------------------------------------------------------------------------
> ┌───────┐
> │相容性的處理二│ HIMEM.SYS
> └───────┘
> HIMEM.SYS 是一個(gè)可以控制 1MB 以外記憶體的程式 ,不過之前筆者有提過 ,要
> 讀寫超過 1MB 以外的記憶體必需進(jìn)入保護(hù)模式才行(據(jù)說有後門可用) ,那麼載入自
> 己的保護(hù)模式程式後 ,再遇到呼叫 HIMEM.SYS 去搬移 1MB 以外的記憶體 ,電腦竟然
> 會(huì)發(fā)生 GP Err #0D ,原來這是因?yàn)?HIMEM.SYS 在執(zhí)行搬移記憶體的命令後會(huì)去呼叫
> BIOS 的 AH=87h INT_15h 去搬記憶體 ,換句話說就是因?yàn)檫@個(gè) BIOS 中斷會(huì)進(jìn)入保
> 護(hù)模式去搬記憶體 ,所以才會(huì)造成當(dāng)機(jī) ,因此你的保護(hù)模式介面程式必需去模擬這個(gè)
> BIOS 函式 ,就可以與 HIMEM.SYS 相容了。
>
> 注:BIOS AH=87h INT_15h 會(huì)重設(shè) GDT.IDT 表 ,然後進(jìn)入保護(hù)模式去搬記憶體 ,然後
> 就當(dāng)在 LIDT 或 LGDT 的命令上。
>
> 另外如果你的程式擺在 1MB 以上的記 擐 }去執(zhí)行 ,還會(huì)有另一個(gè)問題產(chǎn)生 ,
> 不過如果你已經(jīng)學(xué)會(huì)上面的這些功能 ,再嘗試去寫個(gè)程式去試試 ,你自然會(huì)知道
> 它會(huì)發(fā)生什麼問題 ,解決的辦法也很簡(jiǎn)單 ,你一定會(huì)解決。
> --------------------------------------------------------------------------
> 切入 V86 後 ,還有很多問題要處理 ,不過上面提到的兩個(gè)問題如果你都能處理
> 的話 ,基本上就不會(huì)有其它大問題 ,等你會(huì)進(jìn)入保護(hù)模式後 ,再來學(xué)習(xí) VCPI、DPMI
> 就很簡(jiǎn)單了。
>
> 如果各位會(huì)切入保護(hù)模式的話 ,接下來應(yīng)該是學(xué)習(xí) VCPI 的切入方式 ,雖然有很
> 多 y有介紹 ,但是要真正了解并不容易。建議各位去買套大宇出品的激斗戰(zhàn)士、戰(zhàn)
> 國策 ,它的外加保護(hù)就是切入保護(hù)模式的最佳范例 ,包含透過 VCPI、自己切286.386
> 保護(hù)模式 ,雖然這是不道德的行為 ,但是卻是一個(gè)最佳范本。花個(gè)五百塊學(xué)新知絕對(duì)
> 劃算。
>
> 有關(guān)保護(hù)模式的部份筆者暫時(shí)介紹到此 ,下一集筆者將為您介紹虛擬記憶體 ,如
> 果情況允許 ,還會(huì)順便介紹更難懂的分頁機(jī)能。教各位如何寫出類似 S-ICE 的 BPR
> 功能 ,鎖定某一塊記憶體的讀寫狀態(tài)。
>
>
> ┌───────────────────────────────────┐
> │ Soft Bugger 軟體蛀蟲 90:90/2 軟體新技術(shù)的實(shí)行者 │
> │ BBS:02-5955461 24HR ID:Werong Ho -- 軟蛀 -- │
> └───────────────────────────────────┘
>
> ┌┐┌┐∞
> 【 80386 保護(hù)模式簡(jiǎn)介五 】 ┘└┘└┘
> ==========================================================================
> 前言∶
> 底下是進(jìn)入保護(hù)模式、進(jìn)入 V86 的精簡(jiǎn)范例 ,執(zhí)行前請(qǐng)確定 CPU 是處在真實(shí)模
> 式 ,程式碼因?yàn)橛玫?386 指令 ,請(qǐng)用 TASM 3.1 來編譯。
> --------------------------------------------------------------------------
> ┌──────┐
> │進(jìn)入保護(hù)模式│
> └──────┘
>
> 進(jìn)入保護(hù)模式的程式范例 ,其目地是進(jìn)入保護(hù)模式 ,并在保護(hù)模式下用絕對(duì)記憶
> 體讀寫的方式 ,直接將 'Protection Mode !' 字串寫入 Video Ram (B800:0000) ,
> 本程式以最精簡(jiǎn)的方式撰寫 ,沒有任何錯(cuò)誤處理 ,因此請(qǐng)確定電腦現(xiàn)在處在真實(shí)模式
> 下才可執(zhí)行本程式。(禁掛 EMM 系保護(hù)模式軟體)
>
> 程式流程如下∶(底下所指記憶體位址皆為 32bit 絕對(duì)位址)
>
> 1. 設(shè)定 GDTtab 表所在的記憶體位址填入 GDTadds
>
> 2. 設(shè)定 Selector 0008 的記憶體起始位址就是現(xiàn)在 CS 的記憶體位址
> 設(shè)定 Selector 0010 的記憶體起始位址就是現(xiàn)在 CS 的記憶體位址
> Selector 0018 的記憶體起始位址就是 000B8000 = (B800:0000)
>
> 3. 執(zhí)行 LGDT FWORD PTR CS:GDTadds 告訴 CPU 一但進(jìn)入保護(hù)模式 ,各
> 區(qū)段的記憶體起始位址、長(zhǎng)度
>
> 4. 設(shè)定 CR0 的 Bit0 = '1' ,并透過 JMP 指令進(jìn)入保護(hù)模式
> ※ 進(jìn)入保護(hù)模式後 ,DS.ES.SS.CS.GS.FS 等等暫存器定址方式不再
> 是 Segment ,而變成 Selector
>
> 5. 秀字 將 0010:MSG_1 搬到 0018:0000
> 意即將 'Protection Mode !' 字串搬到 Video Ram 去
>
> 6. 設(shè)定 CR0 的 Bit0 = '0' ,并透過 JMP 指令回到真實(shí)模式
> ※ 回到真實(shí)模式後 ,DS.ES.SS.CS.GS.FS 等等暫存器定址方式不再
> 是 Selector ,而變成 Segment
>
> 5. 秀字 將 CS:MSG_2 搬到 B800:00A0
> 意即將 'Return Real Mode !' 字串搬到 Video Ram 去
>
> 6. 結(jié)束程式
>
> ----------------------------- P.ASM ------------------------------------
> code segment
> assume cs:code,ds:code
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -