Uboot如何向内核传递参数[文].pdf
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
Uboot 向内核传递参数机制详解 在嵌入式系统中,Uboot 是一个开源的引导加载器,负责将操作系统的内核加载到内存中并启动。为了让内核正常工作,Uboot 需要向内核传递一些必要的参数,本文将详细介绍 Uboot 向内核传递参数的机制。 启动参数的传递过程 ------------------- 在 Linux 内核启动时,引导加载器 Uboot 将启动参数封装在一个数据结构中,并将其拷贝到某个地址。然后,在跳转到内核入口地址时,Uboot 通过通用寄存器 R2 传递该地址的值。下面是 Uboot 跳转到 Linux 内核的代码: ``` theKernel (0, bd->bi_arch_number, bd->bi_boot_params); ``` 其中,`theKernel` 并不是一个函数,而是一个指向内核入口地址的指针。通过强行转化为带三个参数的函数指针,Uboot 将三个参数保存到通用寄存器中,实现了向内核传递参数的功能。在这个例子中,R0 将被赋值为 0,R1 将被赋值为机器号,R2 将被赋值为启动参数数据结构的首地址。 启动参数的数据结构 ------------------- 启动参数可以保存在两种数据结构中:`param_struct` 和 `tag`。其中,`param_struct` 是 2.4 内核用的,`tag` 是 2.6 以后的内核用的。但是,到目前为止,2.6 的内核也可以兼容 `param_struct` 结构。 `param_struct` 结构的定义如下: ```c struct param_struct { union { struct { unsigned long page_size; /* 0 */ unsigned long nr_pages; /* 4 */ unsigned long ramdisk_size; /* 8 */ unsigned long flags; /* 12 */ #define FLAG_READONLY 1 #define FLAG_RDLOAD 4 #define FLAG_RDPROMPT 8 unsigned long rootdev; /* 16 */ unsigned long video_num_cols; /* 20 */ unsigned long video_num_rows; /* 24 */ unsigned long video_x; /* 28 */ unsigned long video_y; /* 32 */ unsigned long memc_control_reg; /* 36 */ unsigned char sounddefault; /* 40 */ unsigned char adfsdrives; /* 41 */ unsigned char bytes_per_char_h; /* 42 */ unsigned char bytes_per_char_v; /* 43 */ unsigned long pages_in_bank[4]; /* 44 */ unsigned long pages_in_vram; /* 60 */ unsigned long initrd_start; /* 64 */ unsigned long initrd_size; /* 68 */ unsigned long rd_start; /* 72 */ unsigned long system_rev; /* 76 */ unsigned long system_serial_low; /* 80 */ unsigned long system_serial_high; /* 84 */ unsigned long mem_fclk_21285; /* 88 */ } s; char unused[256]; } u1; union { char paths[8][128]; struct { unsigned long magic; char n[1024 - sizeof(unsigned long)]; } s; } u2; char commandline[COMMAND_LINE_SIZE]; }; ``` 在实际使用中,只需要设置 `commandline`、`u1.s.page_size`、`u1.s.nr_pages` 三个域。 对于 `tag` 结构来说,在实际使用中是一个 `struct tag` 组成的列表,在 `tag->tag_header` 中,一项是 `u32 tag`(重名,注意类型),其值用宏 `ATAG_CORE`、`ATAG_MEM`、`ATAG_CMDLINE`、`ATAG_NONE` 等等来表示。此时,下面 union 就会使用与之相关的数据结构。同时,规定 `tag` 列表中第一项必须是 `ATAG_CORE`,最后一项必须是 `ATAG_NONE`。 Uboot 向内核传递参数的机制主要通过封装启动参数到数据结构中,并将其传递到内核入口地址。同时,Uboot 也需要将启动参数的地址值传递给内核,以便内核可以正确地读取启动参数。
- 粉丝: 2
- 资源: 12万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助