电脑u启做系统-(U启动怎么做系统)
內(nèi)核復(fù)位后在裸機(jī)上運(yùn)行的代碼,即在不使用操作系統(tǒng)的情況下運(yùn)行的代碼。這是首次啟動(dòng)芯片或系統(tǒng)時(shí)經(jīng)常遇到的情況。bootloader如何加載和運(yùn)行Linux內(nèi)核。從裸機(jī)啟動(dòng)芯片復(fù)位后,將在異常向量表中復(fù)位向量的位置開始執(zhí)行。復(fù)位操作的代碼必須做以下事情:
在多核系統(tǒng)中,使非主核進(jìn)入睡眠狀態(tài)初始化異常向量。初始化內(nèi)存系統(tǒng),包括MMU。初始化核心模式堆棧和寄存器。初始化任何關(guān)鍵的 I/O 設(shè)備。執(zhí)行NEON 或VFP 的任何必要初始化。啟用中斷。更改核心模式或狀態(tài)。處理安全世界所需的任何設(shè)置(參見第 21 章)。調(diào)用main() 應(yīng)用程序。GNU 匯編器中的 _start 指令告訴鏈接器將代碼定位在特定地址,并可用于將代碼放置在向量表中。初始向量表將位于非易失性存儲(chǔ)器中,并且可以包含跳轉(zhuǎn)到自我指令(除了復(fù)位向量),因?yàn)榇藭r(shí)預(yù)計(jì)不會(huì)出現(xiàn)異常。通常,復(fù)位向量包含指向 ROM 中引導(dǎo)代碼的分支。
ROM 可以別名為異常向量的地址。然后,ROM 寫入一些將 RAM 映射到地址 0 的內(nèi)存重映射外設(shè),并將真正的異常向量表復(fù)制到 RAM 中。這意味著處理重新映射的引導(dǎo)代碼部分必須與位置無關(guān),因?yàn)橹荒苁褂?PC 相對尋址。
下一步是設(shè)置緩存、MMU 和分支預(yù)測器。
MMU TLB 必須無效。分支目標(biāo)預(yù)測器硬件可能不必顯式失效,但必須由引導(dǎo)代碼啟用。此時(shí)可以安全地啟用分支預(yù)測;這將提高性能。
在此之后,您可以創(chuàng)建一些翻譯表,如示例 13-4 的示例代碼所示。變量 ttb_address 用于表示要用于初始轉(zhuǎn)換表的地址。這必須是一個(gè) 16KB 的內(nèi)存區(qū)域(其起始地址與 16KB 邊界對齊),此代碼可以向其中寫入 L1 轉(zhuǎn)換表。
接下來的步驟將取決于系統(tǒng)的確切性質(zhì)。例如,可能需要對將保存未初始化 C 變量的內(nèi)存進(jìn)行零初始化,將其他變量的初始值從 ROM 映像復(fù)制到 RAM,并設(shè)置應(yīng)用程序堆棧和堆空間。可能還需要初始化 C 庫函數(shù)、調(diào)用頂級構(gòu)造函數(shù)(用于 C++ 代碼)和其他標(biāo)準(zhǔn)嵌入式 C 初始化。
Booting Linux如果選擇了 HIVECS(稱為高向量),那么了解內(nèi)核從復(fù)位中出來并在異常基地址 0x00000000 或 0xFFFF0000 處執(zhí)行其第一條指令會(huì)發(fā)生什么是很有用的,直到出現(xiàn) Linux 命令提示符為止。
當(dāng)內(nèi)核存在于內(nèi)存中時(shí),基于 ARM 處理器的系統(tǒng)上的序列類似于臺式計(jì)算機(jī)上可能發(fā)生的序列。但是,引導(dǎo)加載過程可能非常不同,因?yàn)榛?ARM 處理器的手機(jī)或更深入的嵌入式設(shè)備可能缺少硬盤驅(qū)動(dòng)器或類似 PC 的 BIOS。
通常,當(dāng)您打開系統(tǒng)電源時(shí)會(huì)發(fā)生硬件特定的引導(dǎo)代碼從閃存或 ROM 運(yùn)行。此代碼初始化系統(tǒng),包括任何必要的硬件外圍代碼,然后啟動(dòng)引導(dǎo)加載程序(例如 U-Boot)。這會(huì)初始化主內(nèi)存并將壓縮的 Linux 內(nèi)核映像復(fù)制到主內(nèi)存中(從閃存設(shè)備、板上的內(nèi)存、MMC、主機(jī) PC 或其他地方)。引導(dǎo)加載程序?qū)⒛承┏跏蓟瘏?shù)傳遞給內(nèi)核。然后,Linux 內(nèi)核會(huì)自行解壓并初始化其數(shù)據(jù)結(jié)構(gòu)和運(yùn)行的用戶進(jìn)程,然后再啟動(dòng)命令 shell 環(huán)境。讓我們更詳細(xì)地看看這些過程中的每一個(gè)。
Reset handler通常有少量特定于系統(tǒng)的引導(dǎo)監(jiān)控代碼,用于配置內(nèi)存控制器并執(zhí)行其他系統(tǒng)外圍設(shè)備初始化。它在內(nèi)存中設(shè)置堆棧,通常將自身從 ROM 復(fù)制到 RAM,然后更改硬件內(nèi)存映射,以便 RAM 映射到異常向量地址,而不是 ROM。本質(zhì)上,此代碼獨(dú)立于要在板上運(yùn)行的操作系統(tǒng)并執(zhí)行類似于 PC BIOS 的功能。當(dāng)它完成執(zhí)行后,它將調(diào)用一個(gè) Linux 引導(dǎo)加載程序,例如 U-Boot。
BootloaderLinux 需要執(zhí)行一定數(shù)量的代碼才能完成重置,以初始化系統(tǒng)。這將執(zhí)行內(nèi)核啟動(dòng)所需的基本任務(wù):
初始化內(nèi)存系統(tǒng)和外圍設(shè)備。將內(nèi)核映像加載到內(nèi)存中的適當(dāng)位置(也可能是初始 RAM 磁盤)。生成要傳遞給內(nèi)核的引導(dǎo)參數(shù)(包括機(jī)器類型)。為內(nèi)核設(shè)置控制臺(視頻或串行)。進(jìn)入內(nèi)核。不同引導(dǎo)加載程序所采取的具體步驟有所不同,因此有關(guān)詳細(xì)信息,請參閱您要使用的引導(dǎo)加載程序的文檔。U-Boot 是一個(gè)廣泛使用的示例,但其他可能的引導(dǎo)加載程序包括 Apex、Blob、Bootldr 和 Redboot。
當(dāng)引導(dǎo)加載程序啟動(dòng)時(shí),它通常不存在于主存儲(chǔ)器中。它必須首先分配堆棧并初始化核心(例如使其緩存無效)并將其自身安裝到主內(nèi)存。它還必須為全局?jǐn)?shù)據(jù)和 malloc() 使用分配空間,并將異常向量條目復(fù)制到適當(dāng)?shù)奈恢谩?/p>Initialize memory system
這在很大程度上是一塊板或系統(tǒng)特定的代碼。Linux 內(nèi)核不負(fù)責(zé)系統(tǒng)中 RAM 的配置。它顯示了物理內(nèi)存布局,但沒有其他關(guān)于內(nèi)存系統(tǒng)的知識。在許多系統(tǒng)中,可用 RAM 及其位置是固定的,并且引導(dǎo)加載程序任務(wù)很簡單。在其他系統(tǒng)中,必須編寫代碼來發(fā)現(xiàn)系統(tǒng)中可用的 RAM 量。
Kernel images構(gòu)建過程中的內(nèi)核映像通常以 zImage 格式壓縮(可引導(dǎo)內(nèi)核映像的常規(guī)名稱)。它的頭代碼包含一個(gè)魔術(shù)字,用于驗(yàn)證解壓的完整性,加上開始和結(jié)束地址。內(nèi)核代碼與位置無關(guān),可以位于內(nèi)存中的任何位置。按照慣例,它被放置在距離物理 RAM 基數(shù) 0x8000 的偏移處。這為放置在 0x100 偏移處的參數(shù)塊提供了空間(用于轉(zhuǎn)換表等)。
許多系統(tǒng)需要一個(gè)初始 RAM 磁盤 (initrd),因?yàn)檫@可以讓您擁有一個(gè)可用的根文件系統(tǒng),而無需設(shè)置其他驅(qū)動(dòng)程序。引導(dǎo)加載程序可以將初始 ramdisk 映像放入內(nèi)存,并使用 ATAG_INITRD2(描述壓縮 RAM 磁盤映像的物理位置的標(biāo)簽)和 ATAG_RAMDISK 將其位置傳遞給內(nèi)核。
引導(dǎo)加載程序通常會(huì)在目標(biāo)中設(shè)置一個(gè)串行端口,使內(nèi)核串行驅(qū)動(dòng)程序能夠檢測該端口并將其用于控制臺。在某些系統(tǒng)中,可以將另一個(gè)輸出設(shè)備(例如視頻驅(qū)動(dòng)程序)用作控制臺。內(nèi)核命令行參數(shù)console=可以用來傳遞信息。
Kernel parameters using ATAGs從歷史上看,傳遞給內(nèi)核的參數(shù)是以標(biāo)記列表的形式,放置在物理 RAM 中,寄存器 R2 保存列表的地址。標(biāo)簽頭包含兩個(gè) 32 位無符號整數(shù),第一個(gè)給出標(biāo)簽的字大小,第二個(gè)提供標(biāo)簽值(指示標(biāo)簽的類型)。有關(guān)可以傳遞的參數(shù)的完整列表,請參閱相應(yīng)的文檔。示例包括描述物理內(nèi)存映射的 ATAG_MEM 和描述壓縮 ramdisk 映像所在位置的 ATAG_INITRD2。引導(dǎo)加載程序還必須提供 ARM Linux 機(jī)器類型號 (MACH_TYPE)。這可以是硬編碼的值,或者引導(dǎo)代碼可以檢查可用的硬件并相應(yīng)地分配一個(gè)值。
有一種更靈活或更通用的方法可以使用扁平設(shè)備樹 (FDT) 傳遞此信息。
Kernel parameters using Flattened Device Trees為 PowerPC 內(nèi)核引入了 Linux 設(shè)備樹或 FDT 支持,作為 32 位和 64 位內(nèi)核合并的一部分,通過使用適用于所有 PowerPC 平臺、服務(wù)器、臺式機(jī)和嵌入式的開放固件接口來標(biāo)準(zhǔn)化固件接口 . 它已成為 PowerPC、Micro Blaze 和 SPARC 架構(gòu)的 Linux 內(nèi)核中使用的配置方法。
設(shè)備樹是描述硬件配置的數(shù)據(jù)結(jié)構(gòu)。它包括有關(guān)處理器、內(nèi)存大小和組、中斷配置和外圍設(shè)備的信息。數(shù)據(jù)結(jié)構(gòu)被組織成一棵樹,有一個(gè)名為 / 的根節(jié)點(diǎn)。除根節(jié)點(diǎn)外,每個(gè)節(jié)點(diǎn)都有一個(gè)父節(jié)點(diǎn)。每個(gè)節(jié)點(diǎn)都有一個(gè)名稱,并且可以有任意數(shù)量的子節(jié)點(diǎn)。節(jié)點(diǎn)還可以包含具有任意數(shù)據(jù)的命名屬性值,它們以鍵值對表示。
Kernel entry內(nèi)核執(zhí)行必須從處于固定狀態(tài)的內(nèi)核開始。bootloader通過直接跳轉(zhuǎn)到它的第一條指令(arch/arm/boot/compressed/head.S中的開始標(biāo)簽)來調(diào)用內(nèi)核映像。必須禁用 MMU 和數(shù)據(jù)緩存。內(nèi)核必須處于超級用戶模式,并設(shè)置 CPSR寄存器的 I 和 F 位(禁用 IRQ 和 FIQ)。R0 必須包含 0,R1 是 MACH_TYPE 值,R2 是標(biāo)記參數(shù)列表的地址。
內(nèi)核工作的第一步是解壓縮它。這是獨(dú)立于架構(gòu)的。保存從bootloader傳遞的參數(shù)并啟用緩存和MMU。在調(diào)用arch/arm/boot/compressed/misc.c 中的decompress_kernel() 之前,會(huì)檢查解壓后的圖像是否會(huì)覆蓋壓縮后的圖像,清除緩存然后再次禁用。然后支到 arch/arm/kernel/head.S 中的內(nèi)核啟動(dòng)入口點(diǎn)。
Platform-specific actions首先使用__lookup_processor_type()檢查內(nèi)核類型,該函數(shù)返回一個(gè)碼,指定它在哪個(gè)內(nèi)核上運(yùn)行。然后使用函數(shù)__lookup_machine_type()來查找機(jī)器類型。然后定義一組基本的轉(zhuǎn)換表,映射內(nèi)核代碼。然后初始化緩存和MMU并設(shè)置其他控制寄存器。數(shù)據(jù)段被復(fù)制到 RAM 并調(diào)用start_kernel()。
Kernel start-up code原則上,啟動(dòng)順序的其余部分在任何架構(gòu)上都是相同的,但實(shí)際上某些功能仍然依賴于硬件。
使用 local_irq_disable() 禁用 IRQ 中斷,而 lock_kernel() 用于阻止 FIQ 中斷中斷內(nèi)核。它初始化tick control、內(nèi)存系統(tǒng)和特定于體系結(jié)構(gòu)的子系統(tǒng),并處理bootloader傳遞的命令行選項(xiàng)。設(shè)置堆棧并初始化 Linux 調(diào)度程序。設(shè)置各種內(nèi)存區(qū)域并分配頁面。設(shè)置中斷和異常表和處理程序,以及 GIC系統(tǒng)計(jì)時(shí)器已設(shè)置,此時(shí) IRQ 已啟用。進(jìn)行額外的內(nèi)存系統(tǒng)初始化,然后使用一個(gè)名為 BogoMips 的值來校準(zhǔn)核心時(shí)鐘速度。設(shè)置內(nèi)核的內(nèi)部組件,包括文件系統(tǒng)和初始化進(jìn)程,然后是創(chuàng)建內(nèi)核線程的線程守護(hù)進(jìn)程。內(nèi)核解鎖(啟用 FIQ)并啟動(dòng)調(diào)度程序調(diào)用函數(shù) do_basic_setup() 來初始化驅(qū)動(dòng)程序、sysctl、工作隊(duì)列和網(wǎng)絡(luò)套接字。此時(shí),執(zhí)行到用戶模式的切換。內(nèi)核虛擬內(nèi)存映射圖
總結(jié)
以上是生活随笔為你收集整理的电脑u启做系统-(U启动怎么做系统)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7硬盘装win8系统怎么安装-(如
- 下一篇: 怎么样把u盘变成路由器-(怎么样把u盘变