|
|
一旦正確的頻率供給給system後, BIOS便依據既定的POST table(類似行程表)來做事. 首先,與chipset最為相關的便是 [chipset config stage]. 意即,在此階段BIOS必須對 chipset registers填入正確的值,俾使其正常運作. 一般而言,要config下列的 devices:
B2 I8 O4 Z! a" {! G5 l" J5 S- NB(還記得前面有提過北橋內部約可分 4 blocks; "有些" blocks 需要 在此 program...)
' o) u6 w- W8 n' P- SB(即 PCI-ISA bridge)! S$ ~9 z/ f; l
- ACPI registers
/ x9 j$ ]7 h" V' ]7 G- USB registers
. c0 g2 i$ {* g+ p- Q# k- SATA registers
1 C. M3 P9 ^0 Y/ a9 s- PATA registers
8 S {/ Y7 i' p$ q) g% w...6 ]6 D- \8 F' g! @: _8 g' R* [4 M
+ l* ^ F$ w% l7 U2 O# V6 C* 在此所謂的 registers指的是: PCI config registers(除了ACPI registers以外). PCI spec所定義的 PCI config registers 00~3Fh 為 PCI header part,這個範圍的registers並不是此階段的主要工作(當然還是會touch,只是不多),而是稍後BIOS PCI kernel的事情.此階段將 focus on ffset 40h以後的 registers,因為,這些是 device specific的部分,是 chipset自己加function/feature之處 !!!
( \% e- z+ k% J! K" |" s e" _/ a' J# J. n. H8 G
* ACPI registers通常透過 IO 來存取 Z: C# g. Z1 @ K9 N. G6 }: \9 L
Ex. // assume ACPI Base is 800h,要 access ACPI Reg55h
) X% Q; W5 j6 Lmov dx, 855h
5 ~4 F# w1 o. C1 p! ]4 B, Nin al, dx ; <- al = ACPI Reg55h's value
. p1 K: @& o& g5 F) q$ q, b' z
9 a$ ]- @* k/ V; Y% z! ?8 [* 上述所列的 devices多為 PCI device,也都有唯一的PFA(PCI Function Address,即 bus#,device#,func#),也因此,只要對 device 下 PCI configuration read/write便可以 config device registers.
" h6 s1 n4 ?" {$ w! A& S/ E# N- A5 [8 Y$ K2 Q0 @( @
Ex. 假設: set SATA register offset 52h bit3 = 1;SATA controller PFA is (0,4,3)
- T' m: W% X, j( ]=> 簡單的 assembly can be: d; {) }- U6 E, _
$ M( b7 a5 }$ c- N6 }& w
mov eax, 80002750h7 R7 q; T# G9 r f& k
mov dx, 0cf8h; r& w3 s. C1 e) G% |7 Y) \$ h
out dx, eax' e; s( T' B* I$ e$ `8 i" p* ^
5 H& G, Y& c+ K0 s. H( G3 c' ]
mov dx, 0cfeh
3 o, A) _/ Y& X! ?in al, dx
x4 |% v( s5 Lor al, 00001000b( I$ ^0 c. N7 H+ F' P/ z8 P
out dx, al 9 r, j1 f2 p/ M
% E8 s8 b+ U& _+ O" u* t4 b事實上每家BIOS都 maintain many "tables" 來說明: 哪一個 device 中的哪些 registers要填?值.相關的 access routine都已經寫好. Programmer只需更改表裡面的值即可 ^_^' j2 M/ \ ]3 X1 f
7 z. v: ^8 L+ ?! J% r*當有人要求改 register setting時,我們必須知道三件事:, I' I' e5 M: e
1. why (為什麼要改?): V5 P3 m% a$ x) R
2. what(改成何值?)/ I& s* z4 n1 o! t+ F$ M
3. when(什麼點改?)
( a* B6 v3 {; k9 X! N% E/ R
+ c0 R8 E. ~7 N Q5 e*對於 BIOS kernel與 OEM coding的人言,這部分會是較少碰觸的,因為,這些code會由 chipset porting的人負責撰寫及維護. 3 E- u( V$ u/ X* ~; H/ y/ c; U
張貼者: HARRISON HSIEH 位於 8:41 下午
( F. a% h; e5 q( n A7 |+ d6 H標籤: BIOS相關
8 L8 i1 q* K2 h4 I4 E% s0 E: a8 E6 意見: % D% A5 Y) ]1 Q
9 s2 Q$ c( X. i
tonyya 提到...
. m* D) O1 k z7 w! C7 b4 T# a8 ]- q無意間發現你的部落格
' U3 l! ?1 C6 }- J/ P1 s0 e' |6 R7 G) q, @
很多文章都覺得受益良多- c! Y S4 S8 n# y! b6 `1 c4 A
1 R9 j& K0 C# U+ X& |& y. k6 K1 p
我也剛接觸這門領域不久* l/ O0 Z, p, ] z8 \
7 X @' |0 h4 K6 B3 D
很多東西都似懂非懂$ r2 t" g5 L. `, X1 E2 M
# v! j6 V3 C) m9 U
不知對於一個新人而言1 Q+ Y2 A$ n8 J1 {. [. e9 F
) `+ K$ h! B" z X+ J! m有沒有什麼好的訓練方式, y: q7 \1 e: q& J+ E; g! y" n
& C3 e7 o5 \& T9 G, h2 s
可以及早進入狀況+ \- v" o( t, a4 k
十月 03, 2007 5:53 上午 . J) i K- B# t8 R: Q" ~
* P( z* J2 Q) ]0 f1 u* y) L4 `8 C3 @Harrison 提到...
" _' h3 E) v( v: n; o. v現在的BIOS有分成Legacy BIOS(組合語言)與UEFI BIOS(C語言),但是這兩種BIOS對於一個剛接觸的新手來說就只是Win98跟WinXp使用方式的差別而已,介面不同,但是要做的事情幾乎一樣。# i. |' n# F, @% w5 ]! ?+ ?
" z8 @* Z2 d; R8 O9 |! z Q: C所以我的建議是多去了解這些工具的用法(組合語言指令/C語言用法)還有多看看Intel IA32 Architecture guide vol1~3(目前最新版是IA64),因為了解系統架構才是最基本的。3 Q1 V! U: H" w6 M' ?
" G& Z2 Q* b' s4 Q# E9 B如果要快速上手的話,你就先必須知道"設定方式",例如: 如何填CMOS/PCI Register(CF8/CF9),還有如何調整PIRQ/GPIO/ASL Code...等,如何透過SMbus/LPC存取? 何謂KBC/EC? 又要如何把OpROM 載入到記憶體,然後把控制權交給OpROM,執行後又把控制權還給BIOS/CPU Microcode如何更新?...etc. 這些都是基本OEM BIOS會做的事情,至於BIOS核心就必須很了解IA32架構你才有辦法去做。1 e0 {. H' {' Q3 T1 [
十月 04, 2007 5:39 下午 & S& @, f2 J- u
' F8 s% V; @2 U0 H% J* m! K' }/ Ntonyya 提到... 9 s& D$ y/ l6 t. k
首先感謝你的回覆
4 N1 C! v/ u( c2 i: N
$ O: T% _7 h% L1.目前接觸的是Legacy BIOS(組合語言)
( Q% c4 d: y% Q1 d1 o' a) ?; W X7 @8 f( U) ]9 Z
2.IA32的系統架構有在看,目前也在積極補強一些相關的spec知識,不過還是要有實際做過才有感覺,對我而言如果只是光看的話無法深刻的體會# c" i- p1 x3 H8 r4 X6 N
' t8 Y6 p. r& }! _! k
3.關於你說的設定方式,有的有碰過,像是PCI,ASL code,SMBUS/LPC, CPU Microcode更新,我會去補強你所提到而我沒碰到的部份
2 L+ P! u& t- `
$ T+ u b3 n3 v4.進入這行的感想是對於一些硬體的知識比以前來的了解,辛苦的是要一直摸索找方向,雖然東西很多要K,問題就在於太多東西反而有時不知從何著手 @@!
; K; L- I5 T/ {
. G2 k$ g+ R$ n n8 |' ?0 X8 l! l5.再次感謝你所提供的意見0 Y% j/ u% S; B o& j; i
十月 05, 2007 8:09 上午 0 \2 m& ?) o$ \* M$ x- e' o
3 `; ^* X# ^) ?+ e2 a$ X. Ychiehlin@mail2000.com.tw 提到... $ c: y8 l& S) l) M
PCI Register 是 cf8 cfc Index ,Data
' L, ~3 \' M1 o$ M+ G5 q十月 25, 2007 11:17 上午 4 K( @6 B0 g5 D( F$ a, v9 T
3 G9 [0 V' U; A7 p5 w. x
PT 提到...
- S) K5 g, _3 v關於SATA register offset 52h bit3 = 1;SATA controller PFA is (0,4,3)1 M# g' v% a1 j8 K; x5 Y
mov eax, 80002750h7 G1 g% P% r, e4 L) t/ M* D
依照我的理解方式是
, B; e- n" R3 i- L5 n1 G3 [1 M10000000^00000000^00100^011^01010000
( w( E* r' {6 R+ i, e( y2 d$ m$ e所以應該是80002350h |
|