2011年6月29日 星期三

比較JTAG、SPI和I2C三種串列匯流排

此份文件介紹三種串列匯流排,包括聯合測試工作組(JTAG)、串列周邊介面(SPI)和內部整合電路(I2C),目前一般的電子產品都有其中一個或以上的串列匯流排。串列匯流排比起平行匯流排來說,具備許多優點,包括較低的零件成本、較小的電路板、簡單的設計方法與較低的耗電量。

雖然有以上的優點,但是在傳輸速度上卻比平行匯流排低,因為串列匯流排只有一條線來作資料的輸出與輸入,有些則有不同的資料輸出與輸入訊號。然而平行匯流排可以同時輸出和輸入多筆訊號。

View the PDF document for more information.

2011年6月22日 星期三

剖析CPU溫度監控技術

引言 迄今為止還沒有一種cpu散熱係統能保證永不失效。失去了散熱係統保護傘的“芯”,往往會在幾秒鍾內永遠停止“跳動”。值得慶幸的是,聰明的工程師們開發出有效的CPU溫度監控、保護技術。以特殊而敏銳的“嗅覺”隨時監測CPU的溫度變化,並提供必要的保護措施,使CPU免受高溫下的滅頂之災。在我們看來,探索這項技術如同開始一段神秘而有趣的旅程,何不與我們同行? CPU功耗和溫度隨運行速度的加快而不斷增大,現已成為一個不折不扣的“燙手山芋”。如何使CPU安全運行,提高係統的可靠性,防止因過熱而產生的死機、藍屏、反複重啟動甚至CPU燒毀,不僅是CPU所麵臨的困境,也是留給主板設計者的一個重要課題。為此,Intel率先提出了溫度監控器(Thermal Monitor)的概念,通過對CPU進行溫度控製和過熱保護,使穩定性和安全性大大增加。 &n bsp; 但是,由於電腦愛好者和普通用戶對CPU溫度監控係統了解不多,而且介紹這方麵知識的中文資料也難以獲得,遇到相關問題時會感到不知所措,所以有必要將 CPU溫度監控技術係統地介紹給大家。 一、溫度測量:從表麵深入到核心 建立CPU溫度監控係統,首先要選擇一種合適的溫度測量器件。能夠測量溫度的器件有很多種,如熱敏電阻、熱電偶和半導體溫度傳感器等。電腦中最早使用熱敏電阻作為測溫元件,CPU插座下豎立的球狀或帶狀的小元件,就是熱敏電阻(如圖1)。 圖1 CPU插槽下的熱敏電阻 熱敏電阻(Thermal Resistor ,簡稱Thermistor)體積小、價格低,使用方便,但用於檢測CPU溫度時存在著先天不足: 1.熱敏電阻是接觸式測溫元件,如果熱敏電阻與CPU接觸不夠緊密,CPU的熱量不能有效地傳送到,所測量溫度會有很大誤差。有些主板上采用SMD貼片熱敏電阻去測量CPU溫度,其測量誤差比直立式熱敏電阻誤差更大,因為這種貼片元件很難緊密接觸到CPU。 2.CPU的核心(die)發出熱量由芯片封裝向外部散熱,CPU的表麵溫度和核心溫度之間約有15℃~30℃的溫差,同時因芯片封裝形式不同,及環境溫度的不同而難以確定。至今還沒有一種技術能夠把熱敏電阻埋進芯片內部去,導致現在熱敏電阻隻能測量CPU的表麵溫度,而無法測量核心溫度。 總之,熱敏電阻不僅測量精度難以保證,更重要的是無法檢測到熱源的真實溫度。 由於熱敏電阻先天不足帶來了一個十分嚴重的問題∶表麵溫度不能及時反映CPU核心溫度變化,用專業術語說就是存在一個時間滯後的問題。因為核心溫度變化之後要經過一段時間才能傳送到CPU表麵。圖2反映了采用核心測溫方式下保護電路起作用的情況,當核心溫度達到CPU極限溫度T2時,控製電路及時切斷 CPU的供電,否則隻需幾秒鍾時間便會到達燒毀溫度T3。相比之下,表麵溫度反應十分遲鈍,其升溫速度遠不及核心溫度,當核心溫度發生急劇變化時,表麵溫度隻有“小幅上揚”。Pentium 4和Athlon XP等最新的CPU,其核心溫度變化速度達30~50℃/s,核心溫度的變化速度越快,測量溫度的延遲誤差也越大。在這種背景之下,如果再以表麵溫度作為控製目標,保護電路尚未做出反應,CPU可能已經命歸黃泉了。 圖2 表麵溫度的時間滯後特性 為了解決熱敏電阻無法測量C PU核心真實溫度的問題,Intel在Pentium Ⅱ和Celeroncpu中植入了熱敏二極管(Thermal Diode,或簡稱作Thermodiode)直接測量CPU核心溫度,開創了半導體測溫技術的先河。此後的Pentium Ⅲ和Pentium 4芯片中都植入了熱敏二極管,AMD在Athlon和DuronCPU中也植入了熱敏二極管。現在許多主板都在監控芯片內設置有熱敏二極管,用於檢測芯片所在位置的環境溫度。 (小知識∶如何知道BIOS或測試軟件顯示的CPU溫度是表麵溫度還是核心溫度?) 就目前來看,無論使用Intel還是AMD的CPU,已很少使用熱敏電阻測量CPU表麵溫度了,所以BIOS與檢測軟件所顯示的CPU溫度都是指CPU的核心溫度。而在Pentium Ⅱ以前,CPU溫度通常是指表麵溫度;Pentium Ⅱ及以後的CPU內都集成有熱敏二極管,所測量溫度就是核心溫度。不過,在過渡期內許多主板上仍在CPU插座下麵保留了熱敏電阻,這樣就同時能檢測到兩個不同的CPU溫度值,通常BIOS中顯示的是CPU的外部溫度,而檢測軟件所測試的是核心溫度。 熱敏二極管又叫熱敏PN結(Thermal PN junction),基於矽基PN結正向電壓和溫度的關係,其測溫範圍在-55℃~+150℃之間。與熱敏電阻一樣,熱敏二極管屬於變阻器件,其等效電阻值是由其工作溫度所決定。 二、溫度監控:從單純顯示到溫度監控 在熱敏電阻為主要測溫手段時期,測得的CPU表麵溫度經放大器將微弱信號放大後經A/D轉換,將模擬信號轉換成數字信號後再通過數據線發送給BIOS芯片(如圖3),數據進入BIOS芯片後,BIOS或監控軟件就能在屏幕上顯示了。 圖3 溫度信號處理電路 溫度顯示係統是一種被動的體係,無法對溫度進行調節。一旦測得CPU溫度超出設定溫度,電腦可以發出聲光報警,以提醒電腦用戶進行人為幹預。這種係統用於目前發熱量大的CPU基本上沒有安全可言。如果散熱係統發生問題後,沒等用戶反應過來,CPU就已經燒毀了。因此,Intel提出了溫度監控的概念,讓係統具有自我調控能力,一旦CPU溫度超出所設定的極限溫度,係統將通過降低供電電壓、降低芯片工作頻率和加強冷卻等手段進行主動降溫,甚至自動關機,以確保CPU安全。 溫度監控技術有兩個鮮明的特點∶一是cpu內置熱敏二極管直接測量核心溫度,二是主板上設置監控芯片(如圖4)。Intel首先在Pentium Ⅱ及CeleronCPU中植入熱敏二極管,並公開了具有溫度監控技術的主板設計指南,這一舉措得到主板製造商的積極響應,各具特色的所謂的“智能主板” 如雨後春筍,一時精彩紛呈。一些有實力的主板製造商還自行開發監控芯片(如MSI的CoreCell等),溫度監控技術在短短幾年內便有了很大進步,不斷完善溫度監控功能。 ; 圖4 各種硬件監控芯片 實際監控係統所采取的主動降溫措施中,哪種方法更有實際意義呢?下麵我們進行一個簡短的分析。 芯片的功耗(發熱量)由靜態功耗和動態功耗兩部分組成(如圖5),靜態功耗是因為漏電流引起的。由P=V2/R可知,在芯片等效電阻R不變的情況下,功耗 P與電壓V的2次方成正比,降低供電電壓可以極大地降低靜態功耗。所以這些年來芯片工作電壓從5V降到3.3V,甚至降到目前的1V以下。我們當然希望這個數值進一步降低,但如果沒有k值更高的柵極材料,就無法保證在低電壓下完成晶體管開啟和關閉動作。所以,降低電壓的手段畢竟還是有限的。而且由於CPU 內集成的晶體管數量的按摩爾定律逐年增加,眾多晶體管並聯後使得等效電阻值不斷減少,集成電路內層與層之間的絕緣層變薄也使得層間泄漏電流增加,所以 CPU的靜態功耗一直趨於上升態勢。 圖5 芯片工藝進步 泄漏功耗增加 芯片的動態功耗P = CV2f,其中C表示電路負載大小,V表示供電電壓,f為工作頻率。可見f與芯片的動態功耗成正比,頻率愈高則消耗的功率也愈高。降低CPU的時鍾頻率雖然是降低動態功耗的有效手段,但是,電腦用戶總是希望程序能夠執行得更快,通過降低頻率來降溫的手段是難以被用戶所接受的。 既然降低電壓和頻率的降溫方法都有很多現實困難,所以利用風扇帶走熱量就成了一種最簡便可行的方法。近幾年來,CPU風扇的尺寸越來越大、轉速越來越高,使得排氣量越來越大,這在一定程度上緩解了CPU溫度高居不下的問題。但是風扇扇葉尺寸過大、轉速過高,又帶來了噪音問題,而且環境溫度過高也會影響散熱效果,所以又必須增加機箱風扇,使得噪音問題進一步加劇。 為了降低噪音和節省能耗,在CPU溫度不太高的時候讓風扇保持低速運轉,在不得已的情況下才提高轉速,就成了一個被大家普遍認可的溫度控製方案。因此,大多數溫度監控係統實際上就是一個“溫度-轉速控製係統”,很多溫度監控芯片也是針對這種需要而設計的。 三、第一代溫度監控係統,並不可靠 cpu 溫度監控係統根據控製電路所處的位置,可分為外部控製型和內部控製型兩種基本結構。外部控製型監控係統,現在被稱為第一代溫度監控技術,它有三種基本存在形式∶一種是采用獨立的控製芯片,如WINBOND的W83627HF、ITE的IT8705、IT8712等,這些芯片除了處理溫度信號,同時還能處理電壓和轉速信號(如圖6);第二種形式是在BIOS芯片中集成了溫度控製功能;第三種形式是南橋芯片中集成溫度控製功能。在現行的主板中,三種形式同時存在,如果主板說明書中沒有特別說明,我們一時難以判斷監控硬件的準確位置。   圖6 第一代熱量監控係統框圖 圖7是一個以MIC284為核心CPU溫度監控電路,該電路隻能控製CPU風扇的轉速,但它可以將溫度信號通過SMBus端口傳送給BIOS芯片,以實現更多控製功能。 圖7 一個實際的監控電路 小知識∶什麼是SMBus? SMBus是System Management Bus(係統管理總線)的縮寫,是1995年由Intel提出的。SMBus隻有兩根信號線:雙向數據線和時鍾信號線。PCI插槽上也給SMBus預留了兩個引腳(A40為SMBus 時鍾線,A41為SMBus 數據線),以便於PCI接口卡與主板設備之間交換信息。 SMBus的數據傳輸率為100kbps,雖然速度較慢,卻以其結構簡潔造價低廉的特點,成為業界普遍歡迎的接口標準。Windows中顯示的各種設備的製造商名稱和型號等信息,都是通過SMBus總線收集的。主板監控係統中傳送各種傳感器的測量結果,以及BIOS向監控芯片發送命令,也是利用SMBus 實現的。 監控芯片通常是可編程的ASIC微控製器,應用軟件經BIOS將控製命令和數據經接口電路發送給監控芯片,修改其控製參數,一些監控軟件正是通過這種途徑來顯示和調整CPU電壓和風扇轉速的。 監控芯片是溫度監控係統的核心,其質量優劣對控製性能有很大的影響。但由於監控芯片種類繁多,在功能和性能上有很大差異,給使用和鑒別帶來一定困難。 首先,各種監控芯片在控製功能上有很大差異(譬如某個芯片可以控製兩個風扇,多數則隻能控製一個風扇),通常引腳數越多,功能越強。 其次,即便功能相同的芯片,性能上也會有差別,其中一個重要的區別在數據位的不同(譬如MAX6682的分辨率是10位,TC1024為9 位,FMS2701為8位),位數少的芯片輸出的數據精度自然也就降低了(8位芯片溫度轉換誤差為±3℃)。另一個性能差別在采 第一代cpu溫度監控技術建立在依靠外援的基礎上,當CPU過熱而超過極限溫度時,由係統向CPU發出HLT命令,讓係統暫停。因為熱量可能導致係統不穩定,如果電腦死機或程序進入死循環,就會失去監控作用,也就無法保護CPU了。同時,由於構成監控係統的元器件較多,戰線拉得很長,導致反應速度慢,無法及時跟蹤CPU溫度變化。而現在的CPU不僅核心溫度高,而且升溫速度快(最高可達50℃/s),一旦災難來臨必有“遠水不解近渴”之憂患。 四、第二代溫度監控技術,Pentium 4燒不死的秘密 為了彌補第一代溫度監控技術的缺陷,提高監控能力,Intel開發了第2代溫度監控技術。 第二代溫度監控係統的一個突出特點是在CPU內部集成了溫度控製電路(Thermal Control Circuit,TCC),由CPU自身執行溫度控製功能,同時,CPU內設置了兩個相互獨立的熱敏二極管,D1是本地熱敏二極管,所測信號提供給 TCC,D2則為遠端熱敏二極管,其測量結果用於實現主板控製功能及顯示核心溫度,如圖8。 圖8 第2代溫度監控係統框圖 我們先看看TCC是如何發揮作用的。TCC定義了兩種工作狀態:激活態和非激活態。TCC的狀態與PROCHOT#信號的電平高低相對應,PROCHOT#為低電平時,TCC為激活態,否則處於非激活態。當CPU核心溫度達到警戒溫度(Warning Temperature)時,溫度檢測電路將PROCHOT#信號置為低電平,從而激活TCC。TCC激活後,采取“抑製任務周期”(Throttle duty Cycle)的方式(如圖9),使CPU有效頻率下降,從而達到降低功耗的目的。當CPU的溫度降低後(低於警戒溫度1℃以上),TCC回到非激活態,CPU恢複到“標稱頻率”。可見,TCC實質上是一個由CPU溫度控製的頻率調節器。 圖9 TCC激活時,任務周期減少 如果發生災難性冷卻失敗的情況,使CPU溫度超出極限溫度(thermal Trip),TCC將設THERMTRIP#信號為低電平,BIOS芯片檢測到這一變化後,直接關閉CPU時鍾信號,並通過PWM控製器封鎖VRM向 CPU供電,直到溫度降到極限溫度以下,RESET#信號有效,THERMTRIP#才會重新變為高電平,係統才能繼續工作。否則THERMTRIP#總為低電平,係統就停留在暫停狀態。“當CPU離開風扇的時候”,Pentium 4CPU之所以能夠安然無恙,答案就在這裏。 樣速率上,如果采樣速率低(例如FMS2701的采樣速率為1s),必然增加信號延遲,無法及時跟蹤CPU溫度的變化。 小知識∶警戒溫度與極限溫度有什麼不同? cpu警戒溫度(warning temperature)和極限溫度(thermal trip)都是指核心溫度,但它們所代表的意義有所不同。警戒溫度是能夠保證CPU穩定運行的溫度;極限溫度也叫最高核心溫度(Maximum die temperature)或關機溫度(Shutdown temperature),是防止CPU免於燒毀的溫度。 各款CPU的警戒溫度和極限溫度值是製造商根據CPU的製造工藝和封裝形式及封裝材料確定的,並在技術白皮書中給出。為防止用戶自行設定而帶來危險,Intel已將Pentium 4CPU的警戒溫度和極限溫度寫入TCC內的ROM單元中,用戶無法修改它們。 現在有不少主板的BIOS中也可以設置警戒溫度和關機溫度,不過可選的數值都比較保守,例如警戒溫度最大值為70℃、關機溫度為85℃,這是遠低於TCC 內設定值的。 兼顧性能和可靠性是第2代溫度監控技術的優秀之處。由公式P = CV2f(其中C是等效電容容量;V是工作電壓)可知,頻率f與能耗P之間是一種線性關係,降低頻率是減少發熱量的有效途徑。這種通過降低有效頻率實現降溫的措施,比之以前那種關斷時鍾信號的做法顯然要聰明一些,避免了因強行關閉CPU,而導致數據丟失的情況。 Pentium 4CPU中的PROCHOT#引腳還有另外兩個實用的功能。其中的一個功能是向主板發出報警信號——PROCHOT#引腳為低電平時,說明CPU核心溫度超過了警戒溫度,此時CPU工作在較低的頻率上。如果超出警戒溫度(電腦用戶利用工具軟件可以獲得這個信息),應及時檢查散熱器安裝是否妥當,風扇轉速是否正常。 PROCHOT#引腳的另一個功能是可以保護主板上的其他元件。PROCHOT#引腳采用雙工設計——信號既可以從這根信號線出去,也能進得來。主板設計者可利用這一特性為供電模塊提供保護,當供電模塊的溫度超出警戒溫度時,監控電路輸出一個低電平到PROCHOT#引腳以激活TCC,通過降低CPU功耗來達到保護供電模塊的目的。 可見,Pentium 4CPU不僅能自保平安,還能對供電電路提供保護,細微之處體現出設計者的良苦用心。同時,將TCC集成到CPU內不僅對自身更加安全,也簡化了主板設計,降低了主板製造成本。可以說,第2代溫度監控技術是一個給CPU製造商與下遊主板廠商帶來雙贏的技術。 小知識∶如何設置BIOS中的“Processor speed throttling”? Pentium 4主板的BIOS中通常有“Processor speed throttling ”之類的選擇項,用於選擇超警戒溫度後CPU任務周期(duty cycle)占全部周期的比例,在CPU頻率不變的情況下,這個比例越大說明CPU的工作效率越高。其中有“Automatic”和“On demand” 兩種選擇,“Automatic(自動)”表示任務周期的占空比為50%,也就是說比正常頻率低一半;“On demand(按要求)”下麵有12.5%、25%、…、87.5%等多種選擇,選擇的數值越小,則任務周期的比例越小,降頻幅度也越大。 五、溫度控製,僅靠降頻是不夠的 以降低頻率為手段來保障CPU安全,是第2代溫度監控技術的主要思想。但是這種技術也存在明顯的缺陷:當溫度超過警戒溫度時,雖然可以勉強運行,但係統整體性能卻隨著CPU頻率的下調而降低到一個很低的水平。假如一個3.8GHz的CPU隻能長期工作在2GHz的速度上,這等於讓用戶花錢買了奔馳,卻隻能當奧拓使用。如果真是這樣的話,第二代溫度監控技術就算不上成熟的技術,而隻不過是個苟且小計。 在係統性能不受損失的前提下保證CPU安全穩定運行,這才是我們希望看到的結果。事實上,影響CPU溫度的因素,除了頻率外,還有CPU供電質量和散熱效率。所以,Pentium 4溫度監控係統采取了全麵的監控措施,把頻率、電壓和散熱三個控製參數視為保障CPU安全運行的三駕馬車,如圖10。 點擊看原圖 圖10 Pentium 4cpu溫度監控方案 在供電方麵,單純采用多相供電結合大電容濾波的傳 統方法已難以滿足Pentium 4(Prescott)CPU的要求,為此,Intel製定了新的電壓調節標準VRD10,將VID(電壓識別碼)從VRM9的5位升級到6位,使電壓調整精度更高。VRD10還首次公開了Dynamic VID(動態電壓識別碼)技術,可根據CPU負荷變化隨時調節供電電壓,見縫插針地降低功耗。此外,Dynamic VID技術還能限製電流突變,避免CPU偶然燒毀的可能。有關Pentium 4CPU的最新供電規範,請參閱本刊2004年第13期“全麵掌握Prescott主板最新供電技術”一文。 在散熱方麵,Intel在Pentium 4 processor Thermal and Mechanical Design Guidelines(Pentium 4CPU熱量和構造設計指南)中要求,CPU的散熱器必須具有足夠強的散熱能力,以便及時將CPU所產生的熱量帶走。同時要求風扇能夠輸出轉速信號,以實現對風扇的監控,防止因風扇停轉而導致CPU過熱的情況發生。由於CPU所產生的熱量因工作負荷變化而有很大變化,因此也要求風扇轉速按需要自動調節,以降低不必要的能源消耗和噪音汙染。 小知識∶如何判斷風扇是否具有測速功能? 有些電腦BIOS中顯示風扇轉速為0,而實際上風扇卻在正常旋轉,通常是因為風扇沒有測速功能。風扇是否具有測速功能,可以從風扇連線的數目來區別,具有測速功能的風扇至少有三根線,通常紅色線為+12V,黑色線為地線,黃色線或白色線就是測速信號線。如果還有第四根線——一根藍色的信號線,那是用於變頻調速的脈寬調製信號PWM,如圖11。 圖11 CPU風扇插頭引腳定義 下麵以ADT7436監控芯片為核心的Pentium 4CPU溫度監控係統實例進行解剖,如圖12。先看看風扇的情況,圖中TACH是風扇電機速度信號,監控電路使用PWM(Pulse Width Modulation,脈寬調製)控製風扇電機的轉速,從PWM信號可以看出三隻風扇都是可以調速的。 圖12 溫度監控係統實例 北橋芯片是cpu與BIOS芯片進行數據交換的橋梁,監控芯片與北橋芯片三個信號中,SDA是SMBus雙向數據線,它既可以將電源電壓、CPU核心溫度、風扇轉速和環境溫度等全部監控信息發送給BIOS實現進行顯示,也可以由BIOS將來自係統的命令發送給監控芯片(前麵已經介紹過,監控芯片是可編程的ASIC,所以完全有能力處理這些來自係統的命令),實現控製參數的修改或調節功能;SCL是來自係統的時鍾信號,這是監控芯片與北橋芯片以及監控芯片與CPU之間進行同步通信的必要條件;SMBALART#在此定義為監 控芯片通過SMBus接口發往BIOS芯片的報警(ALART)信號。 監控芯片與CPU之間通過4個引腳進行聯絡:CPU將電壓識別碼VID發送給監控芯片,由它可算出CPU理論電壓值(來自電源模塊的Vcore才是CPU 的實際電壓值);D2+和D2-是CPU核心溫度信號(“D”在此表示Diode,而不是Data),當CPU溫度超過警戒溫度時,CPU通過 PROCHOT#信號通知監控芯片,而當電源模塊電流超標時,監控芯片將PROCHOT#信號置為低電平,激活CPU內的TCC,對CPU和供電模塊進行降溫。這些控製功能完全體現了第2代溫度監控技術的特點。 六、現有技術並不完善 CPU溫度監控係統在電腦中雖然毫不起眼,人們很少去注意它,但它對整個係統來卻起著十分重要的作用,像一位藏在後麵的天使,默默地守護著我們的電腦。從1993年Intel推出第一款奔騰CPU以來,十年之間主頻提升了數十倍,期間CPU技術的發展已不再是簡單的頻率提升,係統設計者必須在性能、耗電量、噪音和熱量四個因素之間進行綜合平衡。正因為如此,溫度監控技術經曆了從無到有、逐漸成熟的發展過程,從一個側麵見證了CPU的發展史。據說即將推出的Pentium 4 6XX係列CPU將集成Enhanced SpeedStep技術,CPU自身溫度監控功能得到強化。 我們也應看到,現有的監控技術水平還遠沒有達到理想的狀態,在溫度測量精度、監控係統的及時性和降溫技術的有效性等方麵還有待提高,電壓、頻率和散熱三個子係統目前處於各自為戰的狀態。未來的溫度監控技術必然朝著更精確、更有效、更智能的方向發展。

Intel PROCHOT# 訊號

PROCHOT# (處理器過熱) 訊號提供了啟用 Thermal Monitor 功能的雙向通訊。它可由 CPU 或平台觸發,讓系統可置 CPU 於降低散熱的狀態。這種設計的道理在於如果其他元件即將要過熱,只有系統的省電功能可以避免之。

[轉] EC BIOS

BIOS EC 電源管理之間的關系



我們常會聽到某些高手說“改一下COMS設置”雲雲,我們現在就來談談BIOS(CMOS)。

BIOS(Basic Input/Output System,基本輸入輸出系統)在整個系統中的地位是非常重要的,它實現了底層硬件和上層操作系統的橋梁。比如你現在從光盤拷貝一個文件到硬盤,您只需知道“復制、粘貼”的指令就行了,您不必知道它具體是如何從光盤讀取,然後如何寫入硬盤。對於操作系統來說也只需要向BIOS發出指令即可,而不必知道光盤是如何讀,硬盤是如何寫的。BIOS構建了操作系統和底層硬件的橋梁。

而我們平時說的BIOS設定僅僅是談到了其軟件的設定,比如設置啟動順序、禁用/啟用一些功能等等。但這裡有一個問題,在硬件上,BIOS是如何實現的呢?畢竟,軟件是運行在硬件平台上的吧?這裡我們不能不提的就是EC。



這是日立H8的DEMO板和其宣傳畫

WINBOND的EC

EC(Embed Controller,嵌入式控制器)是一個16位單片機,它內部本身也有一定容量的Flash來存儲EC的代碼。EC在系統中的地位絕不次於南北橋,在系統開啟的過程中,EC控制著絕大多數重要信號的時序。在筆記本中,EC是一直開著的,無論你是在開機或者是關機狀態,除非你把電池和Adapter完全卸除。

*********************此貼系 淮安網源數碼 轉載網上 歡迎轉載*********************

在關機狀態下,EC一直保持運行,並在等待用戶的開機信息。而在開機後,EC更作為鍵盤控制器,充電指示燈以及風扇等設備的控制,它甚至控制著系統的待機、休眠等狀態。主流筆記本系統中,EC在系統架構中的地位如下圖:

現在的EC有兩種架構,上圖左邊是比較傳統的,即BIOS的FLASH通過X-BUS接到EC,然後EC通過LPC接到南橋,一般這種情況下EC的代碼也是放在FLASH中的,也就是和BIOS共用一個FLASH。右邊的則是比較新的架構,EC和FLASH共同接到LPC總線上,一般它只使用EC內部的 ROM。至於LPC總線,它是INTEL當初為了取代低速落後的X-BUS而推出的總線標准。

EC上一般都含有鍵盤控制器,所以也稱KBC(Keyboard Controller)。

那EC和BIOS在系統中的工作到底有什麼牽連呢?在這裡我們先簡單的分析一下,具體的過程在本文的最後會詳細介紹。

在系統關機的時候,只有RTC部分和EC部分在運行。RTC部分維持著計算機的時鐘和CMOS設置信息,而EC則在等待用戶按開機鍵。在檢測到用戶按開機鍵後,EC會通知整個系統把電源打開(這部分在最後詳細介紹)。CPU被RESET後,會去讀BIOS內一個特定地址內的指令(其實是一個跳轉指令,這個地址是由CPU硬件設定的)。

這裡開始分兩種情況,對於上圖左邊的結構:CPU發出的這個地址通過FSB到北橋,然後通過HUB-LINK到南橋,通過LPC到EC,再通過X-BUS 一直到達BIOS。在CPU讀到所發出的地址內的指令後,執行它被RESET後的第一個指令。在這個系統中,EC起到了橋接BIOS和南橋(或者說整個系統)的作用。

對於上圖右邊的結構:在這地址南橋後,會直接通過LPC到BIOS,不需要EC的橋接。

這裡需要說明的是,對於台式機而言,一般是不需要EC的。這裡原因有很多:比如台式機本身的ATX電源就具有一定的智能功能,他已經能受操作系統控制來實現待機、休眠的狀態;其次由於筆記本的鍵盤不能直接接到PS/2接口,而必須接到EC之上;還有就是筆記本有更多的小功能,比如充電指示燈、WIFI指示燈、Fn等很多特殊的功能,而且筆記本必須支持電池的充放電等功能,而智能充放電則需要EC的支持;另外,筆記本TFT屏幕的開關時序也必須由EC控制。這些原因導致了筆記本使用EC來做內部管理的必要性。

總體來說,EC和BIOS都處於機器的最底層。EC是一個單獨的處理器,在開機前和開機過程中對整個系統起著全局的管理。而BIOS是在等EC把內部的物理環境初始化後才開始運行的。

看到這裡,我想大家也明白EC到底是呵方神聖。如果說BIOS 是底層系統的話,那EC 似乎更加底層。

在南橋上還有一個功能塊就是電源管理單元(PM,Power Management)。

一般來說,他和EC來共同配合完成。這裡包括從開機(power button)鍵按下後,啟動,待機,休眠,關機的全部功能。還包括對背光亮度,聲音等的控制等等。

至於現在Intel的Speed Step技術,也有部分功能是透過南橋來實現的(南橋發送SLP、STPCLK(sleep,Stop Clock)來實現睡眠、深睡眠等)。

這部分的設計比較簡單,只需要點到點的連接南橋和CPU即可。

http://hi.baidu.com/netyoo/blog/item/766da0c243d27b1a0ff477a3.html

gpi gpo

分享: MURMUR facebook PLURK twitter Del.icio.us

Documentation

先從documentation消化一點介紹: A "General Purpose Input/Output" (GPIO) is a flexible software-controlled digital signal。 既然是數位訊號數位訊號在computer science,那就是只有0(low)/1(high),在embedded 平台上是常用且好用的東西。SoC上會有一堆GPIO,多達一百多根,沒有被設為alternative function (註1)的都可以拿來GPIO。從schematics上看就是一個點,從CPU拉出來,可能拉到power button設為XEINT當wakeup event,或是拉到analog codec設gpi當jack detect,或是設成gpo用來表示目前系統狀態 (1: normal; 0 suspend)。

GPIO的用途大概有以下幾種:

1. alternative function: 這是特定的function,如camera,hdmi,keypad。以hdmi為例,可以接到hdmi的hpd當hot plug detect,或是cec做進階控制,不過這些gpio都會有另外的driver來控制。以keypad為例,就可以藉由gpio的high/low來 mapping按了哪個key。

2. GPI: input/output的方向是對CPU而言,因此GPI就是從外部給CPU signal,比如說EC。舉個例好了,EC控制power button,按下後,EC就將某個GPI拉high,此時CPU收到high後,trigger wakeup source,系統就resume。

3. GPO: 對照GPI,GPO就是由CPU發出來的。同樣用EC當例子,EC也控了LED。當系統進入suspend,就把某根接到EC的GPO拉low。EC收到後,就把LED變成橘色。

GPIO怎麼用,在不同的系統,不同的應用會有不同的用法。

KERNEL

GPIO相關的API都定義在

#include

sample code:

1.為避免不同的driver同時設定同一根GPIO,所以先用gpio_request看看是否有人使用。之後再用s3c_gpio_cfgpin設為GPI,然後拉NONE。

err = gpio_request(S5PV2XX_GPH3(7),"GPH3");
if (err){
printk("gpio request error : %d\n",err);
}else{
s3c_gpio_cfgpin(S5PV2XX_GPH3(7),S3C_GPIO_INPUT);
s3c_gpio_setpull(S5PV2XX_GPH3(7), S3C_GPIO_PULL_NONE);
}

2.設為GPO,並拉low (0), high (1)

gpio_direction_output(S5PV2XX_GPH0(7), 0);
gpio_direction_output(S5PV2XX_GPH0(7), 1);

3. 設為EINT wakeup source。先設為EINT後,再投為wakeup source,掛handler。

err = gpio_request(S5PV2XX_GPH3(7),"GPH3");
if (err){
printk("gpio request error : %d\n",err);
}else{
s3c_gpio_cfgpin(S5PV2XX_GPH3(7),S5PV2XX_GPH3_7_EXT_INT33_7);
s3c_gpio_setpull(S5PV2XX_GPH3(7), S3C_GPIO_PULL_NONE);
}

set_irq_type(IRQ_EINT(31), IRQF_TRIGGER_FALLING);
setup_irq(IRQ_EINT(31), &s3c_button_irq);
set_irq_wake(IRQ_EINT(31), 1);

原著:http://kezeodsnx.pixnet.net/blog/post/30257192



GPIO(General Purpose I/O),其接腳可以供使用者由程式控制自由使用,PIN 腳依現實考量可作為GPI、GPO、GPIO。

因此,GPIO 的 PIN,我們要注意的是用途、in/out、還有電位的high/low,可以透過HW線路圖幫助了解。而這些狀態,我們可以透過 register 去了解控制。

特定 GPIO 可以發 GPIO event,像是 SCI、SMI,例如我們 notebook lid 的動作,透過 LID 的線傳到 EC,EC 再送一個 GPIO EVENT 給南橋,然後處理。

電位的改變有 edge 和 level。edge 的電會一直持續,當電位改變的時候,狀態也跟著改變,例如 high 到 low 為 1,則 low 到 high 為0。
level 則是當電位在低的時候,表 low,高的時候表 high。PIN是吃不同電的,這點我們要注意。

接下來說 routing,為什麼要 routing 呢?一個南橋下接了一大堆 device,符合 PCI 規格的 device
都有 ABCD 四根 PIN 可以發中斷(如果是 single function,就只有 int A),而我們所知的 8259,扣掉master和slave連接的一根,真的能用的只有十五根,甚至有些已經在早期分配給固定的 device,根本不夠用,為了分配剩下的 IRQ,所以我們就做了 routing 的動作。也就是說,本來要透過硬體直接連接 PIN,但是因為不夠用,INTEL 多做了幾支 PIN,PCI DEVICES就連接到這些 PIN,用軟體模擬的方式分配,解決不夠用的問題,我們把這樣的機制稱為 PIRQ Route Controller。

IRQ 的值,我們可以在 PCI SPE OFFSET 3C 的地方看到,另外我們有一根 serial IRQ,透過電位形狀來分辨不同的中斷。

在作業系統驅動程式支援 IRQ 共享的狀態下,從早期的 PIC 只支援 15 IRQ,現在的 APIC 可以支援的 215 個。

Routing 的實作方面,可以去看_PRT這個 control method。

2011年6月21日 星期二

USB裝置

lsusb

/proc/bus/usb/devices

mem配置

/proc/mtrr =>記憶體配置
/proc/iomem =>配置後的詳細位置

http://blog.csdn.net/lightseed/archive/2009/07/22/4369311.aspx

抓Vid & Did

lspci | grep Broadcom ==>抓網卡的BUS,Dev值

lspci -nm | grep "dev:bus" ==>即可抓到Broadcom的vid 與did值

與pci有關

/sys/bus/pci目錄

/proc/bus/pci/devices

/usr/share/hwdata/pci.ids ==>很多

APIC C_state

http://baike.baidu.com/view/2051969.html?tp=2_01



  ACPI Processor C-state
  在G0工作狀態下,ACPI會定義系統處理器的電源狀態為活躍狀態(正在執行)或是睡眠狀態(未執行)。處理器電源狀態被設計為 C0,C1,C2,C3...Cn。C0電源狀態是活躍狀態,即CPU執行指令。C1到Cn都是處理器睡眠狀 態,即和C0狀態相比,處理器處理器消耗更少的能源並且釋放更少的熱量。當進入睡眠狀態,處理器不執行任何指令。每個睡眠狀態都有一個和省電多少對應的延遲。一般來說,進入和退出的延遲越長,這個狀態越省電。為了保持能量,OSPM在空閒時將處理器置於其中一個支援的睡眠狀態中。
  在C0狀態下,ACPI允許處理器的性能透過一個定義的節制過程發生改變,透過改變進入多種性能狀態(P-states)改變處理器的電源狀態。
  ACPI定義這樣的邏輯在每個CPU的配置,即OSPM通過轉換來切換不同的處理器電源狀 態。這個邏輯是可選擇的,在FADT表和處理器對象中有描述。FADT表中的這些字段和標誌描述了硬件的對稱性,以及處理器對象對特別的CPU時鐘邏輯包含的位置(在P_BLK寄存器塊和_CST中有描述)。
  P_LVL2和P_LVL3寄存器提供可選擇的支援,將系統處理器置於C2或者C3狀態。 P_LVL2寄存器將排序好的處理器置於C2狀態,P_LVL3講排序好的處理器置於C3狀態。C3狀態的額外支持通過總線主狀態和仲裁禁止位被提供 (PM!1_STS寄存器中的BM_STS位和PM2_CNT寄存器中的ARB_DIS位)。系統軟件通過讀取P_LVL2或者P_LVL3寄存器數據來 進入C2或者C3狀態。硬件必須精確的將處理器放在恰當的時鐘狀態,通過對相應的P_LVLx寄存器的讀操作。平台必須定義可選的接口來允許OSPM使用 _CST對象進入C-state。
  透過FADT表和P_BLK接口,處理器的電源狀態支援是對稱的;OSPM假設同一系統裡的所 有的處理器都在相同的電源狀態下。如果處理器有不對稱的電源狀態支持,BIOS將通過FADT表選擇和使用所有處理器最低的相同的電源狀態。例如,如果 CPU0支持所有的電源狀態乃至C3,但是CPU1僅支持C1,那麼OSPM將僅將空閒的處理器置於C1(CPU0將不會被置於C2和C3狀態)。注意 C1必須被支持,C2和C3是可選的。

  處理器電源狀態C1
  所有的處理器必須支援這種狀態。這種狀態的支援是透過一個本地的處理器指令(HLT或者 mwait),並且認為不需要晶片組的硬件支持。這種狀態的硬體延遲必須夠低,使得OSPM在決定是否使用該狀態時不需要考慮延遲方面的問題。除了將 處理器置於一種電源狀態,這個狀態沒有其他的軟件可見的效果。在C1狀態下,處理器可以保持系統cache裡面的內容。
  硬件可以以任何理由退出該狀態,但必須是在有中斷到達處理器的情況下。

  處理器電源狀態C2
  這種電源狀態不是必須的。如果存在,省電效果更好,它通過使用P_LVL2命令寄存器 或者由_CST提供的另一種機制來使處理器進入該狀態。這個狀態的最壞情況下的硬體延遲在FADT的表裡面有聲明,OSPM可以根據這個信息來決定什麼時候C1狀態應該被C2狀態代替。除了將處理器置於一種電源狀態,該狀態沒有其他的軟件可見效果。OSPM假設C2比C1更省電,但是退出的延遲比C1要 高。
  C2電源狀態是一種可選的ACPI時鐘狀態,需要晶片的硬件支持。時鐘邏輯由一個接口組成,可以用來被操縱使處理器精確的進入C2電源狀態。在C2電源狀態下,處理器被認為能夠保持其cache的一致性;例如,總線控制器和多處理器的活動可以發生而不破壞cache裡面的內容。
  C2狀態將處理器置於一種低功耗的狀態,圍繞多處理器和總線控制器系統做優化。當存在總線控制器或者多處理器活動時(這一條件將阻止處理器進入C3狀態),OSPM將使一個空閒狀態下的處理器群體進入C2狀態。處理器簇能夠在C2狀態下監視總線控制器或者多核CPU訪問的行為。
  硬件可以以任何理由退出該狀態,但必須是在有中斷到達處理器的情況下。

  處理器電源狀態C3
  系統對C3處理器電源狀態的支援也是可選擇的. 如果存在,這種狀態比C1和C2狀態更加節省功耗。使用P_LVL3命令寄存器或者_CST機制可以進入C3狀態,這種狀態的最壞的硬體延遲在FADT表中聲明了,OSPM可以通過這一信息來決定什麼時候需要進入C3狀態而不是C1或者C2狀態。當在C3狀態中,處理器的cache保持狀態,但是處理器沒有窺視總線控制器,或者多核CPU進行訪存。
  硬件可以以任何理由退出這種狀態,但必須是因為一個中斷投遞到了該處理器,或者當BM_RLD被設置時,一個總線控制器企圖訪存.
  OSPM負責保證cache的一致性.在單處理器環境下,這可以通過使用 PM2_CNT.ARB_DIS總線控制器仲裁寄存器來保證總線控制器的活動不會發生在C3狀態下. 在多處理器環境下,處理器的cache可以通過flush和invalidate來保持一致性.
  有兩種機制支持C3電源狀態:
  1. 在進入C3狀態之前,讓OSPM flush和invalidate cache
  2. 提供一種硬件機制,阻止控制器寫內存(只支持UP)
  在第一種情況下,OSPM將在進入C3之前flush系統的cache,由於flush系統的cache通常有很大的延遲,OSPM只對多核平台的空閒處理器支持這種情況。flush cache通過ACPI定義的一種機制來完成。
  單處理器平台提供一種硬件功能,OSPM將嘗試將平台置於一種模式,當處理器處於C3模式,這種模式組織系統總線控制器來寫內存。一旦總線控制器請求一個訪問,CPU將從C3中被喚醒,並且重新使能總線控制器訪問。
  OSPM使用BM_STS來決定要進入的電源狀態是C2還是C3.,BM_STS是一個可選的bit,表示總線控制器是活躍的。OSPM使用這一位來決定在C2和C3之間的策略。頻繁的總線控制器活動將CPU的電源狀態降到C2,沒有總線控制器活動將CPU的電源狀態提升到C3。OSPM保持BM_STS的一個變化歷史來決定CPU 電源狀態的策略.
  用在C3里的最後一個硬體特性是BM_RLD位元. 這一位元決定總線控制器的訪問是否導致Cx電源狀態的退出,如果這一位元被設置,一旦有總線控制器訪問,Cx將退出。如果該位被覆位為零,總線控制器的訪問將不會導致電源狀態的退出。在C3狀態中,總線控制器的申請需要CPU轉換回C0狀態,但是在C2狀態中,這樣的轉換將不是必須的。在C3狀態下,OSPM可以設置這一位,在C1或C2狀態下,可以清除該位。

2011年6月16日 星期四

ASR(HP)

ASR(Automatic Server Recovery)是一個硬件部件,它能檢查一些嚴重的服務器關鍵事件和一些重要零部件是否異常(如內存錯誤、磁盤故障、溫度過高、電源掉電、風扇故障、網卡異常等) ;HP asm驅動與操作系統相關,它負責檢測軟故障(如係統掛起,程序hang等),ASR和ASM時時保持聯繫,缺少任何一方那麼ASR和ASM都失效。 ASR和ASM類似於服務器的維護人員,一個負責硬件層,一個負責軟件層,同時他們之間時時保持聯繫,當出現問題時,共同協商採取某種動作,如重啟機器等。
ASR機制可以通過BIOS設置成開或關,在開啟狀態下,如果ASR沒有檢測到軟件層的ASM驅動,那麼ASR臨時“自殘”(相當於關閉自己)。 ASR是HP公司發明的一個先進的硬件故障檢測部件,目前已經集成在HP DL 380 及以上版本的機器中,HP官方強烈建議用戶開啟該功能並相應裝上ASM驅動(採用smartstart部署系統或安裝PSP包會自動安裝該驅動),否則機器可能在故障存在的情況下繼續跑應用,這時數據安全難以保障。從上圖中還可以看出ASM是“集成”在軟件層的,它在用戶空間安插一個探針hpasmd,hpasmd一個主要功能就是對ASR中計數器週期性地賦一個正數值,ASR則周期性地遞減這個計數器,如果該計數器大於0表明hpasmd還“活著”,hpasmd活著又意味著軟件層還活著,如果該計數器在10分鐘內(默認值)保值非正,那麼ASR就直接給CPU發reset信號,因為此時ASR認為操作系統被掛起了!我們可以做這個實驗:把hpasmd進程直接殺掉,一會兒機器就直接重啟了。
ASM在用戶空間安插hpasmd這個探針的機制,有點類似於我們最近提出的基於應用層面的監控方法,用戶空間的進程全部hang住了,就算操作系統內核還“活著”又有什麼用呢?所以就直接reset系統算了。因此hpasmd進程的穩健性就顯得非常重要,因為它就是整個系統“命懸一線”中的那根“線”。
ASR默認情況下是開啟的,如果用戶沒有在操作系統中安裝相應的ASM驅動,那麼ASR機制就失效。
官方說明如下:
ASR 使用
一、ASR簡介
ASR (Automatic ServerRestart)減少由於系統崩潰或掛起產生的影響。它的實現要求軟件與硬
件的結合。當ASR為允許狀態時,軟件定期的通知硬件系統為正常運行狀態,當系統崩潰後,硬件不再得到信息並且會在達到設置時間自動重新啟動。注意系統必須被設置為無須用戶介入情況下重啟。
不是所有的系統掛起會導致重啟,例如:當所有用戶的要求被禁止(表現為系統好像掛起),然而NOS還在運行,這樣的情況下ASR不會重啟系統。
HP的服務器LC LF LS LH 及其後的機型硬件上都支持ASR。 ASR功能的實現要求硬件支持外還
須安裝ASR軟件。所有安裝了HP遠程助理軟件的系統都支持ASR。 ASR可以捕捉系統掛起時的最後一屏,其中包含重要故障信息,並且記錄系統重啟事件以備後期查看。
二、ASR測試
系統環境:
Winnt操作系統,
安裝Toptools軟件,
控制面板的服務中ASRSrv 是啟動狀態
使用:
1 找到 ASRuser 命令:
如果是自動安裝的操作系統, 路徑為c:\Winnt40\HPserver\ASRuser
如果是手動安裝的操作系統,該文件在Toptools 文件夾內
2 執行ASRuser /t 可以設置時間:
第一項為自動重啟時間
第二項為輪循檢測系統時間
(可以通過ASRuser/o 查看設置)
現象:
當系統鎖死後,ASR會按照設置的輪循時間檢測系統狀態,如果到達設定時間後
系統仍未激活, 則自動關機重新啟動。

2011年6月14日 星期二

C state & P state

C state
代表 CPU 在 IDLE 的狀態
SANTA ROSA平台下分為 C0 C1 C2 C3
其中 C3 為最閒 C0 為有點小忙的狀態
INTEL 以此為參考狀態提供給 OS
如果真的太閒 OS 會將 CPU 降頻以達到省電的目的
當然也包含多核心會停掉其中幾個不忙的
就像老闆在看員工一樣,長時間沒事作的,當然是停掉他所有的支出囉


P state
代表 CPU 在 OPERATION 的狀態
如果說 C state 的狀態下無法滿足 OS 目前負載的工作量
OS 就會進入 P state
原本 C state 是省電的狀態,可能會降頻率,另一個方式就是降電壓
C0 轉換到 P0 時可能是將頻率拉高到某個程度
如果還是無法負荷就是進入 P1
P1 中會將電壓拉高到全速工作的狀態
此時 CPU 就會以全速的方式將工作完成
當然這也需要 OS 作判斷

2011年6月13日 星期一

ACPI和APIC有什麽關系?[轉貼]

很多人問道了什麽ACPI,什麽是APIC,他們有没有關系?名字這麽相近。下面給出我對其的一些理解,具體的解釋可以查看内核文檔庫的内核參數文件:
/usr/src/`uname -r`/Documents/kernel-parameters.txt

ACPI就是Advanced Configuration and Power Interface的縮寫,意思是“高級配置與電源接口”。這是英特爾、微軟和東芝共同開發的一種電源管理標准。
ACPI可實現以下功能:   
1、用户可以使外設在指定時間開關;   
2、使用筆記本電腦的用户可以指定計算機在低電壓的情况下進入低功耗狀態,以保證重要的應用程序運行;   
3、操作系統可以在應用程序對時間要求不高的情况下降低時鐘頻率;
4、操作系統可以根據外設和主板的具體需求為它分配能源;
5、在無人使用計算機時可以使計算機進入休眠狀態,但保證一些通信設備打開;
6、即插即用設備在插入時能够由ACPI來控制。
不 過,ACPI和其他的電源管理方式一様,要想享受到上面這些功能,必須要有軟件和硬件的支持。在軟件方面,Windows 98及其後續産品和Windows 2000都對ACPI給予了全面的支持;而Linux的内核目前對此支持得并不是太理想。硬件方面比較麻煩,除了要求主板、顯卡和網卡等外設要支持 ACPI外,還需要機箱電源的配合。電源在提供5伏電壓給主板的同時,還必須使電流穩定在720毫安以上才可以,這様它才能够實現電腦的“睡眠”和“唤醒 ”。
ACPI共有六種狀態,分別是S0到S5,它們代表的含義分別是:
S0–實際上這就是我們平常的工作狀態,所有設備全開,功耗一般會超過80W;
S1–也稱為POS(Power on Suspend),這時除了通過CPU時鐘控制器將CPU關閉之外,其他的部件仍然正常工作,這時的功耗一般在30W以下;(其實有些CPU降温軟件就是利用這種工作原理)
S2–這時CPU處於停止運作狀態,總線時鐘(Bus Clock)也被關閉,但其餘的設備仍然運轉;
S3–這就是我們熟悉的STR(Suspend to RAM),這時的功耗不超過10W;
S4–也稱為STD(Suspend to Disk),這時系統主電源關閉,但是硬碟仍然帶電並可以被唤醒 再進入系統時需重跑BIOS,如同WindowsXP的睡眠模式行為;
S5–這種狀態是最乾脆的,就是連電源在内的所有設備全部關閉,功耗為0。
我 們最常用到的是S3狀態,即Suspend to RAM(載入到記憶體)狀態,簡稱STR。顧名思義,STR就是把系統進入STR前的工作狀態數據都存放到記憶體中去。在STR狀態下,電源仍然繼續為記 憶體等 最必要的設備供電,以確保數據不丢失,而其他設備均處於關閉狀態,系統的耗電量極低。一旦我們按下Power按鈕(主機電源開關),系統就被唤醒,馬上從 内存中讀取數據並恢復到STR之前的工作狀態。記憶體的讀寫速度極快,因此我們感到進入和離開STR狀態所花費的時間不過是幾秒鐘而已;而S4狀態,即 STD(載入到硬盤)與STR的原理是完全一様的,只不過數據是保存在硬盤中。由於硬盤的讀寫速度比内存要慢得多,因此用起來也就没有STR那麽快了。 STD的優點是只通過軟件就能實現,比如Windows 2000就能在不支持STR的硬件上實現STD。
之前的電源管理是APM(Advanced Power Management),那麽ACPI和APM相比有什麽區別呢?

2、ACPI與APM比較
APM 1.0&1.1:由BIOS執行電源管理;
APM 1.2:操作系統定義電源管理時間,由BIOS負責執行;
ACPI:BIOS收集硬件信息,定義電源管理方案;由操作系統負責執行。
APM是一種軟件解决方案,因此是與操作系統有關的, 而ACPI是工業標准,包括了軟件和硬件方面的規範。

APIC (高級可編程中斷控制器)對計算機來講有兩個作用
一是管理IRQ的分配,可以把傳統的16個IRQ擴展到24個(傳統的管理方式叫PIC),以適應更多的設備。
二是管理多CPU。由於Nf2主板并不支持多CPU,所以,APIC關閉直接的影響是减少了可用的IRQ。
不過,如果板卡不是非常多的話,關閉 APIC對系統是没有什麽影響的。
要實現SMP功能,我們使用的CPU必須具備以下要求:
CPU 内部必須内置APIC單元。Intel 多處理規範的核心就是高級可編程中斷控制器(Advanced Programmable Interrupt Controllers–APICs)的使用。CPU通過彼此發送中斷來完成它們之間的通信。通過給中斷附加動作(actions),不同的CPU可以在 某種程度上彼此進行控制。每個CPU有自己的APIC(成為那個CPU的本地APIC),並且還有一個I/O APIC來處理由I/O設備引起的中斷,這個I/O APIC是安裝在主板上的,但每個CPU上的APIC則不可或缺,否則將無法處理多CPU之間的中斷協調。
APIC可能遇到的問題,很多這類問題可以通過BIOS更新來解决。
下面的是通過更改HAL類型來解决
CPU實際運行頻率與BIOS設定頻率不符
NF2的用户大约有10%的會出現CPU實際運行頻率與BIOS設定頻率不符的問題。我們稱之為“頻率不對”。
這種現象帶來的直接後果就是在測試3dmark或跑3D游戲的時候,會感覺不流暢,也稱之為“頓”。
一般在更改BIOS設置後、更新驅動後重啓時,用測試軟件如Aida32、MBM5等可以看到CPU的運行頻率和你在BIOS裏設置得不一様,而且差距 很大。這個時候,用super pi測試CPU速度,會比平常花費時間長好幾秒,用3dmark跑測試,會比平常低幾百分甚至上千分。在3dmark中看到的CPU頻率,也與BIOS設 定不符合。
如果出現這種情况,則屬於我們所討論的“頻率不對”的問題。
不過,不是所有的3D游戲“頓”都是這個原因。判斷的方法是:如果你只有個別游戲“頓”,或者用上述軟件測試頻率正確,就不是此問題。
如果判斷確實屬此問題,解决的方法也很簡單,經過網友討論,只要關閉APIC功能即可。(注意,是APIC,不是ACPI)。

有一些服務器(比如IBM的,HP的),安裝LINUX時,會給出内核的錯誤,導致無法安裝,這個時候可以在安裝的時候輸入linux acpi=off noapic應該是安裝上的。

資料來源:
http://mlsx.xplore.cn/2006/01/12/what-difference-between-acpi-and-apic.html

非易失性随机访问存储器概述

 NVRAM 非易失性随机访问存储器 (Non-Volatile Random Access Memory),是指断电后仍能保持数据的一种RAM。
如果通俗地解释非易失性存储器,那就是指断电之后,所存储的数据不丢失的随机访问存储器。   之所以加如此的定语,是因为:   1.与此对应的随机访问存储器(Random Access Memory,RAM)包含SRAM和DRAM(其又分为SDRAM,DDR SDRAM,DDR2 SDRAM ,RDRAM,Direct RDRAM),断电之后信息就丢失了。其中,DRAM又分为SDRAM(由6个晶体管组成),DDR SDRAM(有一个晶体管组成),DDR2 SDRAM(利用电平脉冲的上升沿和下降沿传输数据,使得数据传输频率相对于普通的DDR SDRAM加倍) ,和采用RSL技术的RDRAM,Direct RDRAM),   2.NVRAM可以随机访问。因此有些解释中,说Flash是属于NVRAM,是不准确的。因 为从严格意义上来说,Flash分有两种:nand flash和nor flash。其中的nor属于是可以随机访问的,而nand flash不是真正的随机访问,属于顺序访问(serial access)。

编辑本段目前常见的NVRAM

1.带有备用电源的SRAM   2.借助NVM(比如E2PROM)存储SRAM的信息并恢复来实现非易失性。   对于我们身边处处可见的U盘,数码相机、可拍照手机、PDA、以及其中的存储卡,如CFSD等等,内部多数是采用的Nand Flash。   而Nor Flash 对用于嵌入式中少量系统等信息的存储。   对于Nand Flash 和Nor Flash的区别和各自特点,可以参考Linux MTD 官网 http://www.linux-mtd.infradead.org/doc/nand.html 和 NAND和NOR的比较   手机上所谓的NVRAM是一套机制,它的数据部分:default存在flash的code 区,NARAM文件存在文件系统区域(系统盘)phone的电话本数据是以NVRAM文件的形式保存在文件系统区域的(系统盘),SIM卡的电话本就在 SIM卡上了,T卡是扩展的flash,都是文件系统区   http://hi.baidu.com/serial_story/blog/item/c669991efe491e1b403417e5.html

编辑本段Cisco Router启动时的关键值就存储在NVRAM

首先了解   0x2102 从nvram加载配置文件   0x2142 不从nvram加载配置文件   路由器的寄存器值   寄存器值:影响路由器启动过程的一个值,保存在NVRAM中   寄存器存储的值的作用:   0x2102 正常,从flash中加载IOS,并且从NVRAM中读取配置文件   0x2142 从flash中加载IOS,但不从NVRAM中读取保存的配置   查看寄存器值:   show version   修改寄存器值:   config-register 0x2102

所知道的EC====>KBSMI&KBSCI

http://blog.csdn.net/hgf1011/archive/2009/04/13/4069464.aspx

這篇文章我一直覺得很受用,從EC為出發點來了解,跟大家分享。
以下為轉帖。
=====================================================

1.Introduction
SCI是指系統控制中斷, 為支援ACPI的作業系統提供系統管理,客制化功能。
SMI是指系統管理中斷,由設備或者軟體需要呼叫SMM功能產生,使CPU進入SMM mode。

基本上進入ACPI mode以後SMI就很少用到了,對於EC來講SCI和SMI則是互斥的,一旦進入ACPI mode EC 就只會發SCI。通常EC會有兩根pin KBSMI&KBSCI連接到SB,EC可以配置這兩根pin的屬性,決定使用何種方式產生中斷,比如level trig,edge trig,pulse trig,我做的案子常常配置成64us低電平的pulse trig。

2.KBSMI#
其實EC很少用到SMI,除了少數測試項比如DOS下 Fn+F2下切屏等。不過KBSMI#的實現原理還是很有趣的。它的原理是這樣的:EC將一根pin接在SB上,而SB的GPIO有些具有multi function,可以配置成具SMI/SCI的功能。
BIOS code在初始化時將這個資訊宣告給SMI Table。一旦EC發了一個SMI,EC接在SB上面這根pin的status就會被置位,SB檢測到以後通過拉接在cpu上SMI pin產生一個SMI,cpu切換到SMM mode然後就會通過之前宣告的那些pin的status identify smiOwner,這時就可以認出是EC的SMI,隨後通過下command給EC讀取SMI event id,並通過該id去調用相關的method。

3.KBSCI#
 Q_EVENT
所謂Q_EVENT指的是OS收到EC的SCI後,OS通過發84hcommand 給EC讀取EC Ram中的值,這個值被稱為Q_EVENT id。這也是Q_EVENT得名的原因(Q是Query的縮寫,而84h就是Query Embedded Controller)。然後OS中的asl code會根據該id去調用_QXX()如下面的code所示,這裡的XX指的就是EVENT id。那麼EC什麼時候會發Q_EVENT呢?當AC、Battery in/out,LID open/close ...
// AC Status Changed
Method(_Q83)
{
Store(0x83, DBG8)
Store(0x00, Local0)
Store(POWS, Local0)
If(LEqual(Local0,1))
{
Store(1,\_SB.PCI0.SBRG.EC.ADP1.ACP)
}
else
{
Store(0,\_SB.PCI0.SBRG.EC.ADP1.ACP)
}
Notify(\_SB.PCI0.SBRG.EC.ADP1,0x80)
Notify(\_PR.P001,0x80)
Notify(\_PR.P002,0x80)
}
那麼又有一個問題,那就是OS怎麼知道這個SCI是EC的呢?請看下面的asl code你就會明白了
Device(EC)
{
 Name(_HID,EISAID("PNP0C09"))
 Name(_GPE,0x06)    // KB_SCI
 ...
}
在Device EC裡面宣告了EC的KB_SCI接在了SB的哪個pin上,這樣OS識別EC SCI的過程就和前面的SMI異曲同工了。



最後一個問題OS如何檢測到SCI產生了呢?前面SMI已經說過SB有一根SMI pin接到CPU,可以讓CPU產生SMI,可是SCI並沒有這樣的pin,那麼CPU怎麼知道SCI產生的呢?我想到了兩種可能:
a.  OS polling GPE register status bit。
b.  SCI通過8259或者APIC,產生IRQ。
Chipset spec印證了我的想法,SCI可以配置成通過8259/APIC的方式產生中斷,而且中斷向量也是可配置的如下圖1所示:


BIOS在設置好該寄存器後會將SCI INT資訊存入ACPI FADT中,這樣OS就可以通過FADT獲得SCI使用的中斷號碼,從而能夠在SCI產生時處理該中斷,這部分請參考ACPI SPEC FADT部分。下圖2是使用ACPIVIEW看到我的工作機的FADT dump,如圖2所示我的機器ACPI使用APIC INT 9。


GPE
GPE其實是屬於BIOS的範疇了(當然Q_EVENT也是GPE的一種),其他部分跟EC並沒有多少關係,不過既然講了SCI,就順便提提GPE。
所謂GPE指的是 ACPI定義的一個general-purpose event namespace 與SB中的GP registers相對應。GPE register 包括GPE_STS和GPE_EN兩個部分對應該GPIO的status和enable
Event的觸發分Level和edge兩種,分別對應ACPI Method _LXX(),_EXX(),
XX分別代表具體的GPIO pin。
所以當系統在S0一旦相關的GPIO status有變化並且SCI enable,那麼就觸發SCI,於是形如_LXX(),_EXX(),就會被調用了。

BIg real mode

BIg real mode

http://www.programmer-club.com/pc2020v5/forum/showSameTitleN.asp?board_pc2020=assembly&id=5188&keyword=

我 查了討論區有關Big Mode/Flat Mode/Protected Mode/Big Real Mode/Flat Memort Model 以及相關的Intel 說明,但是對於這個Mode 還是不太懂, 我看到的資料都是說 protect mode 跟 Big Mode (我統一這個說法以免混淆)不一樣,但是不一樣的地方在哪裡?先說說我目前了解的地方:

80386 開始的保護模式PM提出了虛擬記憶體VM的概念(80286就有,只是386開始落實),VM最主要的概念是讓OS以為有很多用不完的記憶體,為了達成這 個理想提出了利用分段(Segment)及分頁的方式,原本真實模式RM下是利用段暫存器*10h+偏移位址方式來表示出記憶體位址,而這個方式可以看作 是 base address + limit 的方式,簡單說就是原本方式 F000:FFFF=F000*10h + FFFF = FFFFF 可以看作是Base address=F0000 他的區段大小的限制在FFFF(64k),所以F0000~FFFFF是他的區段。

除 了這個觀念外另一個觀念就是RM的時候因為暫存器16 bit 所以沒辦法定址到全部的位址因此才使用上述的這種方式,但是到了386年代暫存器已經32 bit,所以一般暫存器就可以存取4G的位址而不需要用到"段暫存器"。 因為可以存取到4G而不需要段暫存器,所以在80386的保護模式的虛擬記憶體的分段概念中段暫存器就不是拿來當作存放Base Address用途,而是拿來當段描述的選擇器Segment Selector(或稱之為Index也可以看作是Offset)。

另 外就是保護模式要保護什麼?他就是要保護程式彼此之間不會去存取到對方的程式段或是資料段以免發生問題,因此在386 PM模式裡面他去描述了像是一些存取權限/優先權(Ring 0~3)...等的東西,因為要描述這些東西所以他使用了64 bit的資料結構去描述 base address+Limit+優先權+存取權限,簡單說就是每一筆的描述都是64 bit(也有人說8 Bytes)大家稱這個描述叫做段描述符(Segment Descriptor),因為有很多筆所以程式設計師必須在實際的記憶體區塊去分配一個陣列放這些描述的資料,而這個陣列是大家都看得到的 (PUBLIC),所以稱之為GDT(Gobal Descriptor Table),而前面說的段暫存器就是用來選這個陣列裡面的那一筆資料,那另外一個問題出現了,程式設計師分配了一會記憶體區塊來描述這些段的資訊那這個 Table到底在哪裡? 因此386加入了一個暫存器叫做GDTR指向GDT的入口(GDT的Base Address),你可以利用LGDT指令把GDTR指向GDT... 因為保護所以每個任務都會有屬於自己的記憶體區段,所以每個任務也會有各自的段描述,稱之為LDT(Local Descriptor Table),LDT也是陣列,裡面也有段描述...為了統一處理,所以GDT裡面除了段描述SD0/SD1...SD N 之外還有描述LDT 0/LDT1...LDT N在哪個記憶體區段的資料(這邊要特別強調,GDT分配到一塊記憶體的區段,LDT也是,但是放在GDT裡面的LDT 0只是用來指向LDT是放那一塊記憶體的描述),那他們也設計了一個暫存器叫做LDTR來當作Index(選GDT陣列中的LDT描述),那至於你要選哪 一個Table就是看段暫存器的設定,段暫存器 bit 2 =0 就是選GDT,=1就是LDT, bit 1:0=RPL ,其他的bit15:3才是當作Index。

GDT (假設放在00028000)
SD0
SD1
SD2
LDT0 (假設放在0003A000)
LDT0 ------------------------------> SD0
LDT1 SD1
LDT2 SD2

總結 :
1.RM 因為暫存器只有16 bit 所以使用Segment*10h+Offset方式,但是這個方式可看作Base Address+Limit概念

2.PM 模式提出VM概念:利用Segment 跟 Paging,他有3種定址方式: 邏輯位址(Logical Address)、線性位址(Linear Address)、和實體位址(Physical Address)。
a.所謂的「實體位址」,就是指系統的記憶體的真正位址,它的範圍由 00000000H 到 FFFFFFFFH,共有 4GB。
b.在沒有使用分頁(Paging)功能的時候,線性位址是直接對映到實體位址的,也就是說,線性位址就等同於實體位址。不過,在開啟分頁分能之後,一個線性位址可能沒有相對映的實體位址(因為它所對映的記憶體可能被 swap 到硬碟裡了)。
c.邏輯位址則和實際模式類似,仍然是 segment:offset 的形式,只不過現在 offset 的大小改成 32 bit 而已,而 segment 仍然是 16 bit。另外就是段暫存器當作是Segment Selector。

3.段暫存器用來當Index 是bit 15:3 所以是2^13 ,給ㄧ個段描述最大可以4G,所以看作是有2^13 * 4G這樣多的記憶體可以用

4.分段方式可以分成兩種:
a. Flat segmentation model : 所有區段對應整個32 bit實體空間,最少要兩個區段,1個程式段,1個資料段,描述在GDT,當Base=0 Limit=4G時可以存取整個實體位址
b.Multi-Segmentation Model:每個程式有自己的LDT,LDT由Segment Selector組成

5.澄清專有名詞: Big Mode / Flat Mode : BIOS 用來存取4G方式 (旗標BIOS Inside pp.3-17)

Flat Memory Model :應該指的是Flat segmentation model (Paper Author: Steve Gorman Title: Programming with the Intel architecture in the flat memory model)

Virtual Protected Mode/ Protected Mode : 虛擬記憶體概念的保護模式

Flat segmentation model : 分段方式的其中一種 (Assembly Language for Intel-Based Computer 4th edition,KIP R.IRVINE,全華科技)

問題:
1.一般我們看到的 xxxx:zzzzzzzzh 表示方式是指Segment Selecotr: Offset 嗎?

2.DOS底下也可以用平坦區段模式(Flat Segmentation Mode)存取4G,那他跟Big Mode有什麼不同?

3.PM模式中的分段方式裡面的平坦區段模式就可以存取4G實體位址,那麼跟Big Mode有什麼不同

4.進入保護模式PM方式是設定GDT/LDT,設定CR0,而Big Mode也是一模一樣的方式,他們有什麼不一樣?

5.Big Mode為什麼設定好Flat Segmentation Mode後要從PM切換回去RM,並且開啟A20 ?

6.RM底下開啟A20不是只能存取1M + 64k - 16 嗎? 為什麼他切進去PM設定好之後切換回來就可以存取4G ?

7.當Big Mode切換回RM之後定址方式是 Segment:Offset 還是 0: Offset 還是 Segment Selector:Offset(這個應該不可能因為RM底下沒有GDT)???

A:
在 Real Mode 下,改變 Selector 只會更新 Base Address。唯有在 Far Jump 時,CS 的 Limit 會被重載入!至於 A20 ,是由 Chipset 或 KBC 來控制 CPU 的 A20 Mask,所以無關 PM 或 RM。如果 A20 未開,就如同 CPU 的 A20 address line 不會動作一樣,那麼你可以想像會有什麼結果了!不過現在 AMD K8 似乎已沒有 A20M pin,這個古老的東西存在的目的只在相容性而已,說不定未來 Intel 也會拿掉這個東西!(286 我並不了解,也不知是否有特殊限制)
Hidden=Segment Base Address+Segment Limit+ Attri+...
分成固定與非固定兩部份: Segment Base Address是非固定,其他為固定

Real Mode底下
MOV AX,F000
MOV DS,AX ; 此時非固定部分會更新成,目前DS*10

PM Mode底下
MOV BX,Selector
MOV DS,BX ;此時固定與非固定部分都會更新

為什麼要做Short JMP?
因 為 CPU 不只一條指令管線(instruction pipeline), 所以會預先提取指令(instruction fetching)並解碼(decoding), 但同樣的指令在 Protected Mode 和 Real Mode 中的解碼結果是不同的, 所以要將指令管線中在 Real Mode 解碼的部分清掉, 怎麼清呢? 執行會產生"程序控制權轉移"的指令即可, 如 jmp,jxx,call,ret,int,iret 等指令.

每個段都有自己的隱含暫存器,CPU定址是利用隱含暫存器的Base Addr + Offset 而不是Seg*10h+Offset (80286以後就不是這樣定址了) 在80386裡面隱含暫存器是64 bit,它分成幾部份:段暫存器Base Addr+ 段暫存器Limit+段暫存器屬性

有人說A20打開就可以存取0~4G了,這是對 的嗎? 這個問題要考慮CPU定址方式跟位址線。當A20=0,就算你能定址0~4G,你也只能存取偶數位址。當A20=1 ,而CPU的隱含暫存器如果沒有設定成【Base Addr】=00000000,【Limit】跟【段暫存器屬性】改變成FFFFF * 4K=4GB你也沒辦法定址0~4G,所以答案告訴我們都是CPU在決定一切,A20=1只是必要的一個過程而不是打開就可以存取0~4G。

而 這個答案也告訴我們只要你有辦法設定【隱含暫存器】不管那個CPU模式你都能去存取0~4G。真實模式下沒辦法設定【隱含暫存器】,唯有進入保護模式才能 設定Big Real Mode 這個模式指的就是改變CPU狀態讓我們可以在真實模式底下存取0~4G的記憶體位址。

這方式步驟就是在真實模式設定好GDT,然後進入保護模式中設定好【隱含暫存器】,接著切換回去真實模式並且開啟A20。

1.找ㄧ塊記憶體區塊放置GDT Table(我們要改變的段描述也在那裡面,設定Limit=4G)
2.載入段描述表(用LGDT指令會將GDT位址放入, GDTR暫存器)
3.設定控制暫存器CR0讓CPU進入保護模式
4. 做一個Short JMP,清空CPU Prefetch,因為 CPU 不只一條指令管線(instruction pipeline) , 所以會預先提取指令(instruction fetching)並解碼(decoding) ,但同樣的指令在 Protected Mode 和 Real Mode 中的解碼結果是不同的,所以要將指令管線中在 Real Mode 解碼的部分清掉,怎麼清呢? 執行會產生"程序控制權轉移"的指令即可, 如 jmp,jxx,call,ret,int,iret 等指令。
5.執行CLI指令關閉所有中斷請求以免錯誤(保護模式內段暫存器是Selector,如呼叫中斷會發生錯誤,有解決方式但超過討論範圍)
6.載入索引給你將來會使用到的段暫存器,讓CPU能夠自己去將段描述載入【隱含暫存器】
7.設定CR0,關閉保護模式,回保護模式(因為目的已經達到)
8.做一個FAR JMP ,清空CPU Prefetch ,並且給定正確的CS:IP
9.真實模式下開啟A20 位址線。

;;In Real Mode:;設定一些相關設定
LGDT ;;把GDT 放到LDTR
EnablePMMode ;;改變CR0進入保護模式
JMP Flush1 ;;丟棄已經存於CPU預先存取佇列中的指令
Flush1: ;; 這裡以經是保護模式MOV DS,BX ;;
裝Selector,給你要用的段暫存器DS/ES/FS…等
........
........
DisablePMMode ;; 改變CR0關閉保護模式
DB 0EAH ;;Far JMP回Real Mode,
DW OFFSET Flush2 ;;你程式碼的段內偏移位址
DW F000H ; ;你程式碼的段位址

Flush2: ;; 這裡以經是真實模式

XOR AX,AX
MOV DS,AX ;;DS=0,以後就可以用DS:OFFSET方式存取4G
.......

EnableA20 ;;開啟A20, by Harrison 2006.09.27


====================================================================
我 想請問一下你所謂的"RESET CPU"是指HW RESET嗎? 因為我最近在看BOOTBLOCK跟POST 的Code,理論上CPU Reset 一定是去FFFF_FFF0讀第一行指令,然後看讀取的第一條指令要做什麼,但是我最近發現第一條指令是Short JMP 到BootBlock,而不是Far JMP(Far JMP才會跳到1M的地方,因為會改變CS跟IP,造成隱含暫存器的Base Addr=F0000h),所以我覺得很奇怪,感覺BIOS從開機後執行都是在A20 Enable且存取的都是4G那邊的位址,一直到了他去初始化一些HW後才回歸到1M那邊,另外A20 Disable 跟Warm Boot真的有影響嗎?
據我所知,如果你是Phoenix BIOS,你去看第一條指令,他是跳到BoolBlock執行,你可以用反組譯工具或是用Debug工具去FFFF_FFF0看,他是E9 XX XX, 'E9'是Short Jmp

FFFF_FFF0 CPU RESET來這邊讀,如果有裝BootBlock,他會做short jmp 'E9' to bookblock(真正放BootBlock程式碼的地方)

FFFE_XXXX 假設這邊是實際上 BootBlock 進入點的地方,這邊會去判斷一些事情
如果F000:FFF0 是E9,代表沒有Shadow 過
如果F000:FFF0 是EA,代表已經Shadow 過,也就可能是Warm Boot

F000:FFF0 CPU RESET一定不會讀這邊,不管是Warm Boot還是Cold Boot(因為CPU RESET一定是去FFFF_FFF0,去4G而不是1M,雖然都是同一個地方同資料,但是對CPU來說不一樣),如果已經從FFFF_FFF0 JMP到某個地方去開始執行BootBlock後,再來讀取這邊的資料的話,你會讀到跟FFFF_FFF0一樣的資料,也就是E9 xx xx,另外當POST過程中如果Shadow 相容性的資料後,這邊的資料會變成 EA F000:E05B,簡單說就是:
Shadow 前: F000:FFF0讀到的資料跟FFFF_FFF0一樣, E9 XX XX
Shadow 後: F000:FFF0讀到的資料會變成EA F000:E05B

F000:E05B BIOS Entry Point (BIOS POST Test),這邊決定的是Cold Boot或是Warm Boot(註:以BIOS觀點,因為HW的Cold/Warm Boot跟BIOS觀點不同)
P.S CPU RESET後的狀態

CS:F000 <--注意,80286之後不用CS定址
EIP:0000FFF0 <--16 bit只能看到FFF0,因為Segment Limit=64k
隱含暫存器的Base Addr=FFFF0000 <--真正被拿來定址的暫存器
隱含暫存器的Segment Limit=64k

所以第一條指令定址的方式是 Base Addr+IP=FFFF000+FFF0=FFFFFFF0 <--4G的地方

如 果第一條指令是FAR JMP,則會改變CS跟IP(也就是隱含暫存器內的Base Addr會重新計算,計算方式是 Base Addr=目前CS*10h=F0000h, IP=跳躍的位址, 所以會定址方式 Base Addr+IP也就是F0000+IP,可以看做F000:IP <--1M的地方)

如果第一條指令是Short JMP,理論上Base Addr不會改變(因為Short JMP只會改變IP不會改變CS,因此Base Addr不會重新計算),所以是FFFF0000+IP <--保持這個狀態直到做了FAR JMP/FAR CALL才會改變,也就是我們說的跳到1M的地方.

因此有人說CPU讀取的第一條指令一定是FAR JMP,做了FAR JMP後就會跳到1M的地方執行,這種說法沒錯,但是這種情況是沒有BootBlock下才這樣。

忘記說明一下最近K完SPEC後發現底下的表示法的不同,這是南北橋SPEC裡面的表示法:FFFF_FFF0 <--代表4G那邊的位址,以前我一直以為FFFF:FFF0 ,我很豬頭吧! 呵呵!

跟FFFFFFF0 表示方式一樣

F000:FFF0 <--代表F000*10h + FFF0

我自己說明一下免得大家搞糊塗我所表示的地方...^^

ACPI C state

http://baike.baidu.com/view/2051969.html?tp=2_01



ACPI Processor C-state
在G0工作狀態下,ACPI會定義系統處理器的電源狀態為活躍狀態(正在執行)或是睡眠狀態(未執行)。處理器電源狀態被設計為 C0,C1,C2,C3...Cn。C0電源狀態是活躍狀態,即CPU執行指令。C1到Cn都是處理器睡眠狀 態,即和C0狀態相比,處理器處理器消耗更少的能源並且釋放更少的熱量。當進入睡眠狀態,處理器不執行任何指令。每個睡眠狀態都有一個和省電多少對應的延 遲。一般來說,進入和退出的延遲越長,這個狀態越省電。為了保持能量,OSPM在空閒時將處理器置於其中一個支援的睡眠狀態中。
在C0狀態下,ACPI允許處理器的性能透過一個定義的節制過程發生改變,透過改變進入多種性能狀態(P-states)改變處理器的電源狀態。
ACPI定義這樣的邏輯在每個CPU的配置,即OSPM通過轉換來切換不同的處理器電源狀 態。這個邏輯是可選擇的,在FADT表和處理器對象中有描述。FADT表中的這些字段和標誌描述了硬件的對稱性,以及處理器對象對特別的CPU時鐘邏輯包含的位置(在P_BLK寄存器塊和_CST中有描述)。
P_LVL2和P_LVL3寄存器提供可選擇的支援,將系統處理器置於C2或者C3狀態。 P_LVL2寄存器將排序好的處理器置於C2狀態,P_LVL3講排序好的處理器置於C3狀態。C3狀態的額外支持通過總線主狀態和仲裁禁止位被提供 (PM!1_STS寄存器中的BM_STS位和PM2_CNT寄存器中的ARB_DIS位)。系統軟件通過讀取P_LVL2或者P_LVL3寄存器數據來 進入C2或者C3狀態。硬件必須精確的將處理器放在恰當的時鐘狀態,通過對相應的P_LVLx寄存器的讀操作。平台必須定義可選的接口來允許OSPM使用 _CST對象進入C-state。
透過FADT表和P_BLK接口,處理器的電源狀態支援是對稱的;OSPM假設同一系統裡的所 有的處理器都在相同的電源狀態下。如果處理器有不對稱的電源狀態支持,BIOS將通過FADT表選擇和使用所有處理器最低的相同的電源狀態。例如,如果 CPU0支持所有的電源狀態乃至C3,但是CPU1僅支持C1,那麼OSPM將僅將空閒的處理器置於C1(CPU0將不會被置於C2和C3狀態)。注意 C1必須被支持,C2和C3是可選的。

處理器電源狀態C1
所有的處理器必須支援這種狀態。這種狀態的支援是透過一個本地的處理器指令(HLT或者 mwait),並且認為不需要晶片組的硬件支持。這種狀態的硬體延遲必須夠低,使得OSPM在決定是否使用該狀態時不需要考慮延遲方面的問題。除了將 處理器置於一種電源狀態,這個狀態沒有其他的軟件可見的效果。在C1狀態下,處理器可以保持系統cache裡面的內容
硬件可以以任何理由退出該狀態,但必須是在有中斷到達處理器的情況下。

處理器電源狀態C2
這種電源狀態不是必須的。如果存在,省電效果更好,它通過使用P_LVL2命令寄存器 或者由_CST提供的另一種機制來使處理器進入該狀態。這個狀態的最壞情況下的硬體延遲在FADT的表裡面有聲明,OSPM可以根據這個信息來決定什麼時 候C1狀態應該被C2狀態代替。除了將處理器置於一種電源狀態,該狀態沒有其他的軟件可見效果。OSPM假設C2比C1更省電,但是退出的延遲比C1要 高。
C2電源狀態是一種可選的ACPI時鐘狀態,需要晶片的硬件支持。時鐘邏輯由一個接口組成,可以用來被操縱使處理器精確的進入C2電源狀態。在C2電源狀態下,處理器被認為能夠保持其cache的一致性;例如,總線控制器和多處理器的活動可以發生而不破壞cache裡面的內容。
C2狀態將處理器置於一種低功耗的狀態,圍繞多處理器和總線控制器系統做優化。當存在總線控制器或者多處理器活動時(這一條件將阻止處理器進入C3狀 態),OSPM將使一個空閒狀態下的處理器群體進入C2狀態。處理器簇能夠在C2狀態下監視總線控制器或者多核CPU訪問的行為。
硬件可以以任何理由退出該狀態,但必須是在有中斷到達處理器的情況下。

處理器電源狀態C3
系統對C3處理器電源狀態的支援也是可選擇的. 如果存在,這種狀態比C1和C2狀態更加節省功耗。使用P_LVL3命令寄存器或者_CST機制可以進入C3狀態,這種狀態的最壞的硬體延遲在FADT表 中聲明了,OSPM可以通過這一信息來決定什麼時候需要進入C3狀態而不是C1或者C2狀態。當在C3狀態中,處理器的cache保持狀態,但是處理器沒 有窺視總線控制器,或者多核CPU進行訪存。
硬件可以以任何理由退出這種狀態,但必須是因為一個中斷投遞到了該處理器,或者當BM_RLD被設置時,一個總線控制器企圖訪存.
OSPM負責保證cache的一致性.在單處理器環境下,這可以通過使用 PM2_CNT.ARB_DIS總線控制器仲裁寄存器來保證總線控制器的活動不會發生在C3狀態下. 在多處理器環境下,處理器的cache可以通過flush和invalidate來保持一致性.
有兩種機制支持C3電源狀態:
1. 在進入C3狀態之前,讓OSPM flush和invalidate cache
2. 提供一種硬件機制,阻止控制器寫內存(只支持UP)
在第一種情況下,OSPM將在進入C3之前flush系統的cache,由於flush系統的cache通常有很大的延遲,OSPM只對多核平台的空閒處理器支持這種情況。flush cache通過ACPI定義的一種機制來完成。
單處理器平台提供一種硬件功能,OSPM將嘗試將平台置於一種模式,當處理器處於C3模式,這種模式組織系統總線控制器來寫內存。一旦總線控制器請求一個訪問,CPU將從C3中被喚醒,並且重新使能總線控制器訪問。
OSPM使用BM_STS來 決定要進入的電源狀態是C2還是C3.,BM_STS是一個可選的bit,表示總線控制器是活躍的。OSPM使用這一位來決定在C2和C3之間的策略。頻 繁的總線控制器活動將CPU的電源狀態降到C2,沒有總線控制器活動將CPU的電源狀態提升到C3。OSPM保持BM_STS的一個變化歷史來決定CPU 電源狀態的策略.
用在C3里的最後一個硬體特性是BM_RLD位元. 這一位元決定總線控制器的訪問是否導致Cx電源狀態的退出,如果這一位元被設置,一旦有總線控制器訪問,Cx將退出。如果該位被覆位為零,總線控制器的訪 問將不會導致電源狀態的退出。在C3狀態中,總線控制器的申請需要CPU轉換回C0狀態,但是在C2狀態中,這樣的轉換將不是必須的。在C3狀態 下,OSPM可以設置這一位,在C1或C2狀態下,可以清除該位。

什麼是SYSTEM MANAGEMENT MODE (SMM)


System Management Mode (SMM) is intended to be used for advanced power-management features and other operating-system-independent functions. The chipset is programmed to recognize many types of events and timeouts. When such an event occurs, the chipset asserts the SMI# input pin. At the next instruction boundary, the microprocessor saves its entire state and enters SMM.

一、概述
只有SMI才會引起進入SMM,處理器保護現場,切換到SMRAM裡的一個獨立位址空間執行SMM代碼,RSM指令會使系統返回到原來的正常模式。SMM相當於實模式,沒有特權級和位址映射,可定址4GB,可執行所有I/O和可用系統指令。
SMI優先順序在所有中斷裡最高。當處於SMM狀態,處理器不識別後繼的SMI請求,但第一個SMI請求可以被鎖存,並在系統退出SMM後被處理。
RSM指令只能在SMM狀態下執行,否則會產生操作符無效異常(exception)。RSMSMRAM裡的處理器內容存回處理器,接著把控制權還給被中斷程式。若處理器在SMRAM中偵測到無效狀態,會shut down並產生一特殊匯流排週期以標識該狀態。
當收到SMI時,若處理器處於HALT狀態,處理器從SMM返回會稍有不同,SMBASE位址也會有所改變。
 
二、SMRAM
SMM時,處理器在SMRAM裡執行代碼和存儲資料,也用其來存儲系統管理資訊(如系統配置和power-down設備的特殊資訊)及OEM SPEC資訊。SMRAM被映射到物理空間,最大是4GB,默認是64KB,開始於物理空間裡的SMBASE(硬體RESET後,預設值是3000H)。
處理器在[SMBASE+8000H]尋找SMI處理程式的第一條指令。[SMBASE+FE00H][SMBASE+FFFFH]存放處理器狀態,即處理器的所有寄存器值。

SMRAM

SMBASE+FFFFH
Start of State Aave Area
SMBASE+FE00H

SMI Handler Entry Point
SMBASE+8000H



SMBASE+8000H
三、SMI執行環境
SMM與實模相似但有所不同,它可以定址4GB,加上E首碼就可以訪問1MB以上空間,DATASTACK可以在4GB的任何地方。
                                      寄存器初始值:
EFLAGS

0000 0002H

EIP

0000 8000H

CS

SMBase(default: 3000h)

DSESFSGSSS

0000H

CR0

Set PEEMTSPG to 0,其他不變

DR7

0400H


四、SMM中的中斷和exception
進入SMM後,所有HW中斷都被禁止(包括可遮罩硬體中斷、單步中斷、中斷點陷阱、NMISMIA20M中斷)。軟體中斷和exception能發生,但建議不要,否則可能會產生不可預料的後果。
NMI會被堵在SMI服務程式入口處,且只有第一個NMI會被鎖存並在退出SMM後被執行。但也可以通過使能INTR引腳並有效INTR的方式來在SMM中使能NMI。在一般情況下,NMI是不可嵌套的,但也有例外。若從NMI處理程式進入SMM,同時有收到新的NMI,就可以在退出SMM後實現嵌套,也就是在老的NMI處理程式裡處理新的NMI
 
五、在SMM裡保存FPU狀態
有時在SMM裡有必要保存FPU狀態,最安全的辦法是先置處理器於保護模式下再存FPU,儘管FSAVE可以以四種格式中任一種來存PFU內容。一般默認是在實模方式下進行,但若在非16位實模下發生SMI就必須進入保護模式執行FSAVEFRSTOR,否則無法正確保存和恢復相關FPU資訊。但存完FPU資訊後,SMI處理程式可以繼續在保護模式下執行,但建議其主要在16/32實模下運行。
 
六、SMM版本識別
31                                                        18 17 16 15                                                                  0
Reserved



SMM版本標識



Bit 17 =1 : SMBASE重定位使能
Bit 16=1 :
支援I/O指令重啟
1
SMBASE
重定位
SMBASE默認是30000H,放在處理器內部的SMBASE寄存器裡,我們可以通過在[SMBASE+FEF8H]處設置SMBASE區來重定位SMRAM。後續SMI請求會在新位址處執行SMI處理程式和存放狀態記憶體(系統重啟後會把SMBASE寄存器又寫成30000H,但INIT不會改變它)。
SMBASE重定位到1MB以上位址,實模下的軟體操作就不能初始化段寄存器到SMBASE
SMBASE可用E首碼來訪問32位元位址大小。
2
I/O
指令重啟
就是允許從SMM狀態返回時從被中斷I/O指令處重新執行。I/O指令重啟區[SMBASE+FF00H]控制I/O指令重啟,值為FFH時允許重啟。但該I/O指令並不是造成SMI的原因。
若從I/O指令進入SMM又收到SMI,處理器會先處理新的SMI再重啟該I/O指令。
 
七、自動HALT重啟
         若處理器在HALT狀態進入SMM,要在[SMBASE+FF02]處置自動HALT重啟標誌位元。SMI處理程式可將它清零或不予理睬,這樣返回時就相應地執行HLT指令後的下一條指令或仍回到HALT狀態。
自動HALT重啟標誌值


進入SMM後的值

退出SMM後標誌值

退出SMM狀態後處理器行為

0

0

1

1

0

1

0

1

返回到被中斷程式或任務的下一條指令
不可預料
返回到HLT指令後的下一條指令
回到HALT狀態

八、多處理器SMM注意事項


MP系統中任一處理器都要能回應SMI


每個處理器都有自己的SMRAM空間。


不同處理器的SMRAM可在同一記憶體空間重疊,但它們的狀態存儲區和動態資料存儲區卻要彼此獨立,代碼和靜態資料可共用。


SMI處理程式要為每個處理器初始化SMBASE


處理器可通過自己的SMI引腳或從APIC介面收到的SMI來響應本地SMIAPIC介面可將SMI分給不同的處理器)。

2011年6月8日 星期三

SMBus introduction

A.學習目標 (SMBus introduction)
a.瞭解SMBusSMBusI2C的差別
b.瞭解SMBus Protocols
c.瞭解Slave Address

B.大綱
1. The Concept of SMBus
1.1 SMBus and I2C
2. Slave and Master Device
3. Layers
4. SMBus Protocols
4.1 Block Write
4.2 Block Read
5. SMBus Register

C. SMBus introduction
C.1. The Concept of SMBus
SMBus在整個系統中與南橋所連接(4.1),為一種two-wire的介面(4.2),其中一條負責傳遞Data,另一條負責傳遞ClockSMBus上的設備都是透過SMBus互相傳遞訊息,像是設備的基本資訊和狀態、控制參數、回報不同型式的錯誤等。[1]
4.1 SMBus與南橋示意圖
4.2 SMBus示意圖
以下為SMBus定義與解釋:[2]
SMBus stands for System Management Bus, a simple two wire bus used in devices such as a computer motherboard for communication, mostly on low bandwidth devices.
The SMBus was developed by Intel in 1995. One of the main duties of a SMBus is carry clock, data, and instructions from the motherboard to the device. It is based on Phillips C serial bus protocol. A SMBus can be found in many of the electronic devices that you own. For instance, on your laptop's rechargeable batter subsystem, in your computer, and many other types of electronics that include temperature sensors and lid switches. A SMBus can inform the user of specific, but basic types of information. For instance, a device which has a SMBus can indicate the model or version of a device. In addition, a SMBus is also an extremely valuable tool for reporting errors, an event or accept control parameters. It should be noted that a SMBus even when located in a laptop or desktop computer can not be configured and is usually not accessible.
The SMBus does have support from a variety of operating systems including Linux, MS Windows 2000, MS Windows XP and MS Windows Vista. However, MS Windows 98 does not support the SMBus.

C.1.1 SMBus and I2C
SMBusI2C同樣都是屬於匯流排的標準,由於SMBus Specification的制定是依據I2C,因此二個標準有許多相似的地方,以下將列出SMBusI2C之間相同與差異之處。

SMBUS
I2C
Interface
Two Wired
Two Wired
Work frequency
10KHz~100KHz
0 ~ 100KHz
400KHz
3.4MHz
Purpose
low speed device
general device
Salve return Ack
Require
Not Require
Data Hold Time
300 ns
0 (No Data Hold Time)
Wait Time
35ms
0 (No Wait Time
4.1 SMBusI2C比較表

C.2. Slave and Master Device
SMBus中分為MasterSlave Device,其中Master Device負責發送指令給Slave Device、產生Clock及結束此次的指令動作。而Slave Device則只負責接受指令並回應所需的資訊。
MasterSlave Device的溝通是透過Address來進行,只要任何設備在SMBus上且為Slave Device都會有唯一的Slave Address
Slave Address是由7+1bits所組成的(4.3),第1bit到第7bitSlave DeviceAddress,這是不變的,出廠時就會定義好的,而第0bit則是會變動的,若為0代表Write,若為1代表Read
4.3 Slave Address

4.2為保留的SMBus Address,因此設備選擇Slave Address時,要避免用到這些所保留的Slave Address
4.2 Reserved SMBus Address

C.3. Layers
SMBus Specification中定義了三種不同的Layer,分別是Physical LayerData Link LayerNetwork Layer,其中Network Layer較偏向BIOS,說明資料傳輸協定。另外二個則較偏向硬體,在此就不予討論。

C.4. SMBus Protocols
SMBus Protocol中分為很多不同型式的傳輸模式,例如Send ByteReceive ByteWrite ByteRead WordRead ByteRead WordProcess CallBlock ReadBlock WriteBlock Write以及Block Read等。雖然SMBus Protocol有許多種的傳輸模式,但是必須根據廠商的Specification才能得知是否支援那一種傳輸模式
一般常用的傳輸模式為Byte ReadByte WriteBlock ReadBlock Write。圖4.3列出Protocol會用到的notation,則在4.14.2分別介紹Block WriteBlock ReadProtocol

4.4 Protocol Notation

C.4.1 Byte Read
Byte Read指的是當要讀取SMBus上的Device資料,一次讀取的資料大小為何,而Byte Read則是一次讀取一個Byte
4.5 Byte Read Protocol

frame由左到右流程如下:
A. s 代表指令的開始
B. 填入所要accessSlave Devices AddressWrite的目的是等一下要對此Slave Device下指令。
C. Slave DeviceACKMaster,代表已收到訊息。
D. Master Device指令Slave DeviceICH7中是下的指令是48h,此指令是根據每個Spec而有所不同,請參考Note A
E. Slave DeviceACKMaster,代表已收到指令訊息。
F. s 代表指令的開始
G. 填入Slave Devices AddressRead的目的是要從此Slave Device讀取資料,所以Slave Address必須再1
H. Slave DeviceACKMaster,並將資料回傳給Master Device
I. Master DeviceACKSlave Device結束Byte Read的動作。

C.4.2 Byte Write
4.6 Byte Write Protocol
由於Byte Write Byte Read流程類似,因此在此不再贊述。唯一值得注意的是,此ProtocolByte Write,所以後面並沒再讀取資料的需要,所以流程較短。ICH7中是下的指令是48h,此指令是根據每個Spec而有所不同,請參考Note A

C.4.3 Block Read
Block Read指的是當要讀取SMBus上的Device資料,一次讀取的資料大小為一個BlockBlock大小由指令裡去定義。
4.7 Block Read Protocol
frame由左到右流程如下:
A. s 代表指令的開始
B. 填入所要accessSlave Devices AddressWrite的目的是等一下要對此Slave Device下指令。
C. Slave DeviceACKMaster,代表已收到訊息。
D. Master Device指令Slave DeviceICH7中是下的指令是54h,此指令是根據每個Spec而有所不同,請參考Note A
E. Slave DeviceACKMaster,代表已收到指令訊息。
F. sr 代表指令的開始
G. 填入Slave Devices AddressRead的目的是要從此Slave Device讀取資料,所以Slave Address必須再1
H. Slave DeviceACKMaster,並將資料的Byte Count (代表資料有多少的長度) 回傳給Master Device
I. 依序將資料回傳給Master Device,直到資料傳完。
J. Master DeviceACKSlave Device結束Block Read的動作。

C.4.4 Block Write
4.8 Block Write Protocol

Block Write Block Read流程類似,則不再贊述。其中不同的是,Byte Count是由Master Device所給的,直到資料全部寫入完畢,則結束此流程。ICH7中是下的指令是54h,此指令是根據每個Spec而有所不同,請參考Note A

C.5. SMBus Register
在南橋的Specification中,有記載了SMBusBase Address,在PCIDevice 31:Function3之中,其分佈如表4.3
4.3 SMBus Controller PCI Register Address Map (SMBUSD31:F3)

* Note A
若要讀寫SMBus上的資料,必須在ICH7(Southbridge)HST_CNTHost Control Register (SMBUSD31:F3) 填入適當的值,見表4.4與表4.5。舉例來說,若使用Byte Mode進行資料的傳輸,則必須在Bit[4:2]填入010,再加上Bit 6也要設為1,因此整個指令為01001000b就相等於48h
    若使用Block Mode,則在Bit[4:2]填入101Bit6設為1,整個指令值為01010100b相等於54h
 
4.4 HST_CNTHost Control Register (SMBUSD31:F3) - 1
 
4.5 HST_CNTHost Control Register (SMBUSD31:F3) - 2

D. 參考資料
[1] System Management Bus (SMBus) Specification Version 2.0
[2] http://www.tech-faq.com/smbus.shtml