Chinaunix首页 | 论坛 | 博客

OS

  • 博客访问: 2229502
  • 博文数量: 691
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2660
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-05 12:49
个人简介

不浮躁

文章分类

全部博文(691)

文章存档

2019年(1)

2017年(12)

2016年(99)

2015年(207)

2014年(372)

分类: 嵌入式

2015-12-13 11:54:59

—struct tag (以及补充)
U-boot 会给 Linux Kernel 传递很多参数,如:串口, RAM , videofb 等。而 Linu
x kernel 也会读取和处理这些参数。两者之间通过 struct tag 来传递参数。 U-boot 把
要传递给 kernel 的东西保存在 struct tag 数据结构中,启动 kernel 时,把这个结构体
的物理地址传给 kernel ; Linux kernel 通过这个地址,用 parse_tags 分析出传递过来
的参数。
本文主要以 U-boot 传递 RAM 和 Linux kernel 读取 RAM 参数为例进行说明。

u-boot 给kernel 传RAM 参数

./common/cmd_bootm.c 文件中, bootm 命令对应的 do_bootm 函数,当分析 uI
mage 中信息发现 OS 是 Linux 时 , 调用 ./lib_arm/bootm.c 文件中的 do_bootm_lin
ux 函数来启动 Linux kernel 。
在 do_bootm_linux 函数中:
void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
ulong addr, ulong *len_ptr, int verify)
{
......
#if defined (CONFIG_SETUP_MEMORY_TAGS) || \
defined (CONFIG_CMDLINE_TAG) || \
defined (CONFIG_INITRD_TAG) || \
defined (CONFIG_SERIAL_TAG) || \
defined (CONFIG_REVISION_TAG) || \
defined (CONFIG_LCD) || \
defined (CONFIG_VFD)
setup_start_tag (bd); // 初始化 tag 结构体开始
#ifdef CONFIG_SERIAL_TAG
setup_serial_tag (?ms);
#endif
#ifdef CONFIG_REVISION_TAG
setup_revision_tag (?ms);
#endif
#ifdef CONFIG_SETUP_MEMORY_TAGS
setup_memory_tags (bd); // 设置 RAM 参数
#endif
#ifdef CONFIG_CMDLINE_TAG
setup_commandline_tag (bd, commandline);
#endif
#ifdef CONFIG_INITRD_TAG
if (initrd_start && initrd_end)
setup_initrd_tag (bd, initrd_start, initrd_end);
#endif
#if defined (CONFIG_VFD) || defined (CONFIG_LCD)
setup_videolfb_tag ((gd_t *) gd);
#endif
setup_end_tag (bd); // 初始化 tag 结构体结束
#endif
......
......
theKernel (0, machid, bd->bi_boot_params);
// 传给 Kernel 的参数= (struct tag *) 型的 bd->bi_boot_params
//bd->bi_boot_params 在 board_init 函数中初始化如对于 at91rm9200 ,初始化在 at91r
m9200dk.c 的 board_init 中进行: bd->bi_boot_params =PHYS_SDRAM + 0x100;
// 这个地址也是所有 taglist 的首地址,见下面的 setup_start_tag 函数
}
对于 setup_start_tag 和 setup_memory_tags 函数说明如下。
函数 setup_start_tag 也在此文件中定义,如下:
static void setup_start_tag (bd_t *bd)
{
params = (struct tag *) bd->bi_boot_params;
// 初始化 (struct tag *) 型的全局变量 params 为bd->bi_boot_params 的地址,之后的setup tags 相关
函数如下面的 setup_memory_tags 就把其它 tag 的数据放在此地址的偏移地址上。
params->hdr.tag = ATAG_CORE;
params->hdr.size = tag_size (tag_core);
params->u.core.flags = 0;
params->u.core.pagesize = 0;
params->u.core.rootdev = 0;
params = tag_next (params);
}
RAM 相关参数在 bootm.c 中的函数 setup_memory_tags 中初始化:
static void setup_memory_tags (bd_t *bd)
{
int i;
for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
params->hdr.tag = ATAG_MEM;
params->hdr.size = tag_size (tag_mem32);
params->u.mem.start = bd->bi_dram[i].start;
params->u.mem.size = bd->bi_dram[i].size;
params = tag_next (params);
} // 初始化内存相关 tag
}
阅读(1334) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~