看板 PC_Shopping 關於我們 聯絡資訊
沒營養又愛吃餌的閒聊仔又來啦 這次來聊聊 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
xu3fu6xup6 : 先推再說 07/20 01:14
JHSoWhat : 這篇文內容超簡單,大家都懂對吧 07/20 01:16
sismiku : 跟我想的一樣OVO 07/20 01:18
tom410525 : 先推 不然別人以為我看不懂 07/20 01:19
WARgame723 : 本來就這樣,intle又勝利了一次 07/20 01:21
abc21086999 : 文組跪求翻譯蒟蒻 07/20 01:21
jasn4560 : 好多好多0 07/20 01:22
pupuliao : 這東西阿....以前大學學過 然後沒再用了XD 07/20 01:24
sharkbay : 之前有人問說 不知道開機後跑code的流程 所以列一 07/20 01:28
sharkbay : 下 07/20 01:28
sharkbay : 如同732所說 這些規範跟程式碼都是Intel貢獻的 07/20 01:30
derekQQ : 寫BIOS就是搞這樣?好險當初沒選... 07/20 01:32
poty456823 : 看不懂啦w 07/20 01:33
niverse : 組語orz.... 07/20 01:34
WFSGT : 原來只有我不懂,看來我要先去修個計算機概念再說 07/20 01:39
WFSGT : 阿我的計算機概論老師在哭 連科目名都打錯orz 07/20 01:40
dreamgirl : CPU上電後會先跑如intel ME之類的東西,之後才是這 07/20 01:41
Bencrie : ME 又不是跑在 CPU 上 ... 07/20 01:41
KinoYW : 你不要這麼專業好不好 07/20 01:42
dreamgirl : ME沒過,你的CPU就會被shut down 07/20 01:44
dreamgirl : 然後就沒有之後了XDD~ 07/20 01:45
Tsukasa0320 : 只讀完計概的文組仔表示完全看不懂QQ 07/20 02:18
bobboy8755 : 嗯嗯 果然是這樣 樓下的也懂吧 07/20 02:28
stfang925 : 不懂 計概沒教那麼深吧 07/20 02:35
pupuliao : 這東西要到計算機組織、計算計結構 才有教 07/20 02:40
pupuliao : 然後是 組合語言 07/20 02:40
spirit119 : 先推不然別人會以為我不懂 07/20 02:45
wahaha99 : 推 07/20 02:47
GSHARP : 說得不錯 07/20 04:07
atpx : 不錯, 算是有表達到我的想法, 給你70分 07/20 04:08
kevin552216 : 要看懂要去查暫存器的spec,不然程式碼也只知道資料 07/20 04:40
kevin552216 : 搬來搬去 07/20 04:40
yafx4200p : 我只是來電蝦版買新的 你給我看這個 07/20 06:42
chons2332 : 我真的看不懂QQ 07/20 06:58
BlackCoal : 先推再說,雖然完全看不懂 07/20 07:03
HsieHsieH : ME 好像會偷跑 不過完全獨立於BIOS 可以說是個後門 07/20 07:11
Jay915 : 感謝分享 07/20 07:20
TOROKYO : 推看不懂 07/20 08:02
xleacigma : SPI雖然慢 但常是初版ROM搞爛以後的救援好朋友呢 07/20 08:16
goldie : 推,有看沒有懂 07/20 08:54
badyy : boot code/fw 又不是只有 主要那顆x86 才有 出包 07/20 09:02
badyy : 記得要找對主人也不是第一時間跑 還賣硬體板子做量 07/20 09:02
badyy : 產管好自家 issues 就好管啥 boot code XD 07/20 09:02
rvd8164 : 嗯嗯,跟我想的一樣 07/20 09:20
rfdevil8145 : ME區塊要先過,不然EC不跑code是不給開機 07/20 09:26
rfdevil8145 : 整顆SPI flash裡面有分區塊,它不是全部都是BIOS re 07/20 09:27
rfdevil8145 : gion 07/20 09:27
onepunchgg : 還行 跟我想的差不多 樓下呢? 07/20 09:30
greenteakigh: 基本知識啦,樓下學得如何? 07/20 09:52
sharkbay : 我學的一般般啦 07/20 10:08
eatingshit : 我60分剛好過 你說的我也略懂 07/20 10:12
kira925 : 推 好文 07/20 10:14
apley : 計概不會教組語跟計算機結構的喇~ 組語修完書直接 07/20 10:37
apley : 丟了,真的很討厭16進位 XDDDDD 07/20 10:38
iloserSD : 嗯嗯 原來如此嗯嗯 07/20 11:13
zerg2150 : 沒錯沒錯跟我想的一樣 07/20 12:02
RaiGend0519 : 組合語言好玩 07/20 13:19
opmikoto : 忽然覺得在大學上課 07/20 13:22
dentalkung : 略懂略懂 07/20 13:45
ltyintw : 快推免的別人以為我 07/20 17:01
hellomotogg : 嗯嗯 老師也這麼教 07/20 23:36
Windcws9Z : 推 07/21 15:26
George017 : 其實AMD的PSP也是等同於intel的ME般的存在啦 07/21 20:36