u-boot2013.01デバイスツリーを使用してbootargsプロセス分析を取得する
u-bootデバイスツリー形式取得bootargs
1.プログラム呼び出しプロセス
2.詳細分析
3. create_fdt分析
参考文献:
http://blog.csdn.net/xy010902100449/article/details/46918145
Uboot mainlineはv 1から.1.3デバイスTreeのサポートを開始し、ARMのサポートはARMカーネルサポートデバイスTreeと同期して完了する.
デバイスTreeができるように、Ubootをコンパイルするときにconfigファイルに#define CONFIG_を入れる必要があります.OF_LIBFDT
Ubootでは、NAND、SDまたはTFT P等の任意の媒体から、dtbはメモリを読み込む、仮定する.dtbに入れるメモリアドレスは0 x 7100000であり、その後Ubootでコマンドfdt addrコマンド設定を実行することができる.dtbのアドレス:
U-Boot> fdt addr 0x71000000
fdtの他のコマンドは、fdt resize、fdt printなど、使用可能になります.
ARMではbootz kernel_を透過できますaddr initrd_address dtb_addressのコマンドはカーネル、すなわちdtb_を起動します.addressはbootzまたはbootmの最後のパラメータとして、1番目のパラメータはカーネルイメージのアドレスであり、2番目のパラメータはinitrdのアドレスであり、initrdが存在しなければ-で代用することができる.
1.プログラム呼び出しプロセス
do_bootm
bootm_start(cmdtp, flag, argc, argv)
bootm_load_os(images.os, &load_end, 1)
boot_fn = boot_os[images.os.os];
boot_fn(0, argc, argv, &images);
do_bootm_linux
boot_prep_linux
create_fdt(bootm_headers_t *images)
ftd_chosen
bootargs
2.詳細分析
do_bootm
bootm_start(cmdtp, flag, argc, argv)
bootm_load_os(images.os, &load_end, 1)
boot_fn = boot_os[images.os.os];
boot_fn(0, argc, argv, &images);
do_bootm_linux
boot_prep_linux
// 。
#ifdef CONFIG_OF_LIBFDT
if (images->ft_len) {
debug("using: FDT
");
if (create_fdt(images)) {
printf("FDT creation failed! hanging...");
hang();
}
} else
#endif
// , #define CONFIG_OF_LIBFDT ( origen.h (\include\configs)
boot_jump_linux
3. create_fdt分析
static int create_fdt(bootm_headers_t *images)
ulong of_size = images->ft_len;
char **of_flat_tree = &images->ft_addr;
ulong *initrd_start = &images->initrd_start;
ulong *initrd_end = &images->initrd_end;
struct lmb *lmb = &images->lmb;
ulong rd_len;
int ret;
boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree);
// fdt
ret = boot_ramdisk_high(lmb, images->rd_start, rd_len,initrd_start, initrd_end);
//ramdisk ,
ret = boot_relocate_fdt(lmb, of_flat_tree, &of_size);
// 。 ret = boot_relocate_fdt(lmb, of_flat_tree, &of_size);
fdt_chosen(*of_flat_tree, 1);
// chosen node ,
str = getenv("bootargs");
//
err = fdt_setprop(fdt, nodeoffset,"bootargs", str, strlen(str)+1);
// bootargs
fixup_memory_node(*of_flat_tree);
for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
start[bank] = bd->bi_dram[bank].start;
size[bank] = bd->bi_dram[bank].size;
}
//
fdt_fixup_memory_banks(blob, start, size, CONFIG_NR_DRAM_BANKS);
// memory node
fdt_fixup_ethernet(*of_flat_tree);
// fdt
fdt_initrd(*of_flat_tree, *initrd_start, *initrd_end, 1);
//ramdisk fdt
4. boot_jump_linux
#ifdef CONFIG_OF_LIBFDT
if (images->ft_len)
r2 = (unsigned long)images->ft_addr;
else
#endif
kernel_entry(0, machid, r2);
// , 。
// , gd->bd->bi_boot_params; 0x30001000
参考文献:
http://blog.csdn.net/xy010902100449/article/details/46918145
Uboot mainlineはv 1から.1.3デバイスTreeのサポートを開始し、ARMのサポートはARMカーネルサポートデバイスTreeと同期して完了する.
デバイスTreeができるように、Ubootをコンパイルするときにconfigファイルに#define CONFIG_を入れる必要があります.OF_LIBFDT
Ubootでは、NAND、SDまたはTFT P等の任意の媒体から、dtbはメモリを読み込む、仮定する.dtbに入れるメモリアドレスは0 x 7100000であり、その後Ubootでコマンドfdt addrコマンド設定を実行することができる.dtbのアドレス:
U-Boot> fdt addr 0x71000000
fdtの他のコマンドは、fdt resize、fdt printなど、使用可能になります.
ARMではbootz kernel_を透過できますaddr initrd_address dtb_addressのコマンドはカーネル、すなわちdtb_を起動します.addressはbootzまたはbootmの最後のパラメータとして、1番目のパラメータはカーネルイメージのアドレスであり、2番目のパラメータはinitrdのアドレスであり、initrdが存在しなければ-で代用することができる.