這篇文章英文原版“ARM Linux Kernel Boot Requirements”,是ARM Linux核心的維護者Russell King寫的。在此我將其簡易的翻譯成中文,方便大家學習下。
原版:http://www.arm.linux.org.uk/developer/booting.php
Author: Russell King
Initial date: May 18, 2002
Revision: 1 - 17 September 20042 - 30 September 2004
為了啟動ARM Linux,首先,你需要一個bootloader,它是一個很小的程式(在核心運行之前啟動)。bootloader的第一階段作用就是初始化各種硬體裝置,最後,就是調用核心,並且將第一階段的各種參數傳遞給核心。
本質上將,bootloader程式應提供(最小限度)如下幾個方面:
1、設定和初始化化RAM
2、初始化一個串口
3、檢測機器類型
4、設定核心啟動需要的標記列表
5、調用核心鏡像
1、設定和初始化RAM
現有的bootloader:強制性的(必須的)
新的bootloader:強制性的(必須的)
bootloader被用來去找到並初始化所有核心將用於非易失性資料存放區系統中使用的記憶體。它完成那些動作都是在機器依賴的方式下完成的。(它可能採用內部演算法來自動定位和分類所有的RAM,或者它可能採用特定機器的RAM的相關知識,或者任何其它的、設計者認為合適的方法)。
2、初始化一個串口
現有的bootloader:可選的,推薦使用的
新的bootloader:可選的,推薦使用的
bootloader在這個過程應該以初始化、使能一個串口裝置為目標。這使得核心的串列驅動程式自動檢測哪一個串口應該被用來作為核心的控制台。(一般用於調試或者通訊的目的)。
可供選擇的,通過特定的串口標記列表,bootloader可以向核心傳遞諸如“console=”相關的參數,還可以傳遞一些串口格式的參數,比如在linux/Documentation/kernel-parameters.txt中描述的。
3、檢測機器ID
現有的bootloader:可選的
新的bootloader:強制性的(必須的)
bootloader必須建立和初始化核心標記列表。一個有效標記列表開始於ATAG_CORE這個標記,結束於ATAG_NONE,ATAG_CORE可能會是空的,或者也可能不是。一個空ATAG_CORE標記的大小被設定為'2' (0x00000002),ATAG_NONE這個標記的大小必須設定為0。
任何號碼的標記都可以放置在這個標記列表中。但是,重複的標記是否附加到前面的標記所攜帶的資訊中,或者它是否會取代完整的資訊,這些都是不確定的。
The boot loader must pass at a minimum the size and location ofthe system memory, and root filesystem location,因此,最小的標記列表如下:
+-----------+base ->| ATAG_CORE | |+-----------+ || ATAG_MEM | | increasing address+-----------+ || ATAG_NONE | |+-----------+ v
這個標記列表應該存放在系統的RAM中。
這個標記列表必須放置在一塊記憶體區中,這塊記憶體區核心既不能解壓,臨時的檔案系統也不能覆蓋它。一般推薦的這個記憶體位置為RAM的第一個16KB大小處。
5、調用核心鏡像
現有的bootloader:強制性的(必須的)
新的bootloader:強制性的(必須的)
bootloader在調用核心的時候提供了連個選項。如果zImage鏡像儲存在Flash中,並且它被正確的連結為從Flash中啟動,那麼,bootloader直接從Flash調用zImage就是合法的(有效)。
zImage還可能放置在系統的RAM(RAM的任何位置)中,並且在那裡被調用。請注意,核心使用核心鏡像下的16KB RAM來存放頁表。所以,這個頁表推薦放置在RAM的第32KB處。
在上述的兩種情況下,必須滿足以下條件:
●CPU 寄存器設定
★ r0=0;
★ r1=機器ID(上述第三步中發現的)
★ r2=標記列表在RAM的物理地址
●CPU 模式
★ 所有的中斷必須禁用
★ CPU必須設定為SVC模式(作業系統保護模式),
● 快取、MMUs
★ 關MMU(記憶體映射)
★指令緩衝可以設為開或者關
★ 必須關資料緩衝,並且其中不能含有“髒資料”
● 裝置
★ 不響應DMA裝置
● bootloader通過直接跳轉到核心鏡像的第一條指令來最終實現核心的調用。