2010年2月26日 星期五

淺談網路-Part 2:網路定址模式

淺談網路-Part 2:網路定址模式

作者:常世勳

PS: 此篇只討論IPV4之定址模式...IPV6留待之後再討論.

寄信時, 信封上要附收件人的住址;打電話時, 要撥對方的號碼。想在網路上通訊, 也總得先知道對方在 cyberspace 當中位於何處, 網路系統才能把你的訊息傳遞到對 方手上。
網路世界裡, 有著不同層次的位址。「OSI 參考模型」最底層的 「實體層」與「鏈結層」來說, 每片乙太網路卡在出廠時, 都燒錄著獨一無二的「硬 體位址」(又稱「MAC 位址」) , 這個位址就像身份證號碼一樣, 用來在網路世界裡 獨一無二的識別各個乙太網路終端設備。
因此, 在乙太網路的訊框裡, 就有兩個 48 位元的欄位, 分別記錄發送端及接收端的硬體位址。同樣的, 記號環網路卡也有屬於 它自己的硬體位址, 佔 16 或 48 位元。
再往上看看「網路層」吧。每個以 IP 為網路層通訊協定的通訊界面, 都有一個 「Internet 位址」(又稱「IP 位址」) , 供對等通訊端(peer) 彼此識別之用。
因 此, 在現行版本的 IP 封包表頭裡頭, 也有兩個 32 位元的欄位, 分別記錄發送端及 接收端的 IP 位址(在下一代 IP 協定: IPv6 當中, 則分別為 48 位元) 。
再往上 看, 「傳輸層」的 TCP 和 UDP 資料當中的通訊埠號碼, 也具有類似的作用。
註: 一台主機可能擁有不只一個 IP 位址。所以文中我不用「主機」一詞, 而用「通訊界面」。
在 Internet 世界裡, 我們接觸的都是 TCP/IP, 所以, 我將針對 IP 以上的定址問題 做進一步的探討。 IP 位址 現行版本的 IP 位址共占 32 位元。以微觀的角度來看, IP 封包裡頭真正存放的資 料, 當然都是二進位的型式;不過在口語上和書面上, 為了便於溝通, 通常都以十進 位來表示, 每隔 8 位元再以英文的句點做為間隔。
譬如說, 台灣網路資訊中心的 WWW 伺服主機的 IP 位址為 10001100011011110000000100000010, 我們常唸成、 寫成 140.111.1.2。
你看, 這樣是不是方便多了? 幅員廣大的國家, 為了便於管理, 通常都會畫分行政區, 再予以分界、分層負責。
除 了行政因素外, 單就通訊而言, 畫分行政區還有一個好處: 有效地傳遞訊息。
譬如 說, 位於台北市城中區的郵局, 看到一封由住在台北市重慶南路一段的人寄往台北市 重慶南路二段的信, 就不必把這封信轉交給城中區以外的郵局去, 它自己就能處理; 假使這封信的收件人是住在新竹市大學路, 郵局才需要把它運送到新竹市的郵局去。
我們可以看到, 行政區的觀念, 讓郵件傳遞更加有效率。 網路系統也是一樣。 現行的 IP 位址空間共有 232 個位址, 面對這麼大的空間, 分配管理是一大麻煩。
此外, IP 是屬於 OSI 參考模型當中的網路層, 必須處理路徑選擇問題;位址分配得 宜, 會減輕許多路徑演算法的負擔, 網路系統的效能也會增加。
IP 位址可分成兩部份, 第一部份(netid) 代表該通訊界面所隸屬的網路編號, 第二 部份(hostid) 代表該通訊界面本身。我們再根據網路規模的不同, 把這兩部份所佔 的比例區分成五個等級。 理論上A級的範圍是從 0.0.0.0 到 127.255.255.255, 主要是分配給「自己人」的 單位, 也就是早期對測試發展 TCP/IP 有功的單位。
因為這一級的 netid 部份只有 7 個位元, 只夠分配給 27 = 128 個單位, 所以格外珍貴, 現在已經很難申請得到。 像麻省理工學院的 WWW 主機 web.mit.edu, 它的 IP 位址是 18.69.0.27, 很明顯 的, 是屬於A級的。
理論上B級的範圍是從 128.0.0.0 到 191.255.255.255, 因為這一級的 hostid 最 多可容納 216 = 65536 個位址, 很適合大型單位使用。像交大資科 BBS 的 140.113.23.3, 就是隸屬於交大所分配到的B級網路之中。
理論上C級的範圍是從 192.0.0.0 到 223.255.255.255, 因為 hostid 最多只夠 28 = 256 個位址, 所以小型單位及撥接用戶, 多半 都是申請C級的。
理論上D級的範圍是從 224.0.0.0 到 239.255.255.255, 用來做群播(multicast) 之用。至於E級, 目前仍屬實驗階段。 為什麼我要說是「理論上」呢? 因為有些 IP 位址另有特殊用途。譬如說, A級範圍 內, 127.*.*.* 是用來做 loopback 的(習慣上, 大部份系統都指定 127.0.0.1 為 loopback 位址) , 所以實際上能用的A級位址就減少了。
其他常見的特殊位址還 有: 255.255.255.255 是做有限廣播(limited broadcast) 的, 若 hostid 的位元 全設為 1, 則只在該子網中做廣播。
IP 是網路層的協定, IP 位址是供同屬網路層的對等通訊端來彼此識別的。
所以, 當 應用軟體要向 140.111.1.2 主機索取資料時, IP 層的系統軟體會自動把本機的 IP 位址及對方的 IP 位址(140.111.1.2) 填到 IP 封包(packet) 中, 再往下交給鏈 結層系統及實體層系統遞送出去。
當鏈結層收到上層遞交過來的 IP 封包, 就得把它組織成合法的鏈結層訊框(frame ) , 才遞交給實體層傳輸出去。就拿乙太網路為例, 它的訊框裡, 有兩個 48 位元的欄位, 分別記錄發送端及接收端的硬體位址;所以, 要組成完整的訊框, 得先填好這兩個欄位。
問題是: 該填什麼? 我們自己(發送端) 當然知道自己的硬體 位址, 但我們要如何得知對方(接收端) 的呢?
關於對方, 我們只知道 IP 位址, 其 餘則是一無所知呀! 為了解決這問題, TCP/IP 提供一個位址解析協定 ARP(Address Resolution Protocol) , 負責把給定的 IP 位址轉換成相對應的硬體位址 , 這樣一來, 就能得知對方的硬體位址, 鏈結層訊框所需要的資訊就能順利滿足。
註: 事實上, 因為 TCP/IP 的網路層仍位於 OSI 參考模型的網路層, 也就是子網路 (subnet) 範圍之內, 所以一般主機(假設它叫做A) 無法用 ARP 來取得子網路 樊籬之外的主機(假設它叫做B) 的硬體位址。
當A要與B通訊時, 雖然A送出 的 IP 封包內的「接收端 IP 位址」一欄仍然是B的 IP 位址, 但 TCP/IP 系統會 根據 IP 分級架構與 netmask 的資訊, 看出這個封包應該要先送給本地的路由器 (路由器會負責尋找最適路徑並傳遞出去) 。
所以A的 TCP/IP 系統會自動把該訊 框的「接收端硬體位址」填成路由器的硬體位址。
關於 IP 位址, 我要再強調一次, 像「140.111.1.2」這樣的表示法, 只是便於人類 讀寫之用。
真正在幕後做事的 IP 協定是不認得這種表示法的;它只認得二進位的型 式。
而且, IP 協定並不是像「140.111.1.2」這樣以 8 位元的間隔來看待 IP 位址 的;它是以ABCDE五個等級, 以及 netmask 的設定來分隔 IP 位址的。

淺談網路-Part 1:TCP/IP

淺談網路-Part 1:TCP/IP

作者:常世勳

1.TCP/IP簡介 :
TCP/IP實際上是由一組通訊協定所組成的協定名稱。
在這些協定當中, 有兩個協定是其他大部份協定的基礎, 這兩個協定分別是:
●傳輸控制協定(Transmission Control Protocol, 簡稱TCP): 一個可靠的串流式服務協定, 也就是TCP可確保所有送至 某個系統的資料能正確無誤地到達該系統。
●網際網路協定(Internet Protocol, 簡稱IP): 制定了所有在網路上流通的封包( peacket)資料格式與規則。
TCP是架在IP上, 完整的TCP/IP就是由這兩個主要的協定 與其他協定所構成, 若以多層式模型描述TCP/IP, 則較廣為採用的是如 圖1所示的架構。
圖1 TCP/IP多層模型架構:
┌───────────────────────---------------┐
│ 應用層(Application Layer) │
│ 包含網路的應用程式與程序。 │
├──────────────────────────--------┤
│ 端對端傳輸層(Host-to-Host Transport Layer) │
│ 提供端對端的資料傳送服務。 │
├──────────────────────────--------┤
│ 網際網路層(Internet Layer) │
│ 定義傳送資料的格式與資料遞送的規則。 │
├──────────────────────────--------┤
│ 網路存取層(Network Layer) │
│ 包含實體網路的遞送與存取。 │
└──────────────────────────--------┘
在圖1所示的架構中, 資料的流向通常是由應用層往下傳達, 途中經過端對端傳輸層、網際網路層, 最後由網路存取層透過傳輸媒介送至 目標電腦的網路存取層, 再由下而上, 傳至其應用層。 TCP/IP協定允許不同類型的主機透過網路相互「交談」,它所提供的 服務幾乎已能滿足大部份使用者的要求, 並且TCP/IP尚具前瞻性 , 新的服務項目也正逐漸擴充當中。
TCP/IP目前已成為電腦網路通訊的標準之一, 透過它即可連結不同類型 的網路與電腦系統, 目前幾乎所有的電腦系統皆支援TCP/IP協定的軟體, 例如IBM主機、PC、MAC、Amiga、Ataris等系統。
對於TCP/IP細節有興趣的讀者, 可 進一步參考有關Internet的書籍。

2.TCP/IP服務項目 :
所有支援TCP/IP協定的軟體皆提供本節介紹的全部或大部份功能 , 這類軟體提供的TCP/IP服務包括:
●電子郵件 (E-mail) 投遞服務。
●檔案傳輸服務。
●遠程終端機模擬服務。
●資料庫服務。
●電子會議服務。
●多媒體資料傳輸服務。
●遠程計算與模擬服務。
由於TCP/IP具備在多工環境運作的條件, 因此, 有些支援TCP/IP協定 的軟體本身即可「同時」提供全部或部份上述的服務。
例如PC的網路作業 系統 (Net work Operating System、簡稱NOS) 即允許使用者同時進行最多10件 的工作, 使用者可利用鍵盤和另一端主機的使用者交談, 啟動終端通訊 功能與其他主機連線, 或至其他主機下傳檔案, 而當這些工作都在進行的 同時, NOS還會暗中將電子郵件傳至其他主機, 或接受其他使用者的連線。
簡單地介紹幾個TCP/IP協定中, 較常見的服務或協定:
TELNET: 終端模擬程式。
在實際的網路環境, TELNET允許使用者 由某部主機存取另一部主機的資源, 令使用者端的主機 像是直接與另一部主機相連的終端機。
FTP: 檔案傳輸協定 (File Transfer Protocol)。
此程式允許 使用者在兩部主機之間傳遞文書檔與二進位檔案。
SMTP: 簡易郵件傳輸協定 (Simple Mail Transfer Protocol), 主機可以藉此自動將電子郵件由一部主機傳至另一部, 使用者通常不會察覺它的存在。若您在自己的電腦中寫了新的 郵件, 則SMTP會自動嘗試將這些郵件送至目標主機。 POP: 郵件遞事務協定 (Post Office Protocol), SMTP雖然很自動化, 但主機必須是全天開啟的, 對於非全天候開啟的主機, POP可 允許所有內送的郵件暫時存放在郵件服務器 (mail server), 等使用者開機時, 其主機將自動要求郵件服務器送出該使用者 的郵件。
PING: 封包網際探索器 (Packet InterNet Groper), 這個程式以送出 一個封包的方式來探索某部指定的主機, 若該主機收到該封包, 會即刻回應另一個封包, 而PING將顯示來回封包所花的時間。 FINGER: 此命令可列出主機上所有的使用者, 或列出某個特定使用者的 相關資訊。
ARP: 位址解析協定 (Address Resolution Protocol)。為了使封包 能正確送到目的站, IP位址須與正確的硬體位址匹配, 通常軟體 並不知道給定IP位址的硬體位址為何, 當它需要知道時 , 即可利用ARP送出一段廣播訊息 (broadcast message), 而遠端 的機器若收到該訊息, 即會回應它的硬體位址。
目前, Internet上已有越來越多新的工具程式架設在上述各類協定 上, 這些程式的發展方向大都朝向整合性功能以及與使用者更親近的操作 介面方向發展, 這些就留待以後再介紹了。

2010年1月27日 星期三

雲端運算(Cloud Computing)之我見

雲端運算(Cloud Computing)之我見

作者:常世勳
雲端運算(Cloud Computing),最早是由Amazon提出的,雲端運算其實是由"雲" + "端"所組成的,而且嚴格來說雲端運算也不算是一種技術,我認為它比較像是一種"創新"(創新:不是指發明全新的技術或觀念,而是指利用現有的技術/觀念,而創造另一種新的價值),進而非常有機會成為一種"殺手級的應用".
雲端運算的觀念其實在以前就有人提出類似的應用,例如:"分散式運算","網格運算",或是以前我在學校時所使用過的"終端機",這些都算是"雲端"的前輩(當然是指觀念類似,但不是完全相同);只是當時"環境"尚未成熟,所以無法普及到End user.
這裡所指的"環境"包含了:網路速度(過慢),電腦/手持上網裝置的普及程度,瀏覽器的應用,無線網路的普及程度.而迄今,這些"環境"都已非常成熟了,尤其是寬頻網路及無線網路,瀏覽器(例如IE)也設計得非常方便操作,所以"雲端運算"也就成為可以被實現的一種觀念.
雲端運算共分三層結構,由下而上分別是「基礎建設即服務」,「平台即服務」和「軟體即服務」.
先來談談"雲"和"端"吧:
"雲":泛指數量很多的伺服器(運算速度強大),以及大容量的儲存設備(Storage).
"端":泛指End user所擁有的各種可以上網的裝置(手機,PDA,Desktop,NB...)且最好包含網路瀏覽器.此外,這些電子裝置不用功能非常強大,只要可以使用瀏覽器上網,就可以使用"雲"的服務.
因此未來若雲端雲算成熟且普及之後,桌上型電腦及筆電很有可能會慢慢被便宜又輕薄的可上網裝置所取代.當然微軟及INTEL(這對阿比阿弟又被稱之為WINTEL)所面臨的挑戰會是首當其衝的,因為電腦裡面不再需要灌Windows了,只要有非常簡單的小型O.S,再加上瀏覽器的應用程式就夠了;甚至也有可能完全都由BIOS來完成,這在UEFI架構的BIOS是可行的.
以後測試team也不用再一直測Win7/Vista,只要測瀏覽器+Mini O.S ;總之以後大家的工作內容都會有很大的變化.
而"雲","端"之間的橋樑便是"高速網路"(光纖網路,3G...),以下是示意圖:
"雲" <------(光纖網路,3G)------> "端"

雲端運算可以把它想像成是"吃飯",我們不必因為想吃各類的餐點而去請一堆廚師到家裡,或是自己要會煮各式料理.只要"送貨速度"快速,我們可以叫各種餐廳外送(這就是"雲"的觀念:不必自己養一頭牛在家裡,而你家就是"端"),以下是對照圖:

"雲" <------(光纖網路,3G)------> "端""
各大餐廳外送服務" <------(30分鐘內保證送到)------> "我家"

相信大家看完葵花寶典上冊之後,應該對雲端運算已有了清楚的概念了.
雲端運算的精神其實非常簡單,就是有很多強大的"雲"可以提供各式各樣的服務(即"雲端服務")給消費者(即"端",消費者可以包含End user及企業),所有的電腦運算都由"雲"來完成,然後再透過網路把結果送到我們的手機/PDA/NB("端").
所以雲端運算其實不是一種全新的發明,它是把現有的各種技術/設備/觀念都加以組合,型成另一種有價值的活動,這也是我認為它是一種創新的原因.
因此,我們的手機/PDA/NB...的功能就不用非常的強大,也不用常常為了某種應用而去升級硬體;相對的,"雲"的設備就要求運算功能要很強大,且要有很大的儲存容量可以存放我們的資料.
以後我們可能只要靠一隻硬體水準很普通的手機就可以做到目前個人電腦所有可以完成的事情,例如用手機玩華麗的3D遊戲,做影像編輯,甚至程式設計師最為頭痛的Build code......因為所有要耗費硬體資源的運算都由"雲"來幫你先處理好了.
我們電腦的硬碟也不用再因為空間不夠而一直花錢更換更大的硬碟,因為大部分的資料(影片,照片,音樂,資料檔案......)都是放在"雲"上面.
所以雲端運算帶來了非常多的商機及新的機會,例如伺服器/Storage的需求會爆增,台灣的相關代工廠商(廣達,英業達)便會受惠;網路服務及網路設備的商機也會增加;此外最有想像空間的便是"雲端服務"裡面的其中一項"軟體即服務"這塊大餅,以後大家都可以在家裡自己寫一個好用的程式,然後把它放在"雲"上面給別人使用,也可藉此賺取金錢;當然也可以免費,因為有人只是想成名.
這種商業模式完全打破目前軟體界由微軟獨霸的現象,讓升斗小民的我們有了另一片"藍海".
前面講了那麼多"雲端運算"的好處,難道雲端運算都沒有缺點嗎?...
當然有,事情總是一體二面的,有好必有壞,有陰必有陽.
雲端運算最大的隱憂便是"資訊安全",尤其是我們的個人隱私資料.因為我們所有的運算及絕大部分的資料都是由"雲"幫我們處理,想當然爾,"雲"便掌握了我們的隱私,我們所有的動作,資料,喜好,習慣都會被"雲端服務"的廠商記錄下來,所以我們的隱私便有被揭露的風險.
又及,因為我們所使用的絕大部分軟體都是由"雲"來提供並執行,若是"雲端服務"的廠商停止該項服務,或是你所處的地方是沒有網路或是網路速度很慢的環境,則會嚴重影響到我們的生活及工作,因為你不可能像現在一樣,換到另一台電腦上面就可以繼續工作(因為電腦內已經沒有安裝大部分的軟體,例如:Word,Excel...,這些都是由"雲"來提供的).
當然,你放在"雲"上面的資料亦有遺失的風險.這些都是雲端運算需要克服的隱憂.
接下來我想要深入探討"雲端運算"對國家競爭力的影響,這要由大戰略的角度來思考,這是一般我們做工程師的人不太會想到的層次,但卻是非常重要.目前世界各國都已經在籌設自己的"雲",例如中國大陸已在建置"北京雲","上海雲";韓國也在建置"雲端松島".
為何這些國家要這麼積極呢? 有個例子很容易來回答,我們知道目前世界上的霸主是美國,絕大部分一流的企業都是在美國(微軟,INTEL,思科,Google,Apple...),也因此美國掌握了規格的主導權,以及相關的商業模式...這就是國家競爭力.
所以若是所有的"雲"都在美國,那其它國家便都被它的"雲"所牽制住,層次高一點的是國家機密也就很容意被洩;另一層面是企業沒有規格的主導權(也就是遊戲規則),永遠只能跟隨在美國企業的腳步之後賺辛苦錢.所以台灣是否也應該要有自己的"雲"呢?!當然要.
雖然我們可以和對岸合作共建"雲",但除此之外,台灣還是要有自己的"雲".理由很簡單,就是國家安全及軍事機密.
雲端運算目前很熱門,但還是有需多相關的細節尚處於模糊階段,也就是因此,才會充滿想像及機會.

2009年4月16日 星期四

2009年4月4日 星期六

UEFI Framework的生命週期

簡單的來說,Framework就是UEFI的一種實現,由Intel自己所開發完成的。
它完全實現了EFI spec 中提及的各項功能。開發者可以基於Framework,開發出各種EFI應用。同時也可以為Framework新增新的功能。

Framework的執行(The life cycle of the Framework ),是按照以下的順序來執行的:
(1)SEC :Security。
這個是系統上電後所立即進入的一個階段,在這一階段,Intel並沒有做太多的說明,相反,他們說這個階段可以由大家按照自己的需要利用。也就是說,我們可以安排我們自己想要的任何task在這個階段,比如一些身份驗證之類的。

(2)PEI :Pre-EFI。
正如它的名字一般,這個是在真正的UEFI環境之前進入的一個狀態,這個狀態相當重要,以至於Intel花了很多時間來向我們闡述。
這個階段會做很多初始化的工作,會初始化CPU,初始化主板上的一些controller以及chipset,更加重要的是,在這個階段內,會使用一種技巧(CAR:Cache as RAM),來迅速的建立起執行C 語言所需的環境,也就是說,會建立一個stack。
這樣,以後機器就可以run那些由C語言所編寫的code了。最後PEI Core會按照一種方法來load所有的PEIM( Pre-EFI Module )。
PEIM是一種可以run在這個階段的一種module,任何人都可以開發自己的PEIM,load的工作由PEIM Dispatcher完成。
全部load之後,PEI會launch DXE Main並將系統控制權交給下一個階段:DXE phase。

(3)DXE :Driver Execution Environment。
在這個階段,UEFI真正的提供了一個類似OS一樣的東西。在上一個階段PEI,系統已經建立了C語言可以執行的環境,從這個階段開始,所有的東西,都是用C語言完成了。
進入DXE後,會首先launch各種driver,比如Video Driver,NIC Driver,Soundcards Driver,USB Driver,PCI Controller Driver等等。
完成之後,就開始進行Boot。而這就是下一個階段了。

(4)BDS :Boot Device Select。
在這裡,應該會有一個選擇,是進入OS呢?還是去執行那些EFI Applications ?
選擇完成之後,就進入下一個階段了。

(5)TSL :Transient System Load。
這個階段會按照在BDS階段選擇的結果來做不同的事情,如果選擇了進入OS,那麼控制權會被傳遞給Final OS Loader。而如果是要去執行EFI Applications,則控制權便交給Transient OS Boot Loader,這樣就會建立起一個執行環境,之後就可以執行那些EFI Applications了。
目前,應該會執行一個叫EFI Shell的程序。而傳統的BIOS Setup也被寫成一個EFI Applications。

(6)RT :Run Time。
這個階段就是OS執行的階段。

(7)AL :After Life。
這個是OS執行之後的階段,例如關機之類的。但OS crash之後也屬於這個階段,也就是說,在系統萬一crash之後,如果使用UEFI,那麼還是可以做許多事情的。

以上就是Framework完整的執行週期。

Author: 常世勳

EFI Shell (Part 1)

1.什麼是EFI Shell?
EFI Shell是一個UEFI的應用程式,類似於我們在Windows中所用到的cmd或者在Linux中的shell。
EFI Shell是個非常重要的應用程式,它負責接收user的輸入,將user的輸入解譯並告訴kernel去執行,同時將執行結果顯示出來, 以完成和user的互動功能。

2.EFI Shell Commands list:
EFI Shell使用string interface和user互動,以下列出一些較常用到的命令:
( 1)pci : 顯示PCI設備或者PCI的configuration information.
( 2)mm :顯示或者修改memory,I/O以及PCI資源。
( 3)mem :顯示System memory或者Device memory的情況。
( 4)memmap :顯示由EFI Environment建立的Memory Map。
( 5)drivers :按照EFI Driver 的類型來逐一顯示所有已經安裝的Driver。
( 6)devices :顯示所有已經被EFI Driver所控制的device。
( 7)devtree :按照EFI Driver的類型來顯示device tree。
( 8)dh :顯示在EFI Environment中的所有的Handles。
( 9)connect :將一個Driver給 connect到一個device並啟動device。
(10)load :將一個Driver讀入memory。
(11)unload :將一個Driver從memory中unload掉。

Author: 常世勳

2009年2月9日 星期一

按Keyboard三個鍵便可讓Windows產生藍屏(BSOD):

1.用Regedit去改登錄檔:
1.1.若是用USB keyboard:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kbdhid\Parameters
1.2若是用PS2 keyboard:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters

Create一個DWORD鍵,名稱為:CrashOnCtrlScroll, value設為1

2.改完之後記得要重開機.
3.下次開進OS之後,
按下keyboard右側的Ctrl鍵不放,同時再按Scroll Lock鍵二次, 此時系統便會出現
BSOD, message如下:
The end-user manually generated the crashdumpTechnical information:
*** STOP: 0x000000E2 (0x00000000, 0x00000000, 0x00000000, 0x00000000)

這個小技巧對RD debug有個很有用的地方,即是當你遇到系統不知為何變成黑屏時,
若你想知道此時Windows是否還活著,可用這個方法去手動產生藍屏,若windows
還活著,藍屏便有機會產生; 但這有個前提是VGA driver這時是ok的,因為產生黑屏
的原因也有可能是VGA driver本身出問題.

PS:這個方法在Vista, XP皆有效.

Author: 常世勳

2009年1月20日 星期二

UEFI 心得筆記 (2)

1.
PEI phase:
1.1> PEI phase的code是在flash part內執行的.
1.2> 包含S3 resume的code.
PS: S3 resume及normal boot各會有一份memory initial的code,
通常這二份可以是相同的,但也可以針對S3 resume的那一份
memory initial的code做一些精簡.
1.3> 是否要做Crisis的判斷.

2.
SEC and PEI phase的執行時間通常是愈短愈好,以免影響到
S3 resume time. 當然,如果你的客戶不care POST time, S3
resume time的話,則你是可以把一些H/W initial或一些特殊
的function放在SEC phase來做的.

Author: 常世勳

2009年1月15日 星期四

UEFI 心得筆記 (1)

1.開機Post 流程: SEC -> PEI > DXE -> BDS

2. S3 resume: SEC -> PEI (不會run到DXE and BDS phase)

3.BDS其實也是DXE driver的一種

4.UEFI spec的定義, 真正的H/W initial (Ex:PCI BUS, VGA, Keyboard......)是在BDS phase才會執行的.

Author: 常世勳

2008年9月24日 星期三

GUID (Globally unique identifiers)

GUID (Globally unique identifiers):
是一組用來定義包含電腦、程式元件、設備…等物件的唯一數值。
這些物件通常都包含了名稱,即使是這兩個物件有相同的名稱,或者是他們經過名稱變更…等,他們的GUID都仍是唯一的。
換句話說,一個物件的GUID與安全性原則中的SID是類似的。GUID遍佈在登錄檔當中,所以,你必須熟悉並且習慣他們。
所有的GUID,都有著相同有趣的格式,他們是16-byte,以8、4、4、4、及12為群組的16進位制數值(即0到9及A到F)。而每個群組值間以-及分隔,並以{}符號包裹。
如{645FF040-5081-101B-9F08-00AA002F954E}即為一組GUID數值,它代表在桌面上你可以看到的資源回收筒物件。
GUID {127A89AD-C4E3-D411-BDC8-001083FDCE08}則代表在我實驗室裡的一台電腦。
程式設計人員通常都會使用名為Guidgen.exe的工具來製造GUID值,但是Windows XP本身也會製造它們。不管來源為何,Microsoft都保證GUID是全球唯一的值。
不管Guidgen.exe或者是Windows XP產生GUID多少次,結果都是唯一(unique)。
而這也是為什麼用GUID來驗證如電腦、裝置及任何東西的原因。

Author: 常世勳

DOS/4GW

Watcom C/C++ 透過 DOS/4GW 這個 Dos Extender 可以存取到傳統記憶體以外的記憶體空間,但是它讓我們依然可以直接存取DOS 1MB以內的記憶體位址 , 所以我們可以照常把資料直接寫入顯示記憶體不成問題, 另外 , 呼叫中斷也都一如往常 , 所以我們幾乎感覺不到進入保護模式的一些麻煩與痛苦 , 但是卻可以享有更多的記憶體 與 幾乎不變的程式寫法 .

Author: 常世勳

Preemptive & Non-preemptive , Cooperative Multitasking

Author: 常世勳

先佔式多工(Preemptive Multitasking)
也就是所謂「優先權式多工」或是「先佔式多工」。
在這種模式底下,每個程式的執行時間係由「作業系統」來分配,一個程式的時間使用完之後,系統就會將CPU分配給下一個程式(這種動作稱為context switching),沒有一個程式能獨佔CPU。
這類作業系統較常見的有Windows NT、OS/2,而Windows 95則無法對於16-bit的應用程式做到優先權式多工,至於32-bit應用程式,則不一定是哪種多工模式。
Cooperative Multitasking, Cooperative Multitasking, OS 協同式多工:
一種多工 (multitasking) 的作業方式,每一個行程 (process) 必須提供其他行程使用處理器 (processor) 的機會,使每一個程式都能被處理器執行來達到多工的作業,作業系統 (OS) 在這種方式下扮演的角色只是輔助管理與分配程式間的處理器使用時間,若是一個程式佔據處理器時間不放,則其他程式包括作業系統都沒有機會來執行,且一個當掉或設計有問題的程式可能會使得整個系統當掉。
相對於協同式多工,先佔式多工 (Preemptive Multitasking) 則由作業系統主動分配執行時間給行程或程式,不管行程是否發生問題都能夠維持其他程式不被影響,作業系統並能夠有機會解決有問題的程式。


以JAVA執行緒的時間排程為例:
可奪取優先權 ( preemptive ) :
所有的執行緒皆被給定固定的執行時間, 執行時間使用完畢, 便暫停執行緒的執行。 排成器從等待執行的執行緒中, 挑出優先權最高的執行緒, 將其恢復執行。
不可奪取優先權 ( non-preemptive ) :
執行緒擁有所有 CPU 的執行時間, 任由其個別使用。 只有在呼叫成員方法 yield ( ) 等才可以強制排成器 ( scheduler ) 更換下一個執行緒使用 CPU 時間。

Rundll32.exe

Author: 常世勳

在Windows中使用了許多動態連接庫, 這樣就使得所有Windows程序都可共享這些動態連接庫中的函數, 許多應用程式都通過 Windows API 來操作這些函數,
但實際上是透過 Windows 資料夾下的 rundll32.exe 程序來啟動對應的函數。它的用法是:「rundll32.exe 動態連接庫名,函數名,參數名」

Control Panel:
rundll32.exe shell32.dll,Control_RunDLL

Display:
rundll32.exe shell32.dll,Control_RunDLL desk.cpl

Keyboard:
rundll32.exe shell32.dll,Control_RunDLL main.cpl @1

Keyboard Tab 2:
rundll32.exe shell32.dll,Control_RunDLL main.cpl @1,1

Printer:
rundll32.exe shell32.dll,Control_RunDLL main.cpl @2

Font:
rundll32.exe shell32.dll,Control_RunDLL main.cpl @3

Input for 95/98:
rundll32.exe shell32.dll,Control_RunDLL main.cpl @4

Input for NT:
rundll32.exe shell32.dll,Control_RunDLL cime.cpl

Regional and Language:
rundll32.exe shell32.dll,Control_RunDLL Intl.cpl,,2

Accessibility:
rundll32.exe shell32.dll,Control_RunDLL Access.cpl

Add / Remove Program:
rundll32.exe shell32.dll,Control_RunDLL Appwiz.cpl

Display:
rundll32.exe shell32.dll,Control_RunDLL Desk.cpl

Internet:
rundll32.exe shell32.dll,Control_RunDLL Intetcpl.cpl

Regional and Language:
rundll32.exe shell32.dll,Control_RunDLL Intl.cpl

Game Controller:
rundll32.exe shell32.dll,Control_RunDLL Joy.cpl

Mouse:
rundll32.exe shell32.dll,Control_RunDLL Main.cpl

Sounds and Audio Device:
rundll32.exe shell32.dll,Control_RunDLL Mmsys.cpl

Modem:
rundll32.exe shell32.dll,Control_RunDLL Modem.cpl

Network:
rundll32.exe shell32.dll,Control_RunDLL Netcpl.cpl

32-bit ODBC:
rundll32.exe shell32.dll,Control_RunDLL Odbccp32.cpl

Password:
rundll32.exe shell32.dll,Control_RunDLL Password.cpl

System:
rundll32.exe shell32.dll,Control_RunDLL Sysdm.cpl

Date / Time:
rundll32.exe shell32.dll,Control_RunDLL Timedate.cpl

Add Hardware:
rundll32.exe shell32.dll,Control_RunDLL Hdwwiz.cpl

Network Connection:
rundll32.exe shell32.dll,Control_RunDLL Ncpa.cpl

User Account:
rundll32.exe shell32.dll,Control_RunDLL Nusrmgr.cpl

Power:
rundll32.exe shell32.dll,Control_RunDLL Powercfg.cpl

#if #define if

#if ............. For preposser(前置處理器)
#end if

#define JAVA 300 ...... For preposser(前置處理器)

if ............. For compiler

例:
#define DEBUG

#if DEBUG
printf("hello");
#endif


Author: 常世勳

2008年9月22日 星期一

CPU C3 and C4之進入及離開

作者: 常世勳

C3 (Deep Sleep):
Entry Method:STPCLK# , SLP#, DPSLP# asserted
Exit method:Chipset break event

C4 (Deeper Sleep):
Entry Method:STPCLK# , SLP#, SPSLP# assertedLower power voltage
Exit method:Chipset break event

How to get current CPU Microcode ID

作者: 常世勳

Sample code:

Mov ecx, 08Bh
Xor eax, eax
Xor edx, edx
WRMSR
Mov eax, 1
CPUID
Mov ecx, 08Bh
RDMSR

Will be place in EDX.

If there is an update currently active in the processor, it’s update revision is
returned in the EDX register after RDMSR instruction has completed.

讀MSR

讀MSR: 作者: 常世勳

Tool: Debug32

-a 100
-mov ecx,ee
-rdmsr
-int3
-
-p
-p
-p
-r32

MSR讀回來的值會放在 EAX,ECX (一個是存放高位址,另一個是存放低位址)
-------------------------------------------------------------------------------
RDMSR: Load MSR specified by ECX into EDX:EAX
WRMSR: Write the value in EDX:EAX to MSR specified by ECX

RDMSR: 讀取 MSR - Model-Specific Registers
WDMSR: 寫入 MSR

Smart battery 

Smart battery 
電池的一種規格,早期的電池無法提供本身的資訊,例如電池存餘量、電壓等, 系統也無法取得準確的電池容量。所以 Intel 和 Duracell 合作開發了 Smart battery System規格,多了兩個信號線來和系統溝通,達到精確檢測電池壽命刻度。
這兩個信號線的通訊協定稱之為「System Management Bus」。電池多了這個功能後便可和系統,充電器互作溝通。於是系統或充電器便可了解電池當時的電壓、電流何時可以充完、電池可以充多少的電、何時電池會耗盡等訊息,而且準確率可達 98%以上。

Device/Chipset的resource(IO Port,Memory,IRQ)在 BIOS POST與進入OS之後會有何差異

作者:常世勳

Device/Chipset的resource(IO Port,Memory,IRQ)在 BIOS POST與進入OS之後會有何差異:

IO Port:一般仍是維持與POST時所定義的IO Port相同,因為OS不會知道關於Chipset的IO Port要使用什麼樣的setting,所以OS不會去重新針對IO Port做洗牌(re-assign)
Memory: 若是你有宣告為Mother board resource的Memory area,則OS便不會去re-assign這些已被宣告為Mother board resource的Memory area給其他的device使用(宣告為Mother board resource的Memory address一般都是chipset或其他的controller在BIOS POST時已assign好了,所以這些Chipset/controller的memoryresource在進入Windows之後是不能再去讓OS重新assign不同的memory address)其它沒宣告為Mother board resource的Memory address則會被OS重新洗牌,re-assign一次.
IRQ: 近入Windows之後,IRQ便會使用我們BIOS在ASL Code內所定義的IRQ resource(APIC Mode或PIC Mode之IRQ resource定義方法會不一樣)

POST時,BIOS存DATA的方法

作者:常世勳

因為POST時,當BIOS被Shadow至F000後,BIOS會去設定Chipset將此段區間(F000,E000..如果BIOS COde也有被shadow至E000的話)設為Read only,以防止BIOS Code被破壞.
所以若想要在BIOS Post過程去儲存一些我們OEM會用到的資料或設定OEM的變數,有以下三種方法:
1.CMOS
2.BIOS Data Area (40 Data Area)
3.PM segment (A000,B000)...SM Ram...藉由發software SMI去執行一段我們自己的code去儲存資料於SM RAM .
PS: 需注意:我們加的這段CODE要在SMI init即VGA init之後(可由posttbl.asm去查詢),否則會有問題.
4.Flash part, 例如UEFI BIOS所使用的variable是存放在flash part內的,在UEFI的spec中,是已捨棄CMOS,而改為使用flash part來當做storage;當然這部份仍需視每家BIOS vednor的實作而定,例如Phoenix的Benton BIOS是CMOS及flash part都會使用到的.