您当前的位置:五五电子网电子知识单片机-工控设备嵌入式系统-技术嵌入式设备上的 Linux 系统开发 正文
嵌入式设备上的 Linux 系统开发

嵌入式设备上的 Linux 系统开发

点击数:7382 次   录入时间:03-04 11:51:55   整理:http://www.55dianzi.com   嵌入式系统-技术


清单 2. 典型的 vmlinux.lds 文件
OUTPUT_ARCH(<arch>)      /* <arch> includes architecture type */ 
 ENTRY(stext)               /* stext is the kernel entry point */ 
 SECTIONS                   /* SECTIONS command describes the layout
                   of the output file */ 
 { 
     .  = TEXTADDR;         /* TEXTADDR is LMA for the kernel */ 
     .init : {          /* Init code and data*/ 
              _stext = .;       /* First section is stext followed 
                   by __init data section */ 
              __init_begin = .; 
                     *(.text.init) 
              __init_end = .; 
             } 
     .text : {          /* Real text segment follows __init_data section */ 
              _text = .; 
                     *(.text) 
              _etext = .;       /* End of text section*/ 
             } 
     .data :{ 
              _data=.;          /* Data section comes after text section */ 
                     *(.data) 
              _EDAta=.;  
             }                  /* Data section ends here */ 
     .bss : {                   /* BSS section follows symbol table section */ 
              __bss_start = .; 
                     *(.bss) 
              _end = . ;        /* BSS section ends here */  
             } 
  } 
 


LMA 是装入模块地址;它表示将要装入内核的目标虚拟内存中的地址。 TEXTADDR 是内核的虚拟起始地址,并且在 arch/<target>/ 下的 Makefile 中指定它的值。这个地址必须与引导装载程序使用的地址相匹配。 

一旦引导装载程序将内核复制到闪存或 DRAM 中,内核就被重新定位到 TEXTADDR — 它通常在 DRAM 中。然后,引导装载程序将控制转给这个地址,以便内核能开始执行。 

参数传递和内核引导

stext 是内核入口点,这意味着在内核引导时将首先执行这一节下的代码。它通常用汇编语言编写,并且通常它在 arch/<target>/ 内核目录下。这个代码设置内核页面目录、创建身份内核映射、标识体系结构和处理器以及执行分支 start_kernel (初始化系统的主例程)。 

start_kernel 调用 setup_arch 作为执行的第一步,在其中完成特定于体系结构的设置。这包括初始化硬件寄存器、标识根设备和系统中可用的 DRAM 和闪存的数量、指定系统中可用页面的数目、文件系统大小等等。所有这些信息都以参数形式从引导装载程序传递到内核。 

将参数从引导装载程序传递到内核有两种方法:parameter_structure 和标记列表。在这两种方法中,不赞成使用参数结构,因为它强加了限制:指定在内存中,每个参数必须位于 param_struct 中的特定偏移量处。最新的内核期望参数作为标记列表的格式来传递,并将参数转化为已标记格式。 param_struct 定义在 include/asm/setup.h 中。它的一些重要字段是: 


清单 3. 样本参数结构
struct param_struct  { 
  unsigned long page_size;     /* 0:  Size of the page  */ 
  unsigned long nr_pages;      /* 4:  Number of pages in the system */ 
  unsigned long ramdisk        /* 8: ramdisk size */ 
  unsigned long rootdev;       /* 16: Number representing the root devICe */ 
  unsigned long initrd_start;  /* 64: starting address of initial ramdisk */
                                      /* This CAN be either in flash/dram */ 
  unsigned long initrd_size;   /* 68: size of initial ramdisk */ 
 }
 


请注意:这些数表示定义字段的参数结构中的偏移量。这意味着如果引导装载程序将参数结构放置在地址 0xc0000100,那么 rootdev 参数将放置在 0xc0000100 + 16,initrd_start 将放置在 0xc0000100 + 64 等等 ― 否则,内核将在解释正确的参数时遇到困难。

正如上面提到的,因为从引导装载程序到内核的参数传递会有一些约束条件,所以大多数 2.4.x 系列内核期望参数以已标记的列表格式传递。在已标记的列表中,每个标记由标识被传递参数的 tag_header 以及其后的参数值组成。标记列表中标记的常规格式可以如下所示:

上一页  [1] [2] [3] [4] [5] [6]  下一页


本文关键字:嵌入式  开发  Linux  嵌入式系统-技术单片机-工控设备 - 嵌入式系统-技术