seabios程式的各種入口點都在src/romlayout.s這個檔案中定義了,啟動包括了vcpu上電後開始執行的起點src/romlayout.s:reset_vector,該位置會被qemu載入到vcpu物理空間的0xfffffff0位置。該處的指令是乙個跳轉指令,該指令會跳轉到src/romlayout.s:entry_post位置,然後判斷是否是系統resume,如果不是則跳轉到post.c:handle_post()函式處,開始post(power on self test)階段。
post.c:handle_post()主要執行如下操作:
初始化debug串列埠
將seabios程式拷貝到0xc0000 ~ 0x100000記憶體區域,並且將這段記憶體區域的屬性設定為可寫的。
檢測當前平台資訊,如使用的晶元組型別,記憶體大小等,建立相應的e820表表項,設定記憶體分配函式分配記憶體時從哪些記憶體區域獲取記憶體。
跳轉到maininit()函式
maininit()函式會對各種系統資源進行初始化,然後尋找可啟動的裝置,詳細步驟如下:
對系統的各種介面進行初始化,主要是軟體上的介面,沒怎麼動到其他硬體
對fw_cfg裝置進行初始化,該裝置是qemu傳遞firmware資訊給seabios的乙個模擬裝置,seabios通過fw_cfg裝置可以獲取到smbios、acpi、e820表等資訊。
初始化中斷向量表
初始化bda(bios data area)、ebda(extended bios data area)資料區,這兩個區域是bios標準中定義的,用於存放一些bios相關的資訊,並且有一些指定的用途。
配置平台硬體
配置平台dma控制器
配置中斷控制器
配置pci裝置,搜尋系統中的pci裝置,並為各個pci裝置分配i/o和memory位址空間,讓系統能夠正確地訪問pci裝置,並配置相應的中斷。
配置好smram的記憶體入口點,並將其隱藏起來
配置好mtrr(memory type range register)暫存器,即配置不同記憶體區間的記憶體屬性(從cpu的角度看)
建立mp表,smbios表和acpi表
配置時鐘和定時器
選取系統的顯示卡,並執行其pci option rom對顯示卡進行初始化,這步完成後,顯示器就被點亮了,並且可以開始顯示啟動過程
對各種外設進行初始化,如usb控制器,磁碟控制器,鍵鼠控制器等等,由於外設比較多,並且速度慢,所以在對這些裝置進行初始化的時候,seabios引入了thread的概念(其實更應該叫做協程),讓多個裝置的初始化同時執行,並不是嚴格的並行執行,此時只有乙個cpu在執行,它在多個裝置的初始化程式中來回切換,確保不會在乙個裝置的初始化中卡住很長時間
執行其他pci裝置的option rom,初始化相應的pci裝置
收集可啟動選項,並且呼叫0x19中斷,開始os的啟動。
至此,seabios的執行過程已經大致理清,其中還包含了很多細節沒有提到,想要了解其中的細節還需要看具體的**。
uboot啟動流程概述 uboot啟動流程
u boot系統啟動流程 大多數bootloader都分為stage1和stage2兩大部分,u boot也不例外。依賴於cpu體系結構的 如裝置初始化 等 通常都放在stage1,且可以用組合語言來實現,而stage2則通常用c語言來實現,這樣可以實現複雜的功能,而且有更好的可讀性和移植性。2.1...
activity啟動流程 App啟動流程三問
裡面涉及到哪些重要的成員呢?都分別負責了什麼,比如ams?啟動流程了解後,對我們開發有什麼幫助呢?1 比如啟動優化,分析啟動過程,其實可以優化啟動速度的地方有三個地方 activity的oncreate方法,同樣進行執行緒處理,懶載入。或者預建立activity,提前類載入等等。2 又比如外掛程式化...
基於mips架構的uboot啟動流程(3)
要注意mips具有流水線可見性,所以跟在跳轉指令後的下一條指令,在執行跳轉到的地方前,都會執行,這個叫分支延遲。但是編譯器會隱藏該特性,但可以通過設定 set noreorder 來禁止編譯器重新組織 順序。每個板子都有自己的lds檔案。這個主要是用來說明編譯生成的指令,及執行過程中用到的資料放置的...