先起來的是基於MCU的ME部分。ME跑了一會,認為可以了(安全認證啥的),就放開了CPU的PWRGOOD#引腳,CPU正式開始運行。問題是CPU裡面哪個內核先跑呢?這是由PCU決定,不一定是CPUID為0的Thread。這個thread我們叫它BSP,其他的thread叫做AP。BSP開始執行reset vector的代碼,也就是BIOS代碼;而AP處在wait for SIPI的狀態,等待被喚醒。
多CPU,前面和單CPU差不多,區別是ME會同時放開兩個CPU,它們一起醒來。每個CPU的BSP都執行BIOS代碼,而由BIOS來決定誰主導後面的啟動過程。這個主導的thread叫做SBSP,那個跑了一段BIOS就"被"休息的其他CPU的thread叫做NBSP。
用微信掃描二維碼加入UEFIBlog公眾號
多核心初始化有幾種類型:
外部核心初始化引導內部核心, 如 RPi 系列的 BCM SoC, 由 VideoCore 啟動自己的固件, 然後負責引導 CPU 的基礎 bootloader(u-boot/edk2, 或者直接起 initramfs), 這一塊應該是由 VideoCore 的固件決定
固定 ID 執行, 比如默認 0
搶佔執行, 比如說幾個核心各自算一個/多個信號量, 一段時間後發出中斷,根據這一個/多個信號量, 沒搶到的核心自行複位, 搶到的核心執行接下來的流程
「是 GPU 執行的」
——樹莓派
第一行來自BIOS指令或操作系統軟體指令是由(且僅由)一個bootstrap處理器(BSP)執行的。其他處理器被稱作application處理器(AP)。
而BSP是由一個所有處理器都參與的多核硬體協議MP initialization protocol中的一個BSP選擇演算法決定的:
起初所有處理器(若HT,則為邏輯處理器)都開始監控不斷週期變化的BNR#信號,檢測到停止toggling的那一瞬間,保證所有CPU同時向系統匯流排提交一個NOP special cycle。
每個處理器都有一個唯一的APIC id存在APIC id寄存器裏,利用這種唯一性,就可根據APIC id計算APIC仲裁優先順序。只有最高仲裁優先順序的處理器可成功提交NOP special cycle,隨後據此判定自己是BSP,並設置相應BSP flag,然後開始執行BIOS bootstrap代碼。其他處理器則將BSP flag設為0,且進入wait-for-SIPI狀態。
關於APIC:現代處理器內集成了local APIC:具體來說就是一組APIC寄存器加相關邏輯硬體,比如說優先順序比較的邏輯電路。它可捕獲高精度的時鐘中斷,也可捕獲處理器之間的系統匯流排通信消息中斷:可傳遞中斷給其他核心,可實現搶佔式調度,可完成BSP的選擇演算法,還可將任務在多核間遷移——總之,SMP架構中涉及多處理器或所有處理器的功能建立在APIC這種中斷控制機制之上。
關於APIC id:加電後由硬體電路給APIC id寄存器賦值,是根據processor(socket) id和cluster id連接後得到的唯一值。
關於SIPI:所謂IPI就是APIC裏支持的inter processor interrupt,SIPI就是初始化AP的IPI。
https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.pdf?
www.intel.com
在x86處理器上,它從內存地址FFFF:0000 * 獲取和執行開始的指令
該地址通常映射到包含BIOS代碼的ROM。這涉及執行第一階段的引導載入程序,然後該引導載入程序將通過非易失性存儲進行查找以識別並執行第二階段的引導載入程序。
Intel? 64 and IA-32 Architectures Software Developer Manual: Vol 3?
www.intel.com英特爾?64和IA-32體系結構軟體開發人員手冊:第3卷 簡短地說,處理器將運行物理地址0xFFF0處的任何代碼。通常,該地址位於包含BIOS的引導ROM中。
按下計算機的開關之後,硬體設備會將寄存器CS設置為0xF000,寄存器IP設置為0xFFF0,這樣計算機就從地址0xFFFF0 (CS*10H+IP)開始執行程序,如果系統啟動盤第一個扇區的最後兩個位元組內容是0x55和0xAA,OK,那就表明這就是用戶想用它來啟動計算機的設備。而這512個位元組也叫作主引導記錄(Master Boot Record)。找到啟動設備之後,那就是計算機要把這512個位元組讀取到內存的0x7C00這個地址,並從這個地址開始逐條運行程序。
firmware (固件)
固件是嵌入硬體設備中的基本軟體 。硬體設備的ROM 存儲器中 包含的基本軟體常式 。固件始終負責基本操作,例如啟動或輸入/輸出。可以肯定地說,任何電子設備都需要固件才能運行。
固件的範圍從簡化的關於簡單設備的指令集(例如汽車的電子警報)到複雜的設備(例如智能電視,視頻播放器,行動電話,相機/視頻設備,醫療設備等)的更複雜的指令。
PI 規範 是 UEFI 描述計算機不同固件平臺內部介面的規範
The Platform Initialization Specification (PI Specification) is a specification published by the Unified EFI Forum that describes the internal interfaces between different parts of computer platform firmware.
Intel? Platform Innovation Framework for UEFI and Platform Initialization Overview
圖片資源來鏈接:
https://www.intel.com/content/dam/www/public/us/en/documents/research/2011-vol15-iss-1-intel-technology-journal.pdf?
www.intel.com
https://www.howtogeek.com/398493/what-exactly-happens-when-you-turn-on-your-computer/?
www.howtogeek.com
Power supply sequencing waveforms
不正確的上電排序可能會損壞許多類型的處理器,因此這些設備的上電排序至關重要。可能需要上電排序控制的設備包括FPGA,ASIC和DSP晶元。這些設備可能需要跟蹤I / O和內核電壓。上電排序的要求可能會根據設備類型和製造商而變化,因此,請務必仔細閱讀每個設備的排序要求,這一點很重要
Circuit manages power-up sequencing
MAX? II CPLDs are optimized for control path applications such as power-up sequencing, which includes multi-voltage system power up and system reset, and chip-select generation. These two applications are often integrated into a single non-volatile, instant-on device.
Multi-voltage system power-up requires a device to be instantly on and ready to manage the power-up sequence for other devices on the PCB. As board density and the number of power planes on a board increases, the complexity of the power-up sequencing also increases. MAX II CPLDs can easily manage the power-up sequencing for all levels of system complexity.https://www.intel.com/content/dam/www/public/us/en/documents/white-papers/ia-adv-board-bring-up-paper.pdf?
www.intel.com
Power-Up Sequencing?
www.intel.com Intel? Platform Innovation Framework for UEFI Specification?
www.intel.comPI規範包含五個卷:
第1卷:EFI之前的初始化核心介面
第2卷:驅動程序執行環境核心介面
第3卷:共享的建築元素
第4卷:系統管理模式核心介面
第5卷:標準
拓展閱讀
EDK II UEFI驅動程序編寫指南
3.15 Platform initialization?
edk2-docs.gitbooks.ioUEFI PI Spec
https://uefi.org/sites/default/files/resources/PI_Spec_1_6.pdf?
uefi.org
UEFI Shell Spec
https://uefi.org/sites/default/files/resources/UEFI_Shell_Spec_2_0.pdf?
uefi.org
https://uefi.org/specifications?
uefi.org
System hangs at startup with message: "UEFI Platform Initialization" - IBM System x?
www.ibm.com
LM3880 3 Rail Simple Power Sequencer with Fixed Time Delay?
www.ti.com Power Supply Sequencing | Products | Power ICs | TI.com?
www.ti.com
http://www.maximintegrated.com/products/supervisors/sequencers_trackers/?
www.maximintegrated.com
http://parametric.linear.com/sequencers,_trackers,_and_margining_controllers?
parametric.linear.com
內存頂端第一條指令是讓cpu跳到BIOS的。是一條jmp指令
CPU的硬體邏輯在加電時將代碼段寄存器CS和指令指針寄存器IP置為約定值,這樣CS:IP代表的第一條指令約定指向了BIOS的地址範圍。BIOS在內存起始0位置中載入中斷向量表和中斷服務程序,檢測硬體(例如:大家都見過筆記本開機時攝像頭閃亮一下吧),然後BIOS載入內核代碼引導程序。
BIOS產生某中斷,CPU收到該中斷後,啟動中斷服務程序,這一刻,BIOS將執行權交給了彙編程序。彙編程序主要建中斷描述符表(這時產生了特權級概念,有了內核態用戶態的區分),打開高位地址線(可定址空間擴大),創建分頁機制(便於管理內存,管理者控天下)。
鋪墊得差不多了,是時候執行main()函數啟動第一個進程了。C語言開始表演,初始化設備、設置陷阱門、掛鉤子、創建進程......
電腦的話就默認x86 pc了
一般是bsp內部檢測完之後打出ffff fff0地址,正式開始運行外部程序,一般bios在這個地址轉條一次到正式的bios初始化部分去
多核的其他核需要bsp運行程序/中斷喚醒
推薦閱讀: