http://blog.chinaunix.net/u/31100/showart_244622.html

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

Author: taoyuetao

Email: tao_yuetao@yahoo.com.cn

Blog: taoyuetao.cublog.cn

2006-11-03

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

内核编译链接过程是依靠vmlinux.lds文件,以arm为例vmlinux.lds文件位于kernel/arch/arm/vmlinux.lds,

但是该文件是由vmlinux-armv.lds.in生成的,根据编译选项的不同源文件还可以是vmlinux-armo.lds.in,

vmlinux-armv-xip.lds.in。

vmlinux-armv.lds的生成过程在kernel/arch/arm/Makefile中

(在2.6中没有找到这个,在/arch/arm/boot/Makefile)

LDSCRIPT     = arch/arm/vmlinux-armv.lds.in

arch/arm/vmlinux.lds: arch/arm/Makefile $(LDSCRIPT) /

$(wildcard include/config/cpu/32.h) /

$(wildcard include/config/cpu/26.h) /

$(wildcard include/config/arch/*.h)

@echo '  Generating $@'

@sed 's/TEXTADDR/$(TEXTADDR)/;s/DATAADDR/$(DATAADDR)/' $(LDSCRIPT) >$@

vmlinux-armv.lds.in文件的内容:

OUTPUT_ARCH(arm)

ENTRY(stext)

SECTIONS

{

. = TEXTADDR;

.init : {           /* Init code and data       */

_stext = .;

__init_begin = .;

*(.text.init)

__proc_info_begin = .;

*(.proc.info)

__proc_info_end = .;

__arch_info_begin = .;

*(.arch.info)

__arch_info_end = .;

__tagtable_begin = .;

*(.taglist)

__tagtable_end = .;

*(.data.init)

. = ALIGN(16);

__setup_start = .;

*(.setup.init)

__setup_end = .;

__initcall_start = .;

*(.initcall.init)

__initcall_end = .;

. = ALIGN(4096);

__init_end = .;

}

其中TEXTADDR就是内核启动的虚拟地址,定义在kernel/arch/arm/Makefile中:

ifeq ($(CONFIG_CPU_32),y)

PROCESSOR    = armv

TEXTADDR     = 0xC0008000

LDSCRIPT     = arch/arm/vmlinux-armv.lds.in

endif

需要注意的是这里是虚拟地址而不是物理地址。

一般情况下都在生成vmlinux后,再对内核进行压缩成为zImage,压缩的目录是kernel/arch/arm/boot。

下载到flash中的是压缩后的zImage文件,zImage是由压缩后的vmlinux和解压缩程序组成,如下图所示:

|-----------------|/    |-----------------|

|                    | /   |                    |

|                    |  /  | decompress code |

|     vmlinux        /  |-----------------|    zImage

|                    |    /|                    |

|                    |     |                    |

|                    |     |                    |

|                    |     |                    |

|                    |    /|-----------------|

|                    |   /

|                    |  /

|                    | /

|-----------------|/

zImage链接脚本也叫做vmlinux.lds,位于kernel/arch/arm/boot/compressed。

是由同一目录下的vmlinux.lds.in文件生成的,内容如下:

OUTPUT_ARCH(arm)

ENTRY(_start)

SECTIONS

{

. = LOAD_ADDR;   //这个在2.6中已经去掉了

_load_addr = .;    //也去掉

. = TEXT_START;

_text = .;

.text : {

_start = .;

其中LOAD_ADDR就是zImage中解压缩代码的ram偏移地址,TEXT_START是内核ram启动的偏移地址,这个地址是物理地址。

在kernel/arch/arm/boot/Makefile文件中定义了:

ZTEXTADDR   =0

ZRELADDR     = 0xa0008000  //这个在2.6中是makefile.boot定义

ZTEXTADDR就是解压缩代码的ram偏移地址,ZRELADDR是内核ram启动的偏移地址,这里看到指定ZTEXTADDR的地址为0,

明显是不正确的,因为我的平台上的ram起始地址是0xa0000000,在Makefile文件中看到了对该地址设置的几行注释:

# We now have a PIC decompressor implementation.  Decompressors running

# from RAM should not define ZTEXTADDR.  Decompressors running directly

# from ROM or Flash must define ZTEXTADDR (preferably via the config)

他的意识是如果是在ram中进行解压缩时,不用指定它在ram中的运行地址,如果是在flash中就必须指定他的地址。所以

这里将ZTEXTADDR指定为0,也就是没有真正指定地址。

在kernel/arch/arm/boot/compressed/Makefile文件有一行脚本:

SEDFLAGS    = s/TEXT_START/$(ZTEXTADDR)/;s/LOAD_ADDR/$(ZRELADDR)/;s/BSS_START/$(ZBSSADDR)/

//2.6改为s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/

使得TEXT_START = ZTEXTADDR,LOAD_ADDR = ZRELADDR。

这样vmlinux.lds的生成过程如下:

vmlinux.lds:    vmlinux.lds.in Makefile $(TOPDIR)/arch/$(ARCH)/boot/Makefile $(TOPDIR)/.config

@sed "$(SEDFLAGS)" < vmlinux.lds.in > $@

以上就是我对内核启动地址的分析,总结一下内核启动地址的设置:

1、设置kernel/arch/arm/Makefile文件中的

TEXTADDR     = 0xC0008000 //2.6暂时没找到

内核启动的虚拟地址

2、设置kernel/arch/arm/boot/Makefile文件中的

ZRELADDR     = 0xa0008000

内核启动的物理地址

如果需要从flash中启动还需要设置

ZTEXTADDR地址。

linux 内核load addr,linux2.4启动分析(1)---内核启动地址的确定 vmlinux LOAD_ADDR ZRELADDR...相关推荐

  1. Uboot启动分析--start.S启动分析(1)

    总目录 NXP i.MX8M secure boot流程 Uboot链接脚本分析述 Uboot启动分析–start.S启动分析(1) Uboot启动分析–start.S启动分析(2) Uboot启动分 ...

  2. android启动分析,Android APP启动方式、启动流程及启动优化分析

    本文章向大家介绍Android app应用启动的一些相关知识,包括app启动方式.app启动流程和app启动优化等知识! app应用启动方式 1.冷启动 当启动应用时,后台没有该应用的进程,这时系统会 ...

  3. Linux系统无线网络抓包程序(分析手机WIFI MAC地址)

    前面讲述了使用tcpdump和wireshark抓WIFI包,但这只是使用工具的层面,再深一层则是自己写代码实现这个功能.本文在前面文章<Linux系统有线网络抓包程序>的基础上添加实现无 ...

  4. linux内核启动分析(一)

    文章目录 1.HEAD 1.preserve_boot_args 1.1 __inval_dcache_area 2.el2_setup 3. set_cpu_boot_mode_flag 4. __ ...

  5. linux内核启动分析 三,Linux内核分析 实验三:跟踪分析Linux内核的启动过程

    贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...

  6. linux内核usb驱动框架,基于S3C2440平台的linux2.6.22内核版本的USB驱动框架分析

    基于S3C2440平台的linux2.6.22内核版本的USB驱动框架分析 发布时间:2014-07-18 16:47:31来源:红联作者:linux08071151 driver/usb/host/ ...

  7. Linux内核移植之一:内核源码结构与Makefile分析

    内容来自 韦东山<嵌入式Linux应用开发完全手册> 一.内核介绍 1.版本及其特点 Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如下面几行它们构成了Linu ...

  8. u-boot分析之内核启动(五)

    目录 u-boot(五)内核启动 概述 分区空间 内核文件格式 内核复制跳转 内核启动 机器ID 启动参数 (起始tag)setup_start_tag 内存设置 根文件系统,启动程序,串口设备 (结 ...

  9. linux指定内核位置,ARM linux内核启动时几个关键地址

    1.       内核启动地址 ZTEXTADDR 解压代码运行的开始地址.没有物理地址和虚拟地址之分,因为此时MMU处于关闭状态.这个地址不一定时RAM的地址,可以是支持读写寻址的flash等存储中 ...

最新文章

  1. IIS负载均衡-Application Request Route详解第五篇:使用ARR来配置试点项目
  2. jaxb xsd生成xml_使用JAXB和Jackson从XSD生成JSON模式
  3. java的注释、关键字、标识符、变量常量、数据类型、运算符、流程控制等
  4. TypeError: unhashable type: 'numpy.ndarray'
  5. 帆软日期控件变灰_数据分析插件FineReport中日期控件如何校验JS
  6. 熟练掌握git撤销命令
  7. 隐马尔可夫模型HMM学习备忘
  8. 温故知新----css盒模型
  9. Xbrowser远程连接显示灰屏
  10. ardupilot-3.6.9 stabilize模式下(增稳模式)油门输入输出整理
  11. C#:DataTable 操作
  12. Android 保存视频以及读取视频
  13. HTML-embed标签详解
  14. 计算机正确的录入指法教案,《文字录入教案》word版.doc
  15. 清理yarn、npm缓存包
  16. 产品经理常用词汇汇总
  17. java选择题《每日一练》
  18. 紫晶存储2017年上半年营收6012万元 净赚639万元
  19. 三生三世十里桃花用计算机怎么弄,三生三世十里桃花手游电脑版安装教程
  20. 【CAD插件】YQ插件辅助

热门文章

  1. Ajax学习整理笔记
  2. Java三元表达式学习笔记
  3. 计算机共享用户名和密码是哪个文件夹,共享文件夹要输入用户名密码,微信密码在哪个文件夹...
  4. python verilog顶层连线,如何在Verilog中连接两个模块?
  5. activiti根据当前节点获取下一个UseTask节点
  6. 化工热力学重修补考第二章重点内容
  7. 十、Docker快速搭建Elastic Stack(下篇)
  8. 二十四、爬取古诗网中的100首古诗文
  9. 银行客户还款可能性预测
  10. 机器学习一定要很优秀才能做嘛?其实我们都可以。