深入嵌入式系統的 BootLoader

2021-06-09 00:18:20 字數 3200 閱讀 9357

/黑公尺/

「設定核心的啟動引數」

是啊  我原來以為只要傳乙個大小就可以了,不用管幾段的。。結果掛載ramdisk的時候 就是識別不到第2個控制器上的映像。。但是uboot確是可以使用的。

呵呵 這也是經驗吧

// 記憶體段tag的設定

static void setup_memory_tags (bd_t *bd)

// 初始化記憶體相關 tag

2 、kernel 讀取u-boot 傳遞的相關引數

對於 linux kernel , arm 平台啟動時,先執行 arch/arm/kernel/head.s ,此檔案會呼叫 arch/arm/kernel/head-common.s 中的函式,並最後呼叫 start_kernel :

b     start_kernel

start_kernel()

setup_arch(&command_line);

其中, setup_arch 函式在 arch/arm/kernel/setup.c 檔案中實現,如下:

void __init setup_arch(char **cmdline_p)

struct tag *tags = (struct tag *)&init_tags;

struct machine_desc *mdesc;

char *from = default_command_line;

setup_processor();

mdesc = setup_machine(machine_arch_type);

machine_name = mdesc->name;

if (mdesc->soft_reboot)

reboot_setup("s");

if (__atags_pointer)             

// 指向各種 tag 起始位置的指標,定義如下:

//unsigned int __atags_pointer  __initdata;

// 此指標指向 __initdata 段,各種 tag 的資訊儲存在這個段中。

tags = phys_to_virt(__atags_pointer);

else if (mdesc->boot_params)

tags = phys_to_virt(mdesc->boot_params);

if (tags->hdr.tag != atag_core)

convert_to_tag_list(tags);

if (tags->hdr.tag != atag_core)

tags = (struct tag *)&init_tags;

if (mdesc->fixup)

mdesc->fixup(mdesc, tags, &from, &meminfo);

if (tags->hdr.tag == atag_core) gd_t;

在 u-boot 中使用 gd 結構之前要用先用巨集 declare_global_data_ptr 來宣告。這個巨集的定義如下:

include/asm-arm/global_data.h

#define declare_global_data_ptr register volatile gd_t *gd asm ("r8")

從這個巨集的定義可以看出, gd 是乙個儲存在 arm 的 r8 暫存器中的 gd_t 結構體的指標。

說明:本文的版本為u-boot-1.3.4 、linux-2.6.28 ,平台是arm 。

//補充一下:

來自:bootloader巧妙地利用函式指標及傳參規範將r0:0x0,r1:機器號,r2:引數位址傳遞給核心.由於r0,r1比較簡單,不需要再作說明.需要花點時間了解的是r2暫存器.

r2暫存器傳遞的是乙個指標,這個指標指向乙個tag區域.uboot和linux核心之間正是通過這個擴充套件了的tag區域來進行複雜引數的傳遞,如commandline,檔案系統資訊等等,使用者也可以擴充套件這個tag來進行更多引數的傳遞.tag區域存放的位址,也就是r2的值,是在/board/yourboard/youboard.c裡的board_init函式中初始化的,如在ub4020中初始化為:gd->bd->bi_boot_params = 0x30000100;,這是乙個絕對位址.

tag區的結構比較簡單,可以視為乙個乙個tag的排列(陣列?),每乙個tag傳遞一種特定型別的引數.各種系統tag的定義可以參考./include/asm-arm/setup.h.

下面是乙個tag區的例子:

0x30000100 00000005 54410001 00000000 00000000

0x30000110 00000000 0000000f 54410009 746f6f72

0x30000120 65642f3d 61722f76 7220306d 6f632077

0x30000130 6c6f736e 74743d65 2c305379 30303639

0x30000140 696e6920 6c2f3d74 78756e69 ea006372

0x30000150 00000004 54420005 30300040 00200000

0x30000160 00000000 00000000

我們可以看到一共有三個tag:

第乙個tag的長度是5個字,型別是atag_core(54410001),有三個元素,均為全零.tag區必須以這個tag開頭.

第二個tag的長度是f個字,型別是atag_cmdline(54410009),這是乙個字串,是向核心傳遞的kernel command line

第三個tag的長度是4個字,型別是atag_initrd2(54410005),有兩個元素,第乙個是start:30300040(30300000+40),第二個是size:200000(2m)

如果說還有第四個tag,那就是末尾的兩個全零,這是tag結束的標誌.

這些tag是在./lib_arm/arm_linux.c中的do_bootm_linux函式中建立起來的.具體建立哪些tag,由相應的控制巨集決定.具體可以參考相應**.例子中第乙個tag是起始tag,如果環境變數中有bootargs,則建立第二個tag,如果bootm有兩個引數(引導檔案系統),則會讀取檔案系統頭部的必要資訊,建立第三個tag.

核心啟動後,將根據r2暫存器的值找到這些tag,並根據tag型別,呼叫相應的處理函式進行處理,從而獲取核心執行的必要資訊.

嵌入式系統

嵌入式開發的相關領域 搞嵌入式若能熟悉嵌入式應用的一些主要領域,這樣的人更受企業歡迎。主要的相關 領域包括 a 數字影象壓縮技術 這是嵌入式最重要最熱門的應用領域之一,主要是應掌握mpeg 編譯碼演算法和技術,如 pda 高精電視 機頂盒等都涉及mpeg高速解碼問 題。b 通訊協議及程式設計技術 這...

嵌入式系統

嵌入式系統就是計算機系統的一類,就是被塞進其他裝置的計算機作業系統。我的嵌入式老師只用了三個詞語就總結了嵌入式系統的精髓 專用的可裁剪的 計算機系統。包括嵌入式軟體開發的知識體系和背景 先說背景 計算機,領域內,知識體系,按層次分,可以分為 其中 此處,暫且不討論上層的純軟體,以及底層的硬體,只是簡...

嵌入式系統

硬體結構 軟體結構 作業系統 vxworks商用嵌入式系統的代表 嵌入式linux 採用的是linux的核心,大多數採用的是linux的微核心 微核心本身只提供一些最基本的作業系統功能,如任務排程 記憶體管理 中斷處理等,而類似於檔案系統和網路協議等附加功能則執行在使用者空間中 交叉編譯 交叉編譯 ...