※ 本文轉寄自 ptt.cc, 文章原始頁面
標題

Re: [閒聊] 為什麼BIOS晶片要做小顆?

時間
最新2019-07-21 20:36:00
留言63則留言,49人參與討論
推噓41 ( 42120 )
沒營養又愛吃餌的閒聊仔又來啦 這次來聊聊 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 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 106.1.34.9 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/PC_Shopping/M.1563556339.A.D09.html

63 則留言

xu3fu6xup6, 1F
先推再說

JHSoWhat, 2F
這篇文內容超簡單,大家都懂對吧

sismiku, 3F
跟我想的一樣OVO

tom410525, 4F
先推 不然別人以為我看不懂

WARgame723, 5F
本來就這樣,intle又勝利了一次

abc21086999, 6F
文組跪求翻譯蒟蒻

jasn4560, 7F
好多好多0

pupuliao, 8F
這東西阿....以前大學學過 然後沒再用了XD

sharkbay, 9F
之前有人問說 不知道開機後跑code的流程 所以列一

sharkbay, 10F

sharkbay, 11F
如同732所說 這些規範跟程式碼都是Intel貢獻的

derekQQ, 12F
寫BIOS就是搞這樣?好險當初沒選...

poty456823, 13F
看不懂啦w

niverse, 14F
組語orz....

WFSGT, 15F
原來只有我不懂,看來我要先去修個計算機概念再說

WFSGT, 16F
阿我的計算機概論老師在哭 連科目名都打錯orz

dreamgirl, 17F
CPU上電後會先跑如intel ME之類的東西,之後才是這

Bencrie, 18F
ME 又不是跑在 CPU 上 ...

KinoYW, 19F
你不要這麼專業好不好

dreamgirl, 20F
ME沒過,你的CPU就會被shut down

dreamgirl, 21F
然後就沒有之後了XDD~

Tsukasa0320, 22F
只讀完計概的文組仔表示完全看不懂QQ

bobboy8755, 23F
嗯嗯 果然是這樣 樓下的也懂吧

stfang925, 24F
不懂 計概沒教那麼深吧

pupuliao, 25F
這東西要到計算機組織、計算計結構 才有教

pupuliao, 26F
然後是 組合語言

spirit119, 27F
先推不然別人會以為我不懂

wahaha99, 28F

GSHARP, 29F
說得不錯

atpx, 30F
不錯, 算是有表達到我的想法, 給你70分

kevin552216, 31F
要看懂要去查暫存器的spec,不然程式碼也只知道資料

kevin552216, 32F
搬來搬去

yafx4200p, 33F
我只是來電蝦版買新的 你給我看這個

chons2332, 34F
我真的看不懂QQ

BlackCoal, 35F
先推再說,雖然完全看不懂

HsieHsieH, 36F
ME 好像會偷跑 不過完全獨立於BIOS 可以說是個後門

Jay915, 37F
感謝分享

TOROKYO, 38F
推看不懂

xleacigma, 39F
SPI雖然慢 但常是初版ROM搞爛以後的救援好朋友呢

sharkbay, 50F
我學的一般般啦

eatingshit, 51F
我60分剛好過 你說的我也略懂

kira925, 52F
推 好文

apley, 53F
計概不會教組語跟計算機結構的喇~ 組語修完書直接

apley, 54F
丟了,真的很討厭16進位 XDDDDD

iloserSD, 55F
嗯嗯 原來如此嗯嗯

zerg2150, 56F
沒錯沒錯跟我想的一樣

RaiGend0519, 57F
組合語言好玩

opmikoto, 58F
忽然覺得在大學上課

dentalkung, 59F
略懂略懂

ltyintw, 60F
快推免的別人以為我

hellomotogg, 61F
嗯嗯 老師也這麼教

Windcws9Z, 62F

George017, 63F
其實AMD的PSP也是等同於intel的ME般的存在啦