為什麼BIOS晶片要做小顆? - 3C

Table of Contents

沒營養又愛吃餌的閒聊仔又來啦

這次來聊聊 Reset Vector 跟 Security Entry, 透過 UEFITool[1] 知道該 BIOS[2]
大小是13MB/32MB, 所以映射圖如下 (三個圖的比例不一致).

0 0 0
+-------+ +-------+ +-------+
| . | | . | | . |
| . | | . | | . |
| . | | . | | . |
| . | | . | | . |
+-------+ ------ +-------+ --- +-------+
| 13MB | | 13MB | / | 128KB |
+-------+ ------ +-------+ ------ +-------+
4GB 32MB 1MB
32Bit mem. ROM 16bit mem.

CPU一上電後內部兩個暫存器的初始值是 CS:IP = 0xf000:0xfff0, 意思就 CPU 是會到
1MB-16B 的地方跑程式, 所以 PCH 會故意 把 SPI ROM 最末端 128KB 的地方映射到該
處如右圖. 同時也會將整個 BISO 區域映射到 4GB 的末端如左圖.

算法: 0xFFFF0 = CS*16+IP = 0xf000<<4+0xfff0 = 1MB-16B



再來燒好 BIOS, 設定好除錯器後, 開啟電源後會看到 CPU 待在 0xFFFF0 的地方

https://github.com/tianocore/edk2/blob/master/UefiCpuPkg/SecCore/Ia32/ResetVec.nasmb

Address 0 1 2 3 4 5 6 7 8 9 A B C D E F
000FFFC0 00 01 36 FF 00 00 00 00 00 00 00 00 00 00 00 00
000FFFD0 BF 50 41 EB 1D 00 00 00 00 00 00 00 00 00 00 00
000FFFE0 94 13 F0 FF EB FE CF 00 00 00 00 00 00 00 00 00
000FFFF0 90 90 E9 9B F2 00 00 00 EF 00 00 00 00 00 F0 FF

0x000ffff0: 0x00000000000090 nop
0x000ffff1: 0x00000000000090 nop
0x000ffff2: 0x00000000f29be9 jmp 0xf290

0xF29B (2's complement) = -0x0D65
0xfff2 + 3 -0x0D65 = 0xF290

這段 code 就是往上跳, 跳多少? 我已經列了算式. 這裡就是俗稱的 Reset vector.



跟著除錯器來到 0xFF290 的地方, 這裡就是所謂的 Security Entry (Flat32).
這裡開始各個晶片供應商會開始有些大同小異. 所以會跟UEFI code有些出入.

https://github.com/tianocore/edk2/blob/master/IntelFsp2WrapperPkg/Library/SecFspWrapperPlatformSecLibSample/Ia32/SecEntry.nasm

Address 0 1 2 3 4 5 6 7 8 9 A B C D E F
000FF290 DB E3 0F 6E C0 FA 66 33 C0 8E C0 8C C8 8E D8 B8

0x000ff290: 0x0000000000e3db fninit
0x000ff292: 0x00000000c06e0f movd mm0,eax

中間是一些廠商添加的功能就不反組譯了

Address 0 1 2 3 4 5 6 7 8 9 A B C D E F
000FF2D0 31 0F 6E
000FF2E0 EA 0F 6E F0 66 BE 50 F4 FF FF 66 2E 0F 01 14 0F
000FF2F0 20 C0 66 83 C8 03 0F 22 C0 0F 20 E0 66 0D 00 06
000FF300 00 00 0F 22 E0 B8 18 00 8E D8 8E C0 8E E0 8E E8
000FF310 8E D0 66 BE 56 F4 FF FF 66 2E FF 2C

0x000ff2dc: 0x0000000000310f rdtsc
0x000ff2de: 0x00000000ea6e0f movd mm5,edx
0x000ff2e1: 0x00000000f06e0f movd mm6,eax
0x000ff2e4: 0x00fffff450be66 mov esi,0xfffff450
0x000ff2ea: 0x000014010f2e66 lgdt cs:[si]
0x000ff2ef: 0x00000000c0200f mov eax,cr0
0x000ff2f2: 0x00000003c88366 or eax,0x3
0x000ff2f6: 0x00000000c0220f mov cr0,eax
0x000ff2f9: 0x00000000e0200f mov eax,cr4
0x000ff2fc: 0x00000006000d66 or eax,0x600
0x000ff302: 0x00000000e0220f mov cr4,eax
0x000ff305: 0x000000000018b8 mov ax,0x18
0x000ff308: 0x0000000000d88e mov ds,ax
0x000ff30a: 0x0000000000c08e mov es,ax
0x000ff30c: 0x0000000000e08e mov fs,ax
0x000ff30e: 0x0000000000e88e mov gs,ax
0x000ff310: 0x0000000000d08e mov ss,ax
0x000ff312: 0x00fffff456be66 mov esi,0xfffff456
0x000ff318: 0x0000002cff2e66 jmp far cs:[si]

到這裡之後 CPU 的所有暫存器就被設定好準備跑 32 bit 模式的 code.
也就是不再受到 128KB 限制. 整顆 ROM 13MB 的 code 都能隨時跳到哪就跑哪.

至於速度嘛 從SPI讀是鐵定比記憶體慢的,等到DXE階段就會用解壓縮方式把 code
搬到記憶體上再跳過去跑就會快了.

PS:
[1] https://github.com/LongSoft/UEFITool
[2] https://dlcdnets.asus.com/pub/ASUS/mb/socket1151/WS-C246-PRO/BIOS/WS-C246-PRO-ASUS-0904.zip

--

All Comments

Bethany avatarBethany2019-07-21
先推再說
Christine avatarChristine2019-07-21
這篇文內容超簡單,大家都懂對吧
Queena avatarQueena2019-07-24
跟我想的一樣OVO
Agnes avatarAgnes2019-07-28
先推 不然別人以為我看不懂
Enid avatarEnid2019-07-29
本來就這樣,intle又勝利了一次
Mason avatarMason2019-08-02
文組跪求翻譯蒟蒻
Kelly avatarKelly2019-08-06
好多好多0
Annie avatarAnnie2019-08-09
這東西阿....以前大學學過 然後沒再用了XD
Jake avatarJake2019-08-11
之前有人問說 不知道開機後跑code的流程 所以列一
Leila avatarLeila2019-08-11
如同732所說 這些規範跟程式碼都是Intel貢獻的
Agatha avatarAgatha2019-08-11
寫BIOS就是搞這樣?好險當初沒選...
Hamiltion avatarHamiltion2019-08-11
看不懂啦w
Todd Johnson avatarTodd Johnson2019-08-16
組語orz....
Kelly avatarKelly2019-08-18
原來只有我不懂,看來我要先去修個計算機概念再說
Dora avatarDora2019-08-23
阿我的計算機概論老師在哭 連科目名都打錯orz
Joe avatarJoe2019-08-26
CPU上電後會先跑如intel ME之類的東西,之後才是這
Olive avatarOlive2019-08-27
ME 又不是跑在 CPU 上 ...
Noah avatarNoah2019-08-27
你不要這麼專業好不好
Ingrid avatarIngrid2019-08-30
ME沒過,你的CPU就會被shut down
Suhail Hany avatarSuhail Hany2019-08-30
然後就沒有之後了XDD~
Mia avatarMia2019-09-04
只讀完計概的文組仔表示完全看不懂QQ
Rebecca avatarRebecca2019-09-06
嗯嗯 果然是這樣 樓下的也懂吧
Thomas avatarThomas2019-09-08
不懂 計概沒教那麼深吧
Barb Cronin avatarBarb Cronin2019-09-11
這東西要到計算機組織、計算計結構 才有教
然後是 組合語言
Isla avatarIsla2019-09-11
先推不然別人會以為我不懂
Robert avatarRobert2019-09-14
Selena avatarSelena2019-09-15
說得不錯
Yuri avatarYuri2019-09-18
不錯, 算是有表達到我的想法, 給你70分
Thomas avatarThomas2019-09-22
要看懂要去查暫存器的spec,不然程式碼也只知道資料
搬來搬去
Jacky avatarJacky2019-09-25
我只是來電蝦版買新的 你給我看這個
Megan avatarMegan2019-09-28
我真的看不懂QQ
Andrew avatarAndrew2019-09-30
先推再說,雖然完全看不懂
Gary avatarGary2019-10-04
ME 好像會偷跑 不過完全獨立於BIOS 可以說是個後門
Kama avatarKama2019-10-07
感謝分享
Jake avatarJake2019-10-12
推看不懂
Ophelia avatarOphelia2019-10-15
SPI雖然慢 但常是初版ROM搞爛以後的救援好朋友呢
Faithe avatarFaithe2019-10-17
推,有看沒有懂
Bennie avatarBennie2019-10-22
boot code/fw 又不是只有 主要那顆x86 才有 出包
記得要找對主人也不是第一時間跑 還賣硬體板子做量
產管好自家 issues 就好管啥 boot code XD
Kelly avatarKelly2019-10-26
嗯嗯,跟我想的一樣
Zora avatarZora2019-10-29
ME區塊要先過,不然EC不跑code是不給開機
Ina avatarIna2019-11-01
整顆SPI flash裡面有分區塊,它不是全部都是BIOS re
gion
Tom avatarTom2019-11-01
還行 跟我想的差不多 樓下呢?
Una avatarUna2019-11-06
基本知識啦,樓下學得如何?
Anonymous avatarAnonymous2019-11-07
我學的一般般啦
Rae avatarRae2019-11-09
我60分剛好過 你說的我也略懂
Elvira avatarElvira2019-11-10
推 好文
Ina avatarIna2019-11-13
計概不會教組語跟計算機結構的喇~ 組語修完書直接
Blanche avatarBlanche2019-11-16
丟了,真的很討厭16進位 XDDDDD
Heather avatarHeather2019-11-17
嗯嗯 原來如此嗯嗯
Ida avatarIda2019-11-19
沒錯沒錯跟我想的一樣
Quanna avatarQuanna2019-11-22
組合語言好玩
Michael avatarMichael2019-11-27
忽然覺得在大學上課
Lauren avatarLauren2019-12-01
略懂略懂
Ula avatarUla2019-12-04
快推免的別人以為我
Anonymous avatarAnonymous2019-12-05
嗯嗯 老師也這麼教
Delia avatarDelia2019-12-09
Charlotte avatarCharlotte2019-12-13
其實AMD的PSP也是等同於intel的ME般的存在啦