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

By Franklin
at 2019-07-20T01:12
at 2019-07-20T01:12
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
--
這次來聊聊 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
--
Tags:
3C
All Comments

By Bethany
at 2019-07-21T00:57
at 2019-07-21T00:57

By Christine
at 2019-07-21T08:55
at 2019-07-21T08:55

By Queena
at 2019-07-24T14:45
at 2019-07-24T14:45

By Agnes
at 2019-07-28T17:46
at 2019-07-28T17:46

By Enid
at 2019-07-29T03:24
at 2019-07-29T03:24

By Mason
at 2019-08-02T15:51
at 2019-08-02T15:51

By Kelly
at 2019-08-06T20:54
at 2019-08-06T20:54

By Annie
at 2019-08-09T22:05
at 2019-08-09T22:05

By Jake
at 2019-08-11T03:39
at 2019-08-11T03:39

By Leila
at 2019-08-11T10:38
at 2019-08-11T10:38

By Agatha
at 2019-08-11T12:25
at 2019-08-11T12:25

By Hamiltion
at 2019-08-11T20:45
at 2019-08-11T20:45

By Todd Johnson
at 2019-08-16T02:37
at 2019-08-16T02:37

By Kelly
at 2019-08-18T22:09
at 2019-08-18T22:09

By Dora
at 2019-08-23T09:27
at 2019-08-23T09:27

By Joe
at 2019-08-26T02:32
at 2019-08-26T02:32

By Olive
at 2019-08-27T11:37
at 2019-08-27T11:37

By Noah
at 2019-08-27T20:47
at 2019-08-27T20:47

By Ingrid
at 2019-08-30T20:21
at 2019-08-30T20:21

By Suhail Hany
at 2019-08-30T23:51
at 2019-08-30T23:51

By Mia
at 2019-09-04T19:17
at 2019-09-04T19:17

By Rebecca
at 2019-09-06T17:21
at 2019-09-06T17:21

By Thomas
at 2019-09-08T05:01
at 2019-09-08T05:01

By Barb Cronin
at 2019-09-11T18:06
at 2019-09-11T18:06

By Isla
at 2019-09-11T20:00
at 2019-09-11T20:00

By Robert
at 2019-09-14T02:33
at 2019-09-14T02:33

By Selena
at 2019-09-15T12:59
at 2019-09-15T12:59

By Yuri
at 2019-09-18T13:33
at 2019-09-18T13:33

By Thomas
at 2019-09-22T16:21
at 2019-09-22T16:21

By Jacky
at 2019-09-25T15:57
at 2019-09-25T15:57

By Megan
at 2019-09-28T20:17
at 2019-09-28T20:17

By Andrew
at 2019-09-30T12:09
at 2019-09-30T12:09

By Gary
at 2019-10-04T05:21
at 2019-10-04T05:21

By Kama
at 2019-10-07T18:37
at 2019-10-07T18:37

By Jake
at 2019-10-12T15:04
at 2019-10-12T15:04

By Ophelia
at 2019-10-15T10:51
at 2019-10-15T10:51

By Faithe
at 2019-10-17T14:43
at 2019-10-17T14:43

By Bennie
at 2019-10-22T05:37
at 2019-10-22T05:37

By Kelly
at 2019-10-26T01:27
at 2019-10-26T01:27

By Zora
at 2019-10-29T05:39
at 2019-10-29T05:39

By Ina
at 2019-11-01T05:26
at 2019-11-01T05:26

By Tom
at 2019-11-01T15:30
at 2019-11-01T15:30

By Una
at 2019-11-06T11:10
at 2019-11-06T11:10

By Anonymous
at 2019-11-07T21:23
at 2019-11-07T21:23

By Rae
at 2019-11-09T23:34
at 2019-11-09T23:34

By Elvira
at 2019-11-10T11:08
at 2019-11-10T11:08

By Ina
at 2019-11-13T20:14
at 2019-11-13T20:14

By Blanche
at 2019-11-16T13:16
at 2019-11-16T13:16

By Heather
at 2019-11-17T01:53
at 2019-11-17T01:53

By Ida
at 2019-11-19T12:53
at 2019-11-19T12:53

By Quanna
at 2019-11-22T20:45
at 2019-11-22T20:45

By Michael
at 2019-11-27T08:17
at 2019-11-27T08:17

By Lauren
at 2019-12-01T06:16
at 2019-12-01T06:16

By Ula
at 2019-12-04T10:09
at 2019-12-04T10:09

By Anonymous
at 2019-12-05T19:04
at 2019-12-05T19:04

By Delia
at 2019-12-09T04:11
at 2019-12-09T04:11

By Charlotte
at 2019-12-13T13:23
at 2019-12-13T13:23
Related Posts
24K輕度遊戲

By Kama
at 2019-07-20T00:19
at 2019-07-20T00:19
I LOVE YOU 3000, RYZEN

By Edward Lewis
at 2019-07-20T00:09
at 2019-07-20T00:09
Intel終於承認7nm落後了,2年內追不上AM

By Freda
at 2019-07-20T00:09
at 2019-07-20T00:09
30k itx香香機

By Emma
at 2019-07-20T00:05
at 2019-07-20T00:05
記憶體的頻率影響及選擇疑問

By Bethany
at 2019-07-20T00:00
at 2019-07-20T00:00