2005年1月14日

[轉錄]DDK的學習經驗

Subject: 我的 DDK 學習經驗

Date: Mon, 05 Jan 1998 02:39:44 +0800

From: to.bbs@cis.nctu.edu.tw

To: b3701234@cc.ntu.edu.tw



發信人: WeiPo.bbs@csie.nctu.edu.tw (Weber), 信區: programming

標 題: 我的 DDK 學習經驗

發信站: 交大資工鳳凰城資訊站 (Fri Oct 3 13:02:58 1997)

轉信站: cis_nctu!news.cis.nctu!news.csie.nctu!phoenix

來 源: weberl.asus.com.tw



從 97 年 1 月 我在 Program 版 Post 鼓勵有心網友學習 Window

Device Driver 以來, 陸續收到一些人詢問如何下手. 現在我

已沒時間玩 BBS, 因除了 3D 顯示卡 Driver 要 Tune 外,

還被派去做一些雜 7 雜 8 的事情. 趁教師節比較有空,

寫下這封我學習 DDK 的經驗, 如果那站的站主覺得對網友有

幫助, 就儘管利用, 不用客氣. 但需注明出處, 並嚴禁有任何謀

利舉動(如剽竊修改後, 來賺取稿費), 曾對一些網友提出如何在

MFC 中用 I/O Port Function 的問題, 回答了 6 次, 讓我覺得很

煩煩煩煩煩煩. 希望這種情況不在發生.



本文供分 3 段: (1) 為何我要學 DDK (2) 學習 DDK 的過程 (3)未來

可能的發展.



(1) 為何我要學 DDK

我是資訊科班出身, 就讀過交大計工, 清大資研. 歷經 78,79 股市狂飆, 退伍後,

認為寫程式沒什麼前途, 也無法撐到 38 歲. 但 MBA 卻是越老人脈越多, 收入

也越多, 所以進資策會, 一面工作 一面準備 GMAT, 但沒申請到理想的學校,

而考外貿協會的人才培訓班, 在複試時也被刷下來. 最後認命乖乖學

Window 3.1,



第一年做多媒體資料庫專案, 當時連 VC++ 1.0 都還沒出現. 就用 Borland C++ 3.0

以純 SDK 方式 coding,(因不知道有 OWL 這種東西) 事後想起來真是因禍得福,

讓我更了解 Window 底層的運作 (不過當時真的覺得很幹).



第二年做 Video Editor 是我比較快樂的時光, VC++ 1.0 剛出來, 但市面沒一

本相關書籍, 連 MSDN 也一樣. 怎麼辦? 到處找不到資料. 最後用最笨的方法:

用 Debuger trace MFC source code! 然後搭配 Video for Window 1.1 版 SDK 來

coding, 當時傻傻得, 以為可以做個 Video Editor 跟友立拼, 所以常常加班到 10

點, 但後來 Video Editor 結案後就放到儲藏室, 而 Aldus 被 Adobe 併購, 友立也

把 PhotoStyle 賣給 Adobe. 這件事件讓我得到個教訓: 套裝軟體不好做, 更難與

國際大廠同類型產品競爭.



因有時 Video Editor 會利用 MCI Command 來控制 AVI/FLI 播放, 但覺得很奇怪, 那個

MCI Driver 到底在搞什麼鬼? 在好奇心驅使下, 翻 MSDN 的 MultiMedia Device Driver

來看, 才搞懂 MCI Driver 如何與底層的 Video/Audio Driver 溝通.



第三年是最黑暗的時期, Team Leader 包個 Multimedia Title 來做(還曾打算向敦煌科技

包 Game 來做). 美工, 企劃, 全和在一起, 而要我用 Director 3.0 的 Lingo 語言來寫

Title 的 Program. 我便開始消極抵抗, 同時自己偷偷用 MFC + WinG + 32 Bit Assembly

在 Win 3.1 上寫個類似 Director 3.0 的 Engine. UI 及 繪圖引擎都完成, 而且播放速度

比 Director 3.0 還快. 但卡在不知道如何設計 Script 及 Interpreter. 最後只好做罷.

然而轉捩點就發生在這一年:

應台北電腦工會之邀, 開門 "Windows 影音驅動程式剖析" 課程而與童子賢先生有一面

之緣(當副總的他竟跑來上我這無名小卒的課), 也保留他一張名片. 另外幫別人寫 Motion

Control Card 的 Dos Driver 來用在 CNC 上, 對 Driver 開始發生興趣, 原來寫 Driver 的

利潤頗豐.



第四年, 黑暗的日子終於過去. 參與 IBM VisualAge for Basic 的 Visual Component

開發, 用 VisualAge for C++ 3.0 來 coding, 過了一段無任何相關資料的日子, 還好

從李維那拿到 OpenClass source code, 發揮 tracing 的精神, 終於順利結案. 這年在

某電腦展中遇上任職 IBM 的大學同學, 被他譏笑還在米倉中當米蟲, 讓我心理不

好受. 也使我思考, 只會 coding 的我未來要何去何從, 難道要過著一年換一個專案

的日子嗎? 然後 40 歲時會變成怎樣 ?( PetShop Boy 的 " Being Borning" 在我腦中響起...)



幸好碰上一個影響我很大的同事, 他那時也剛幫人寫完一個 Window 95 的 VxD,

於是向他討教, 並學得如何收集相關資料, 練好後就接個 A/D D/A 卡的 Win31/95

Driver CASE 來做, 寫完 Win95 覺得不過癮, 便拿 NT 4.0 DDK 來看.

另外他有事沒事拿 ASIS 電子周刊給我看, 當時正報導 PC97 的 specification: ACPI,

AGP, OnNow等新技術, 我看完就知道大好機會來了. 憑做 A/D D/A 卡 Window Driver

的經驗, 我知道隨著 Win95 的普及, 這些硬體卡沒有 Win95 Driver 根本很難賣到歐美.

PC97 規定了 Intel 的硬體設計如何跟 Microsoft 的 Window 做結合, 而介面就是

Window Driver! 加上主機板廠養的軟體工程師只會寫 BIOS or 8051, 對 Window Driver

根本是聽都沒聽過, 但 PC97, 98 是必走的道路, 所以一定要找到會的人來做.



而這時候我又要換另一資料庫相關的專案(我最討厭做 MIS, 成天與數據, 報表奮戰,

有夠無聊). 於是上網路找工作, 想到手頭的童子賢名片, 就試投華碩看看. 沒想到

一試便上, (不過在面試時被嫌在資策會待太久, 恐染上不良習性). 進華碩後, 感覺到是

Right Man in Right Place. 終於可以一展抱負, 有明確的目標, 不再虛度時光, 也不會被別人

嘲笑是米蟲. 更重要的是有成就感, 想想做的專案, 是要賣到全世界的產品, 而且是與一

些國際大廠競爭產品上市時間. 再也不是作完往倉庫一擺的東西. 再者華碩目前員工人數

少, 業務擴展迅速, 加上公司高級領導階層非常重視研發實力, 只要有能力的人, 不怕沒昇

遷機會. 不像宏基已有太多員工, 沒什麼表現能力的機會, 且昇遷管道太擠了.



(2) 學習 DDK 的過程

要學 DDK 首先要把 Window 的底層基礎練的扎實. 但一般人對學 Window SDK 都

視為畏途, 更何況是底層的東西. 從 Win31 到 Win95 變化比較多得, 我個人認為是:

Multitasking, Plug&Play, Memory Addressing.

有人問我說, Memphis 都快出來, 還要花功夫看 Win95 or Win31 嗎? 我認為還是要!

原因是:



a. Memphis 不是完全重新改寫, 理面的一些觀念還是沿用 Win95.

b. 目前市面上尚未有大師級的 Memphis 相關書籍, 如果有也只是趁火打劫類型

的書, 而台灣的書商, 作者最會搞這種把戲來 A 錢. 如 Win31/95 方面已有一些

大師的書籍, 如 Andrew Scrullman, Patt Metrick, Richard Jeffery, Walter O'ney,

Charle Patzold 等大師. 你不去看大師級的書, 反而去看 "快快樂樂學 Memphis",

"教你 21 天學會 Memphis" 這類垃圾書, 真是在浪費你的時間及金錢.



學 DDK 的第一步準備功夫是把英文閱讀能力練好, 你別指望書商會出中譯本.

因這類書的賣相太差, 比不上 VB, Delphi, JAVA這類較大眾化的書. 再者要找到夠

格的譯者很難. 要譯好是要花相當時間, 那還到不如去寫些輕鬆的書, 稿費也賺得多.



接下來就要練基礎工夫, 如同張無忌花了 6 年時間練好九陽真經, 等到練乾崑大挪移

時只花數個時辰就 OK. 要如何練底層基礎呢 ? 勤看書, 勤 coding 及 Trace 別人寫得 sample code而已.

即使是 天才型的 Programmer 也是要看書, 因 Window 不是他設計的, 必須了解 Window 才有辦法下手

.. 而非像寫 Algorithm 方面的論文般, 自己定 assumption, Lemma, 導出 Theme, 下 conclusion 就完成.

所以一些剛入社會的研究生最好先調整自己的心態.



以往我是讀一些大師級的書, 如:

"Window Programing" 的 Charle Petzold

"Undocument Window" 系列的 Andrew Scullman,

"Win95 system Programming Secrets" 的 Matt Pietrek,

"Advanced Windows" 的 Jeffery Richter



期刊的話是:

Microsoft System Journal,

Doctor Dobb's Journal,

Window Developer Journal. 這本期刊是我認為學 DDK 的人必要訂閱的!

幾乎過個 1, 2 期就會刊登 Window Device Driver 相關的文章, 而且

理面有位 Paula 女士主持的 NT 專欄, 寫的很深入, 不是市面一些標榜 NT "大剖析"

之類的書籍所能比擬. 在 Andrew Scrullman 的 "Undocument NT" 尚未問世之前,

它是我覺得最有深度的專欄.



接下來就談與 Driver 有直接關係的資料:

Device Driver 的書籍, 我從 Win31 開始說起:

"Writing Windows Device Driver and VxD", Karen Hazzen, 第 1,2 版 是最適合寫

Win31 Driver 的參考書籍. 也有一本白皮的 "Writing Window Device Driver",

我認為它的參考性很低, 因它光抄 Win31 DDK Function Description 就花了 50 ~

60 幾頁, 有 A 錢之嫌.



Win95:

那當然是首推 "System Programing for Win95", Walter Oney 這本鉅作. 我曾因翻

Chapter 11 ~ 13 翻到書頁掉落, 而重新再買一本. Walter Oney 既出, 誰與爭鋒.

有這本就夠了! 也沒有人有膽來挑戰他.



WinNT:

唯一的一本: "The NT Device Driver Book", Art Baker. 很有系統的一步一步介紹

如何寫 NT Kernal mode driver. 先看這本書然後再看 MS 的 NT DDK on Help 會

讓你較容易了解. 當初沒這本書時, 我剛開始看 DDK Help 是看得滿頭霧水.

最好搭配 "Inside Windows NT", Helen Custer 一起看, 因為 NT 底層已經導入

Object Oriented 觀念(WDM 是將 NT Kernel mode driver 加裝 Plug&Play 及 Bus handle

等新功能), 與 Win95 的 Virtual Machine 觀念 相差甚遠. 這本書雖是 1992 年出版,

但有對 NT 的核心運作加以介紹, 也是一本難得的好書.



NewGroup and Web Site:

1. Win95 是 comp.os.ms-windows.programmer.vxd

2. NT 的話是 comp.os.ms-windows.programmer.nt.kernel-mode

3. Window Device Driver Web Site:

http://www.albany.net/~danorton/ddk

http://www.vireo.com



發展工具:

1. 如何要讓你日子好過, 一定要有套 SoftIce for Win95/NT. 千萬不要用

MS 的 WinDebug, 它根本是無山曉路用. SoftIce 可讓你用 source code

level debuging, 對有 assembly 恐懼症的人是一大福音.(但我還是勸有心學

DDK 的人還是要摸 assembly).



2. VToolsD(for Win31/95), DriverWork (for NT/WDM)

Vireo 公司出的 DDK Tool 讓你完全用 C 來寫 Driver, 我只能說寫 Driver 時,

我已經不能沒有它. 由其它還免費附 Class Library source code, 讓我 Trace 的

很高興.



領域知識 (Domain Knowledge)

寫 Driver 需了解你要控制的硬體, 如 Driver 有用到 DMA/Interrupt,

建議你看一下 8259, 8237A 的資料. 在這方面, "微電腦界面技術與實作"

是本不錯的參考書. Programmer 總有一天會 coding 不動的時候. 但人老成精,

只要你的 Domain Knowledge 夠強的話, 還是會有許多公司請你去當技術經理.

而這也是你能剋死年輕力壯 Programmer 最大的本錢. 多多看些其他雜誌,

接觸一些非 Programming 方面的知識來培養你的 Domain Knowledge 吧!



最後最重要的是: 親自動手做做做做做做做做做!

看資料是一回事, 知道是一回事, 做的出來又是另外一回事. 公司請你來不

是要聽你長篇大論, 或是發表多少篇論文. 是要你做個會動, 能商品化的東西.

等你做下去, 踢到鐵板, 又找不到別人問, 也沒有任何資料可幫助. 再加上

硬體沒你寫的 Driver 而無法出貨時, 那種滋味可是人間煉獄. 我就遇上一次,

東西都出到俄羅斯, 德國的經銷商時, 結果發現 Driver 有 Bug, 無法順利安裝. 老大

放話說一星期內沒解決, 俄羅斯經銷商就要取消訂單(天呀! 幾百萬美金的交易), 我在想,

如果到時解不掉就準備辭職. 後來真是狗屎運, 用一個非常另類的做法(騎摩托車在半

路上想到的), 解決這個 Bug, 保住訂單也保住職務.

說這則例子主要是奉勸一些自視甚高的在學研究生, 不要以為頂著高學歷,

就可以在社會上一帆風順(除非窩到學校或財團法人, 政府機構內), 也鼓勵一些沒有傲人

學歷的網友, 只要有實力發揮黑手精神, 照樣可以當主管來管一群碩士工程師.



(3)未來可能的發展

看看 WinTel PC98 的規格, 就知道以後會寫 Driver 的人比較吃香 但目前會用 C, SDK 寫程

式的人不多, 更何況是寫 Driver, 其實 Driver 並不難寫, 只是 Learning curve 很長, 現在大多

初學者怕難沒耐心, 都用 VB, Delphi 這類 RAID Tool 來寫程式, 都快不知道 SDK 是何物.

更不用說 Window 內部的運作. 除非是走 MIS 路線, 否則以後日子會很難過.

就現實面來看: 用 VB, Delphi 的人太多, 老闆要找個人來取代你的職務是很容易得.

就盈餘而論, 國內做 MIS 的公司比不上做 PC 硬體, Chip set 的公司, 而且也沒有股票可分,

何苦去擠到經濟規模小又人數眾多的領域內. (但 Year 2000 對 MIS 工程師可是個大利多,

只不過你還要會一些非常古老的程式語言, 而不是懂 VB, Delphi 就沒事)



就我觀察的結果: 目前主機板的軟體工程師大都只會 BIOS, 8051. 根本都不懂 Windows

Driver. 不要以為寫個 softmenu 的 BIOS 就揚揚得意. 等 PC98 正式上場就有好戲看.

所以在這些公司中有有太多機會來讓你表現自己的能力.



感想:

國內一些電腦作家實在是太好混日子, 可以從 VB 寫到 VC, 然後還可以"深入探討"

3D 加速卡. 流行 VB 就出 VB 的書, 一本號稱 VC++/Borland C++ 聖經的書, 竟然都

沒提到 MFC/OWL. 而 Windows95 一出來, 書攤又是一堆 Win95 聖經寶典之類的中文

書. 等著看吧, 明年 Memphis 出來時又將舊事重演. 不只如此, 還故意標榜有博士學歷或

具有寫作 10 幾年的經驗來烘抬自己的身價. 有時我看了就一肚子火. 不過這些人還不是

照樣繼續 A 錢. 真是......, 而國內一些電腦雜誌的水準, 大家心理有數, 不用我多講. 值得

我佩服的, 大概只有侯俊傑, 不過最近一年他好像都只寫 MFC 相關的文章書籍, 沒寫些

Windows 內部運作的文章, 不知這是否跟上次 Matt Pietrek 來台有關.

總歸一句話: 讀者要自己小心, 少碰一些 "聖經, 寶典".



最後, 祝大家能找到心目中理想的工作.

沒有留言: