absmiddle Windows 95 強固性探究之一


[解說] [版主] 本文經清大電機 mswindows 版主 plumelet 同意後轉貼 Matata.bbs@mic.ee.ntu (帥哥庸): EightCloud.bbs@firebird (EightCloud) 補充 譯: Somebody (You guess :-) Windows 95 "private address spaces" provide less If you think GP faults are bad, imagine what Windows would be like without them. As probably every Windows user knows all too well, a general protection (GP) fault is what you get when a buggy Windows application commits an error. The OS' protected mode detects that the application has tried to do something it shouldn't and shuts down the application. This setup is certainly annoying but far better than an overall system crash or data corruption. Windows 95 "私密位址空間" 提供較少? 私密位址空間: 每個 process (通常一個程式對應一個process) 有一些自己的位址空間, 例如 0x00000000 - 0x7fffffff, 在這個些位址寫入或讀取的資料, 和其它 process 是無關的. 在 Win3.1 中, 是所有 AP 共用一個位址空間, 所以常常一個寫不好的程式, 會把資 料寫的其它地方, 破壞到其它程式或是系統的執行. 假如你認為 GP faults 是不好的, 想像一下如果沒有他們, Windows 將變得如何。 或許每個 Windows user 都知道得太清楚了, 一個 GPF 發生在一個有問題的 Windows 應用程式造成錯誤時。OS 的保護模式偵測到這應用程式試著做一些它不該做的事, 並 將這應用程式關掉。這種作法當然惱人, 但至少比讓整個系統當掉或資料毀損好多了。 In Windows 95, Microsoft Corp. has modified the memory model of Windows, providing each DOS and Win32 application its own "private address space." In theory, this should better protect the system and increase the reliability (or in Microsoft terms, robustness) of the OS. 在 Windows 95 裡, M$ 已經把 Windows 記憶體模式改過, 讓每個 DOS box 和 Win32 應用程式擁有自己的位址空間。理論上, 這應該提供更好的系統保護與作業系統的穩定 性。(在 M$ & Borland 的話裡, 是用 "robustness" 表示穩定性的 :-) Unfortunately, despite Microsoft's claims, memory errors in DOS and Win32 applications can easily crash Windows 95 or corrupt data because its private address spaces are only partially private. 不幸的, 儘管M$ 如此宣稱, DOS & Win32 程式的記憶體錯誤仍能輕易讓 Windows 95 當掉或毀壞資料, 因為它們的自用位址空間只有一部份是他們自己才存取得到的。 (譯按: 儘管 Windows 3.x 下各 DOS box 位址空間也是獨立的, 透過 DPMI 仍然有辦 法讓保護模式的程式去存取其他應用程式的空間; 其實在 OS/2 下, 這也是成立的。繼 續看下去再發表您的評語。 :-) Although it is more difficult for an uncooperative Windows application to hang the system now, memory protection in Windows 95 is still feeble. As a result, memory protection alone is not a good reason to upgrade to Windows 95. If you weren't happy with memory management in Windows 3.1, Win 95 probably won't ease your concerns. 雖然一個不合作的 Windows 程式更難當掉整個系統了, Windows 95 的記憶體保護仍然 弱不禁風。結果, 單單記憶體保護並不是個升級到 Windows 95 的好理由。如果你不喜 歡 Windows 3.1 的記憶體管理, Windows 95 或許不會減輕你的擔憂。 我以前一直強調過, 要維持以往的相容性, 和系統的穩定性, 這是魚與熊掌的事. Win3.1/dos(dpmi) 本來就用可以存取到所有的位址空間, 又要維持相容, 又要完整的 記憶體保護, 如何做到? IBM 的 OS/2 採取了較少的相容性, 提高了較多的保護, M$ 以 Win95 提供最完整的 相容, 以 NT 提高了完整的保護, 這都是策略性的問題. 並不是系統爛不爛的問題. Protected Mode. The GP fault is actually just an interrupt (INT 0Dh) sent by an Intel Corp. microprocessor to a protected-mode OS such as Windows, indicating that the currently executing code instruction has violated the protected-mode "rules of the road." The OS generally responds by shutting down the misbehaving program. 保護模式。GPF 實際上只是個由 CPU 送出給保護模式O S, 如 Windows 的中斷 (int 0dh)(*), 表示目前正執行中的程式指令違反了保護模式的準則。通常 OS 以關掉 出槌的程式當成回應。 (*) 譯按: 也許這作者是為了讓沒什麼保護模式概念的讀者較容易了解 what's GPF, 不過在如 Windows 的 DPMI 環境下, int 0dh 和 GPF 的 exception 0dh 是兩回事, 分別有不同的處理程式與設定/取得處理程式的辦法。 像新出來的 Delphi, 本身就具有攔截 GPF 的能力, 不會讓寫出來的程式因為一個指標 存取錯誤就被 Windows 關掉, 還能讓程式本身處理 GPF. 呃, 順便幫 Delphi 廣告 :) NT 也可以將 exception 攔下來, 透過 Win32 API, 交由一般 AP 去處理 (不知道 95 有沒有). 幫 NT 打個廣告 :) NT 堛 virtual memory API + exception 的處理, 可以讓一個 AP 去存取一個非法 的 address, 產生 exception, AP 攔下來後, load 適當的資料, 再交由正常指令順序 run 下去. How does the processor decide that an instruction violates the rules? In most cases, the OS tells the microprocessor via "descriptor tables" (the Global Descriptor Table [GDT] and the Local Descriptor Table [LDT]) what the rules are. For example, one rule might be that selector 003F is code and that its size is 1,000 bytes. If an app tried to write to this code (code is read-only) or tried to execute from beyond the segment (such as at address 1001), the processor would generate a GP fault. The set of code that Windows lets a program read, write, or execute is called the program's "address space." 那 CPU 如何決定一個指令違反規則? 在多數情形下, OS 透過描述表 (GDT/LDT 整體描 述表和區域描述表)告訴 CPU 規則。例如一個規則可以說, selector 003F 是個程式段 , 長度是 1000 bytes. 如果一個應用程式試著寫入資料到這程式段(程式段是唯讀的) 或試著從超過這一程式 段的長度處執行程式, CPU 會產生 GPF. 這組Windows 讓程式讀寫或執行的碼, 稱為這程式的位址空間。 (譯按: 這裡有些須要澄清的, 這些都是 80x86 CPU 保護模式下定義的東西, 不是由 Windows 提供的。Windows 在定義位址空間時唯一要做的, 是設定段的屬性與長度。 但是, 注意, 位址空間並不一定是唯一對映給單一程式的。) Could Windows set up a memory map in such a way that programs could go anywhere and do anything they wanted, without causing a GP fault? Yes, it could. Windows 能設定一個記憶體對映關係, 以讓程式能讀寫、執行任何地方的資料或程式, 做任何它們想做的事, 而不引起 GPF 嗎? 是的, 它能。 (譯按: 確實能。但是, 相信我, 普通程式不會去做這些事。市面上 100% 的 Windows 程式開發工具都不直接支援這些事, 想這樣玩的程式必須自己去動關於設定 selector 及記憶體對映的 Windows API/DPMI function. 除了讀取 DOS memory 及存取 DOS/BIOS data & video memory, 我看不出一個 Windows 程式有什麼需要去動這些功 能。繼續看下去。坦白講, 我認為這是篇吹毛求疵的文章。因為 OS/2 也支援DPMI, 這些在 Windows 下可以透過 DPMI 辦到的事, 若是有意, 在 OS/2 下也辦得到。 讓我告訴你如何辦到: 1.使用DPMI function map 一塊實體記憶位址, say 0x00100000, size = 1 MB OS2/Windows 沒理由不讓你這樣玩, 如果它們確實提供 DPMI function. 2.配置個 selector, 把它的基底位址設定到 map function 取得的線性位址, 然後設定 segment limit 為 n MB, 隨你高興。 3.開始寫入垃圾。 Over.沒有任何市面上的程式會這樣玩。) Would the absence of GP faults make this a stable OS? Obviously not: Instead of shutting down programs that stuck their fingers where they didn't belong, Windows would be giving programs the freedom to corrupt Windows itself and crash the system. That would be far worse than a GP fault. 沒發生 GPF, 就能讓 Windows 變成一個穩定的 OS 嗎? 顯然不: 代替「關掉出錯的程式」而來的, 是 Windows 讓程式能自由毀壞 Windows 並當掉整個系統。那將遠比 GPF 更糟。
上一層目錄