Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1638528
  • 博文数量: 197
  • 博客积分: 10046
  • 博客等级: 上将
  • 技术积分: 1983
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-07 12:36
个人简介

在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。

文章分类
文章存档

2011年(2)

2010年(6)

2009年(18)

2008年(30)

2007年(100)

2006年(41)

分类: LINUX

2009-06-19 17:14:09

 

转载:  一段。

 

内核链接和装入

  一旦为目标系统编译了内核后,通过使用引导装载程序(它已经被装入到目标的闪存中),内核就被装入到目标系统的内存(在 DRAM 中或者在闪存中)。通过使用串行、USB 或以太网端口,引导装载程序与主机通信以将内核传送到目标的闪存或 DRAM 在将内核完全装入目标后,引导装载程序将控制传递给装入内核的地址

内核可执行文件由许多链接在一起的对象文件组成。对象文件有许多节,如文本、数据、init 数据、bass 等等。这些对象文件都是由一个称为 链接器脚本的文件   链接并装入的。这个链接器脚本的功能是将输入对象文件的各节映射到输出文件中;换句话说,它将所有输入对象文件都链接到单一的可执行文件中

将该可执行文件的各节装入到指定地址处。 这句话是指kernel被运行的时候, 各个段被load到各个指定的地址处。

vmlinux.lds是存在于 arch// 目录中的内核链接器脚本,它负责链接内核的各个节并将它们装入内存中特定偏移量处。典型的 vmlinux.lds 看起来象这样:

  清单 2. 典型的 vmlinux.lds 文件

  OUTPUT_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 是内核的虚拟起始地址

注意:虚拟起始地址并不是最终的kernelentry,即不是kernel_entry

并且在 arch// 下的 Makefile 中指定它的值。这个地址必须与引导装载程序使用的地址相匹配。

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

  参数传递和内核引导

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

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

 

 

====================================

下面是bob(就是我,本blog作者的一些体会)。

 

讨论来自: 

 

最后的结论都比较清晰了。

 

 

阅读(2152) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~