18、Bootloader(2)--Bootloader与内核的交互,或者说传参

来源:互联网 发布:德拉蒙德格林数据 编辑:程序博客网 时间:2024/04/30 12:29
   Bootloader与内核的交互是单向的,Bootloader将各类参数传给内核,由于它们不能同时运行,传递办法只有一个:Bootloader将参数放在某个约定的地方之后,再启动内核,内核启动后从这个地方获得参数(参数地址)

    参数的地址约定好后,还要规定参数的结构,以标记列表(tagged list)的形式来传递启动参数。标记,就是一种数据结构;标记列表,就是挨着存放的多个标记。标记列表以标记ATAG_CORE开始,以标记ATAG_NONE结束

    标记的数据结构为tag,它由一个tag_header结构和一个联合(union)组成,tag_header表示标记的类型及长度,其定义在“include/asm-arm/setup.h”中

 

以设置内存标记、命令行标记为例说明参数的传递

 (1)设置标记ATAG_CORE

     假设Bootloader与内核约定的参数存放地址为0x30000100,则ATAG_CORE可以如下设置

     params = (struct tag *)0x30000100;                                                  

                                                                                             

     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);      //tag_next指向当前标记的结尾

  (2)设置内存标记

     假设开发板使用的内存起始地址为0x30000000,大小为0x4000000,则内存标记可以如下设置

    

 

     params->hdr.tag = ATAG_MEM;                                                            

     params->hdr.size = tag_size(tag_mem32);

    

     params->u.mem.start = 0x30000000;                           

     params->u.mem.size = 0x4000000;

 

     params = tag_next(params);

   

 (3)设置命令行标记

      命令行就是一个字符串,它被用来控制内核的一些行为,如“root= /dev/mtdblock 2 init=/linuxrc console=ttySAC0”表示根文件系统在MTD2分区上,系统启动后执行的第一个程序为/linuxrc,控制台为ttySAC0

      命令行可以在Bootloader中通过命令设置好,然后传递给内核

     

      char *p = “root= /dev/mtdblock 2 init=/linuxrc console=ttySAC0”

      params->hdr.tag = ATAG_CMDLINE;                                                            

      params->hdr.size = (sizeof(struct tag_header+strlen(p)+1+4))>>2;   

      strcpy(params->u.cmdline.cmdline, p);

      params = tag_next(params);   

 (4)设置标记ATAG_NONE

     标记列表以标记ATAG_NONE结束,如下设置:

    

     params->hdr.tag = ATAG_NONE;                                                            

     params->hdr.size = 0;

 

PS:第三步设置命令行标记,也可以在配置LINUX时设定,执行 #make menuconfig后在“Boot Option”的第三行输入命令

原创粉丝点击