|
|
一旦正確的頻率供給給system後, BIOS便依據既定的POST table(類似行程表)來做事. 首先,與chipset最為相關的便是 [chipset config stage]. 意即,在此階段BIOS必須對 chipset registers填入正確的值,俾使其正常運作. 一般而言,要config下列的 devices:! ?) ]3 l" {0 @
- NB(還記得前面有提過北橋內部約可分 4 blocks; "有些" blocks 需要 在此 program...)
5 Y" k7 ?; N! ~+ n$ {- SB(即 PCI-ISA bridge)
0 `" g: f; |& ?$ c- ACPI registers2 z. E5 l1 B5 v$ C$ c7 b
- USB registers! P4 }3 ?* J2 z* v. d
- SATA registers& s: T. L0 m J& m9 t& Z& \
- PATA registers
' ]9 Q& ~) E0 f0 h- a...6 E1 ]2 U5 x2 T! `
& l* T5 Q& Q' [. a; A$ j6 o" s
* 在此所謂的 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之處 !!!
) G! {' j% n8 Y1 M- y1 N' V* F& T; [ c5 {, q% J @
* ACPI registers通常透過 IO 來存取$ u$ Q4 f, F$ i! a
Ex. // assume ACPI Base is 800h,要 access ACPI Reg55h& @: `' ^; K9 v, o
mov dx, 855h& O0 g( \6 N3 f" B) o/ |" x
in al, dx ; <- al = ACPI Reg55h's value' N+ ]& `: H0 ?$ M: A
+ n9 F) B3 z9 H7 w( Z* 上述所列的 devices多為 PCI device,也都有唯一的PFA(PCI Function Address,即 bus#,device#,func#),也因此,只要對 device 下 PCI configuration read/write便可以 config device registers.! }2 D z4 k: j6 x; d6 p9 F" o
1 ^/ b# F# v5 h# n
Ex. 假設: set SATA register offset 52h bit3 = 1;SATA controller PFA is (0,4,3)
% X2 [5 E# a! n! l3 `=> 簡單的 assembly can be:
9 c6 l" L: E1 m2 a' O0 A" P3 D
* m- l) _3 D, I5 W- ~0 Z) \mov eax, 80002750h
' \; W3 J) N s9 Tmov dx, 0cf8h
7 Q2 X6 ?3 `$ w4 j3 X9 Hout dx, eax+ F6 t2 S6 _# k" O
9 Q- T. N7 k: l" _5 k" ~ E1 g
mov dx, 0cfeh1 v: ?5 c& C% X) l$ @. u
in al, dx
@8 R: H" ]) k! W9 e( X, e8 {or al, 00001000b7 F& B5 |" Z7 T- s
out dx, al
# d% }8 d) a5 _0 z8 {- z8 z# k3 J
, e7 |9 Z( M6 c0 y% x9 o事實上每家BIOS都 maintain many "tables" 來說明: 哪一個 device 中的哪些 registers要填?值.相關的 access routine都已經寫好. Programmer只需更改表裡面的值即可 ^_^
; Z3 o6 e& @8 q. D0 {: O4 L( P6 ^+ ?, I, J7 d& r! M% [
*當有人要求改 register setting時,我們必須知道三件事:
* p# ]$ _) ~$ \1. why (為什麼要改?)- K! h+ p1 B. U7 U2 U" o
2. what(改成何值?)
4 l! q; K) [# W# E6 R3. when(什麼點改?)
# b2 w9 X$ I G; @/ x4 l4 c/ `0 n
6 e8 V3 j0 }$ [$ o1 Y: {9 H# `*對於 BIOS kernel與 OEM coding的人言,這部分會是較少碰觸的,因為,這些code會由 chipset porting的人負責撰寫及維護. & e7 i( V& u0 _. i2 x. h
張貼者: HARRISON HSIEH 位於 8:41 下午 ( r$ I6 R0 c I( j+ a( f9 U7 _+ B. Q2 b
標籤: BIOS相關 % }# Y" i, W0 z% V2 M6 T
6 意見:
' ]$ W4 e5 {8 j& ~ / x9 }' L9 }, G" D2 d4 `
tonyya 提到...
* k: l z$ `# `- |2 S* H+ y9 M無意間發現你的部落格$ |: d1 `# [5 B2 P
0 S3 @1 _8 `9 d' j+ U4 V' R很多文章都覺得受益良多
" [" A5 ^0 N. g$ K6 G
! W2 L# F9 j1 E* q我也剛接觸這門領域不久
5 G7 U( {+ X% G# Y( f9 Q0 Q! z d, W4 }
很多東西都似懂非懂
5 j, R1 L' X& m/ _0 m
! \+ I" @8 C0 ~& e+ c/ P8 r# s/ E不知對於一個新人而言/ x/ u% j8 s' q
" @) a [+ h2 L* @" I& C% ]
有沒有什麼好的訓練方式- K$ j2 n, `' E9 V; D9 R
7 N% I8 g: p5 }0 X* o- O
可以及早進入狀況6 a5 w5 u, Z% y* Z0 P
十月 03, 2007 5:53 上午
- R/ ]1 g7 T1 s4 ?0 o, t1 q & C3 D2 K/ U: ^6 }: q1 F0 a
Harrison 提到...
' N) o* T. [5 W$ ]1 l9 W G現在的BIOS有分成Legacy BIOS(組合語言)與UEFI BIOS(C語言),但是這兩種BIOS對於一個剛接觸的新手來說就只是Win98跟WinXp使用方式的差別而已,介面不同,但是要做的事情幾乎一樣。; Q5 @% @! Z2 \, I( I9 ~+ m
& S( A! X8 d) v0 h所以我的建議是多去了解這些工具的用法(組合語言指令/C語言用法)還有多看看Intel IA32 Architecture guide vol1~3(目前最新版是IA64),因為了解系統架構才是最基本的。" j8 ^, S: x! T0 |" a! u7 ^" ?
, Y. d6 x! g$ k4 }2 f+ v, a" U如果要快速上手的話,你就先必須知道"設定方式",例如: 如何填CMOS/PCI Register(CF8/CF9),還有如何調整PIRQ/GPIO/ASL Code...等,如何透過SMbus/LPC存取? 何謂KBC/EC? 又要如何把OpROM 載入到記憶體,然後把控制權交給OpROM,執行後又把控制權還給BIOS/CPU Microcode如何更新?...etc. 這些都是基本OEM BIOS會做的事情,至於BIOS核心就必須很了解IA32架構你才有辦法去做。
7 |8 U) F% K/ Z5 U* e9 G# E十月 04, 2007 5:39 下午 9 \2 J/ a: w1 d& k. @6 c
F# @/ o6 D; e4 Wtonyya 提到... , ?! y' P- _# [
首先感謝你的回覆
9 ~) c" O' x( N7 n, x( M
2 m3 U) ^, q. x4 v0 n) j8 v1.目前接觸的是Legacy BIOS(組合語言)- m; a2 t5 @# r6 E; C
1 F' Y8 s; A+ n. [3 @
2.IA32的系統架構有在看,目前也在積極補強一些相關的spec知識,不過還是要有實際做過才有感覺,對我而言如果只是光看的話無法深刻的體會
* L$ K) V& Z; t4 O9 F0 O( Z: A' i( w
3.關於你說的設定方式,有的有碰過,像是PCI,ASL code,SMBUS/LPC, CPU Microcode更新,我會去補強你所提到而我沒碰到的部份5 ~/ X" S0 ^# F. ~
. `& W$ |/ z7 z9 A. |2 G! a
4.進入這行的感想是對於一些硬體的知識比以前來的了解,辛苦的是要一直摸索找方向,雖然東西很多要K,問題就在於太多東西反而有時不知從何著手 @@!
# o `) A/ p0 H1 v. v- B9 i& @1 [. D) J8 j' O( N
5.再次感謝你所提供的意見2 L/ k! P: z! k/ \& ]
十月 05, 2007 8:09 上午 ) R, i5 y$ E l( I0 M5 k. d( R- {
- D! X, k! C6 d1 p) Q
chiehlin@mail2000.com.tw 提到...
$ {# f$ t( h* g. [3 i) R" B- xPCI Register 是 cf8 cfc Index ,Data
+ R5 W I6 v1 E b十月 25, 2007 11:17 上午 / e6 f, p( |- b0 E7 t& W3 g
2 ^+ N- } n4 O/ Q+ G/ i; O/ uPT 提到... : d% d* U' C* @& u m
關於SATA register offset 52h bit3 = 1;SATA controller PFA is (0,4,3)
6 G1 }; _* {5 }/ p0 Pmov eax, 80002750h
6 e' n, r& z2 m5 @5 A% T9 K1 q依照我的理解方式是
+ o4 g' {2 R$ o$ k6 G8 m: `3 v2 e- x1 Q10000000^00000000^00100^011^01010000
* ^4 g+ p/ r" @. A9 c/ J所以應該是80002350h |
|