-------------------------------------------------------------------------------- -------------------------------------------------------------------------
NCTU-CIS BBS `programming' 版 精華區
■■■ DOS extender﹑DPMI ■■■
-------------------------------------------- 整理:william@cis_nctu -----
-------------------------------------------------------------------------
Posted By: william (C++/ASM/Win Master) on board 'programming'
Date: Thu Jul 29 12:48:39 1993
Title: 請問何為 DOS Extender ?
> 請問何為 DOS Extender ?
> 近來在一些雜誌都有看見這個名詞,但是卻不知為何。
平時的 MS-DOS 是在 Intel 8086 family 的 real mode 底下, 因此受到 640KB 限制。
而 UNIX、OS/2、Windows 是在 Intel i286 family 的 protected mode, 甚至在 i386
的 Virtual 8086 mode 底下, 可提供超過 640KB, 甚至虛擬記憶體能力。
但是 protected mode 的機械碼和 real mode 的不盡相同, 尤其是定址模式, 所以
過去架構在 MS DOS 的程式無法在 protected mode 下執行。
為了讓舊的 real mode 程式能花最少的代價移植到 protected mode 上, 以享受它
的好處, 就有些聰明絕頂又功力高強的人, 在兩者間架上一層界面 (即是 DOS
extender) , 讓舊的應用程式 (real mode) 用到的所有系統呼叫 (BIOS、DOS 21h...)
都改成由 DOS extender (protected mode real mode) 接管。於是用了 DOS
extender 的程式, 相當於是一個雙重模式的程式: 平時在 protected mode 中執行,
一旦遇到需要 real mode 的服務時 (如目前一般的 disk I/O、screen I/O 的 BIOS
routine 還是用 real mode 寫成的, 除非是 PS/2 的 ABIOS 才是 real mode 及
protected mode 共用的) , 就由 DOS extender 自行切換回 real mode。
詳細內容一言難盡, 請參考 "Extending DOS, 2nd edition", 或是侯俊傑先生在旗標
出版的一系列書籍。
==============================================================================
發信人: Hentai@cis_nctu (), 信區: programming
標 題: Re: Protected Mode 高手的學弟.....高手請幫忙
發信站: 交大資科_BBS (Aug 22 20:43:21 1994)
轉信站: cis_nctu
==>: pcjames.bbs@bbs.ee.nthu. (Danny) on board 'programming'
> 看過幾篇你們的文章我請問一下你們是直接進入保護模式嗎?
我的是直接切入保護模式後開一個 V86 模式後 RUN 的...
> 可是要完全靠自己的力量不是很容易 先前的準備工作一大堆 何況我不了解
> TSS, IDT, 這樣我就更沒希望靠自己切入 Protected Mode
> 我手邊有本 80386 SYSTEM SOFTWARE WRITER'S GUIDE, 可是它重觀念
> 而範例實在簡陋
這個都不知道就有一點困難了...
雖然 System Software Writer's Guide 那本確實有一點太簡略,但是裡面的東西
都很重要,剛開始寫的時候我就常常會去翻翻看!
對了,可以再參考一下 80x86 Programmer's Refrence manual. 裡面的東西在系統
程式方面雖然沒有像 Sytem Software 那本詳細,但是對於剛開始要入門的人來說,
有不少東西比較詳細一點!
> 實在希望前輩能給小弟一些建議及寫過的程式 先說聲謝謝
NCTUCCCA:/PC/demos/programming/source/dos32v24.zip
這是一個 Protected Mode 的程式,他先檢查是不是有 DPMI server, 有的話用
DPMI 入 PM,沒有的話自己進入...
> 如還能教我 TSS, IDT 那更是感激不盡
IDT 類似在 real mode 下的 0:0 開始的中斷向量表,
在 protected mode 下有 interrupt, exception 就找這個表!
TSS 一些 Task 的基本資料,基本上如果程式不牽涉到多工或者是等級不會改變,
這個可以省略...
-------------------------------------------------------------------------------- NCTU's Hentai
=============================================================================
發信人: BigLin.bbs@csie.nctu (大雄), 信區: programming
標 題: 保護模式小問
發信站: 交大資工鳳凰城資訊站 (Tue Oct 25 03:09:22 1994)
你可以用 C 的 函數指標把取到的指標變成 Func ...
以後 Call XMS 時就 Call Func....
你想看 Protected MODE 書我知道有兩本:l:
1. 80386 技術手冊(全華)
2. 80386 微處機手冊(東華) (在圖書館看到的
: Hentai@cis_nctu () on board 'programming'
> 覺得 dos extender 奇妙嗎??
> 可以抓 dos32v 來玩玩!!這是一個簡單的 dos extender
> 又有附 source ,可以讓你多瞭解 386 CPU protected mode 特性!!
> 我寒假時就從這東西學了不少!!
哈! 我也看過 Dos32V12, 以及 pmode386、protect 等 source code,
而且我也自己寫了一個 Dos Extender ( 雖然只能從 real mode 下進入保
護模式 ), 但我覺得這些 Dos Extender 都沒有 DOS/4GW 神, 你知道為什
麼嗎? 因為進入保護模式一定要重置 8259, 將 INT 0 至 INT 31 空出來給
CPU 發生保護異常時使用, 那麼原來的中斷常式便要被迫轉到其它中斷向量
使用, 看一般 Dos Extender 都將 IRQ 0-7 從原來的 INT 8h-fh 改成 INT
32-39; 但我試過在 DOS/4GW 保護模式下直接用組語寫 "int 10h" 竟然也
能照 call 無誤去執行 graphic card BIOS 的常式, 但這中斷不是給 CPU
發生異常用的中斷向量之一嗎? 怎麼還能像在 real mode 下一樣? 故這才是
令我感到神的地方。
===============================================================================
發信人: alexfish.bbs@bbs.nchu (Alex Yu), 信區: programming
發信站: 中興大學天樞資訊網 (Sat May 7 14:38:05 1994)
> 故這才是令我感到神的地方。
不是 DOS4GW 神, 可以讓中斷重疊; 這本來就是 DPMI server 該作到的事。
方法不太難, 只要將 IDT size 設小一點, 足夠含蓋住所有 CPU exceptions 就好。
然後只要有 int 發生或有程式通過 int 指令去呼叫 exception,
就一定會造成 exception, 使得 RING 0 的system 可以完全掌控 interrupt dispatch.
DPMI specification 中也明載著, DPMI server/host 有義務將保護模式下的中斷在
沒有 protected mode ISR 處理時對映回實際模式, 讓實際模式的 ISR 去處理。所以
QDPMI 是個不完全的 DPMI server implementation.
除了 DOS4GW 外, Borland 的 RTM 也有類似能力, 也會將硬體中斷對映進保護模式,
讓保護模式的 ISR 先處理硬體中斷。
另外, Windows 下所有中斷在處理前必先經過 virtual programmable interrupt
controller device, protected mode isr, 然後才論得到dos box 中的real mode ISR.
根據M$ 的文件, Windows 下硬體中斷的real mode isr 處理效率只有Windows 外的 7%.
處理效率的排行分別是:
1. Windows 外的 real mode ISRs
2. Windows VxDs
3. Windows bi-modal ISRs (可被 ring 0 呼叫的 ISR)
4. Windows or protected mode ISRs
5. ISRs in DOS box
===============================================================================
發信人: cmp@cis_nctu (), 信區: programming
發信站: 交大資科_BBS (May 9 19:08:10 1994)
==>: alexfish.bbs@bbs.nchu (Alex Yu) on board 'programming'
> 不是DOS4GW 神, 可以讓中斷重疊; 這本來就是 DPMI server 該作到的事。
> 方法不太難, 只要將 IDT size 設小一點, 足夠含蓋住所有 CPU exceptions 就好。
> 然後只要有 int 發生或有程式通過 int 指令去呼叫 exception,
> 就一定會造成 exception, 使得 RING 0 的system 可以完全掌控interrupt dispatch.
造成了異常後又該如何做呢? 這個異常處理常式又如何知道 int 的號碼呢?
我看其他的 Dos Extender 在處理呼叫原 real mode 的中斷時, 是專門設一個
中斷常式處理的, 如 AH= real-mode int number, 再呼叫此中斷常式, 然後這
常式便切入 V86 模式去 run 原 real-mode 中斷....。 而且你說將 IDT size
縮小, 但最小也不能小於 32*8 Bytes 吧! ( 即 int 0-31 ) 而我是在保護模式
下做 int 16 的動作喔! 我想不可能由 CPU 異常處理常式掌控吧! (因為 int
16 是 Math Error exception!)
===============================================================================
發信人: alexfish.bbs@bbs.nchu (Alex Yu), 信區: programming
發信站: 中興大學天樞資訊網 (Tue May 10 10:10:40 1994)
> 造成了異常後又該如何做呢? 這個異常處理常式又如何知道 int 的號碼呢?
Exception error code 會指示。
在 Windows 或 OS/2 下 sidt 看 IDTR, 就可以知道 IDT 有多小了。
> 我看其他的 Dos Extender 在處理呼叫原 real mode 的中斷時, 是專門設一個
> 中斷常式處理的, 如 AH= real-mode int number, 再呼叫此中斷常式, 然後這
> 常式便切入 V86 模式去 run 原 real-mode 中斷....。 而且你說將 IDT size
> 縮小, 但最小也不能小於 32*8 Bytes 吧! ( 即 int 0-31 ) 而我是在保護模式
> 下做 int 16 的動作喔! 我想不可能由 CPU 異常處理常式掌控吧! (因為 int
> 16 是 Math Error exception! )
當然可以, 因為特權階級不同, RING 3 的程式不可能直接叫得到 RING 0 的
interrupts 和 exceptions.
===============================================================================
發信人: alexfish.bbs@bbs.nchu (Alex Yu), 信區: programming
發信站: 中興大學天樞資訊網 (Wed May 11 04:49:06 1994)
□ 引用發信人: cmp.bbs@bbs.cis.nctu () 的文章 □
>> 當然可以, 因為特權階級不同, RING 3 的程式不可能直接叫得到 RING 0 的
>> interrupt 和 exceptions.
> 抱歉, 我沒說明清楚, 我是想直接在 RING 0 做類似 DOS/4GW 的任意給人
> 呼叫原 real-mode interrupt 的功能。( 不要跟我講說使用 DPMI )
我還是要說, DPMI 有這種功能, 方法也很簡單:
將每個保護模式的interrupt vector 都設定 (DPMI specification 規定DPMI server
要提供全部256 個interrupt 給DPMI client 使用, 不遵守的就是不相容於DPMI
specification) 到自己的handler, 而此handler 只有一個int 3.
