歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

U-Boot與Linux內核的交互

說明:本文所使用的U-Boot的版本是1.1.6,平台是S3C2440。

U-Boot源代碼下載地址 http://www.linuxidc.com/Linux/2011-07/38897.htm

目錄

一、簡介
1.1標記列表
二、設置標記存放的地址
2.1相關的結構體定義
2.2標記存放地址的設定
三、標記的設置
3.1設置標記ATAG_CORE
3.2設置內存標記ATAG_MEM
3.3設置命令行標記ATAG_CMDLINE
3.4設置ATAG_NONE

一、簡介

U-Boot與Linux內核的交互是單向的,U-Boot將各類參數傳遞給讷河。由於他們不能同時運行,傳遞辦法只能有一個個:U-Boot將參數放在某個約定的地方之後,在啟動內核,內核啟動後從這個地方獲得參數。

1.1標記列表

除了約定好參數存放的地方外,還要規定參數的結構。Linux2.4.x以後的內核都以標記列表(tagged list)的形式來傳遞參數。標記就是一種數據結構;標記列表就是挨著存放的多個標記。標記列表以標記ATAG_CORE開始,以ATAGE_NONE結束。

標記的數據結構為tag,它是偶一個tag_header結構和一個聯合體(union)組成。tag_header結構體表示標記的類型及長度,比如是表示內存還是表示命令行參數等。對於不同類型的標記使用不同的聯合體,比如表示內存=時使用tag_men32,表示命令行時使用tag_cmdline。其定定義在include/asm-arm/setup.c文件中。

  1. /*  
  2.  * The new way of passing information: a list of tagged entries  
  3.  */  
  4.   
  5. /* The list ends with an ATAG_NONE node. */  
  6. #define ATAG_NONE   0x00000000  
  7.   
  8. struct tag_header {  
  9.     u32 size;  
  10.     u32 tag;  
  11. };  
  12.   
  13. /* The list must start with an ATAG_CORE node */  
  14. #define ATAG_CORE   0x54410001  
  15.   
  16. struct tag_core {  
  17.     u32 flags;      /* bit 0 = read-only */  
  18.     u32 pagesize;  
  19.     u32 rootdev;  
  20. };  
  21.   
  22. /* it is allowed to have multiple ATAG_MEM nodes */  
  23. #define ATAG_MEM    0x54410002  
  24.   
  25. struct tag_mem32 {  
  26.     u32 size;  
  27.     u32 start;  /* physical start address */  
  28. };  
  29.   
  30. /* VGA text type displays */  
  31. #define ATAG_VIDEOTEXT  0x54410003  
  32.   
  33. struct tag_videotext {  
  34.     u8      x;  
  35.     u8      y;  
  36.     u16     video_page;  
  37.     u8      video_mode;  
  38.     u8      video_cols;  
  39.     u16     video_ega_bx;  
  40.     u8      video_lines;  
  41.     u8      video_isvga;  
  42.     u16     video_points;  
  43. };  
  44.   
  45. /* describes how the ramdisk will be used in kernel */  
  46. #define ATAG_RAMDISK    0x54410004  
  47.   
  48. struct tag_ramdisk {  
  49.     u32 flags;  /* bit 0 = load, bit 1 = prompt */  
  50.     u32 size;   /* decompressed ramdisk size in _kilo_ bytes */  
  51.     u32 start;  /* starting block of floppy-based RAM disk image */  
  52. };  
  53.   
  54. /* describes where the compressed ramdisk image lives (virtual address) */  
  55. /*  
  56.  * this one accidentally used virtual addresses - as such,  
  57.  * its depreciated.  
  58.  */  
  59. #define ATAG_INITRD 0x54410005  
  60.   
  61. /* describes where the compressed ramdisk image lives (physical address) */  
  62. #define ATAG_INITRD2    0x54420005  
  63.   
  64. struct tag_initrd {  
  65.     u32 start;  /* physical start address */  
  66.     u32 size;   /* size of compressed ramdisk image in bytes */  
  67. };  
  68.   
  69. /* board serial number. "64 bits should be enough for everybody" */  
  70. #define ATAG_SERIAL 0x54410006  
  71.   
  72. struct tag_serialnr {  
  73.     u32 low;  
  74.     u32 high;  
  75. };  
  76.   
  77. /* board revision */  
  78. #define ATAG_REVISION   0x54410007  
  79.   
  80. struct tag_revision {  
  81.     u32 rev;  
  82. };  
  83.   
  84. /* initial values for vesafb-type framebuffers. see struct screen_info  
  85.  * in include/linux/tty.h  
  86.  */  
  87. #define ATAG_VIDEOLFB   0x54410008  
  88.   
  89. struct tag_videolfb {  
  90.     u16     lfb_width;  
  91.     u16     lfb_height;  
  92.     u16     lfb_depth;  
  93.     u16     lfb_linelength;  
  94.     u32     lfb_base;  
  95.     u32     lfb_size;  
  96.     u8      red_size;  
  97.     u8      red_pos;  
  98.     u8      green_size;  
  99.     u8      green_pos;  
  100.     u8      blue_size;  
  101.     u8      blue_pos;  
  102.     u8      rsvd_size;  
  103.     u8      rsvd_pos;  
  104. };  
  105.   
  106. /* command line: \0 terminated string */  
  107. #define ATAG_CMDLINE    0x54410009  
  108.   
  109. struct tag_cmdline {  
  110.     char    cmdline[1]; /* this is the minimum size */  
  111. };  
  112.   
  113. /* acorn RiscPC specific information */  
  114. #define ATAG_ACORN  0x41000101  
  115.   
  116. struct tag_acorn {  
  117.     u32 memc_control_reg;  
  118.     u32 vram_pages;  
  119.     u8 sounddefault;  
  120.     u8 adfsdrives;  
  121. };  
  122.   
  123. /* footbridge memory clock, see arch/arm/mach-footbridge/arch.c */  
  124. #define ATAG_MEMCLK 0x41000402  
  125.   
  126. struct tag_memclk {  
  127.     u32 fmemclk;  
  128. };  
  129.   
  130. struct tag {  
  131.     struct tag_header hdr;  
  132.     union {  
  133.         struct tag_core     core;  
  134.         struct tag_mem32    mem;  
  135.         struct tag_videotext    videotext;  
  136.         struct tag_ramdisk  ramdisk;  
  137.         struct tag_initrd   initrd;  
  138.         struct tag_serialnr serialnr;  
  139.         struct tag_revision revision;  
  140.         struct tag_videolfb videolfb;  
  141.         struct tag_cmdline  cmdline;  
  142.   
  143.         /*  
  144.          * Acorn specific  
  145.          */  
  146.         struct tag_acorn    acorn;  
  147.   
  148.         /*  
  149.          * DC21285 specific  
  150.          */  
  151.         struct tag_memclk   memclk;  
  152.     } u;  
  153. };  
  154.   
  155. #define tag_next(t)<span > </span>((struct tag *)((u32 *)(t) + (t)->hdr.size))  
  156. #define tag_size(type)<span >  </span>((sizeof(struct tag_header) + sizeof(struct type)) >> 2) //???  
Copyright © Linux教程網 All Rights Reserved