Uboot 如何向内核传递参数
一: 启动参数的传递过程
启动参数是包装在数据结构里的 ,在 linux kernel 启动的时候 ,bootloader 把这个数据结构拷贝到某个地
址,
在改动 PC 跳向内核接口的同时 , 通过通用寄存器 R2 来传递这个地址的值 ,下面这句话就是 uboot 跳向
linux
kernel 的代码 (bootm 命令 )
theKernel (0, bd->bi_arch_number, bd->bi_boot_params);
thekernel 其实不是个函数 ,而是指向内核入口地址的指针 , 把它强行转化为带三个参数的函数指针 , 会把三
个
参数保存到通用寄存器中 ,实现了向 kernel 传递信息的功能 ,在这个例子里 ,会把 R0 赋值为 0,R1 赋值为机
器号
R2 赋值为启动参数数据结构的首地址
因此 ,要向内核传递参数很简单 , 只要把启动参数封装在 linux 预定好的数据结构里 ,拷贝到某个地址 (一般
约定俗成是内存首地址 +100dex)
二: 启动参数的数据结构
启动参数可保存在两种数据结构中 ,param_struct 和 tag, 前者是 2.4 内核用的 , 后者是 2.6 以后的内核更
期望用的
但是 ,到目前为止 ,2.6 的内核也可以兼容前一种结构 ,两种数据结构具体定义如下 (arm cpu):
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 */