`
isiqi
  • 浏览: 16466146 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Linux内核启动地址

阅读更多
内核编译链接过程是依靠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中
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;
_load_addr = .;

. = TEXT_START;
_text = .;

.text : {
_start = .;

其中LOAD_ADDR就是zImage中解压缩代码的ram偏移地址,TEXT_START是内核ram启动的偏移地址,这个地址是物理地址。
在kernel/arch/arm/boot/Makefile文件中定义了:
ZTEXTADDR =0
ZRELADDR = 0xa0008000
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)/
使得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、设置kernel/arch/arm/boot/Makefile文件中的
ZRELADDR = 0xa0008000
内核启动的物理地址
如果需要从flash中启动还需要设置
ZTEXTADDR地址。
分享到:
评论

相关推荐

    linux内核启动地址修改

    在进行Linux内核启动地址修改的过程中,我们首先需要理解Linux内核启动地址的概念以及它在系统内存中的位置。通常Linux系统在启动时需要指定一个内存地址作为内核启动的起始点,这个地址被称为内核的起始地址。在...

    linux 内核启动地址,解压缩,内核参数问题探讨.pdf

    ### Linux内核启动地址、解压缩与内核参数问题探讨 #### 一、Linux内核启动地址确定 在深入理解Linux内核启动地址之前,我们首先需要了解内核是如何被加载到内存中的,并且如何确定其加载地址。Linux内核启动地址...

    linux内核启动地址的确定[汇编].pdf

    linux内核启动地址的确定[汇编].pdf

    linux内核启动地址的确定借鉴.pdf

    linux内核启动地址的确定借鉴.pdf

    Linux内核启动过程分析.pdf

    ### Linux内核启动过程分析 #### 一、引言 随着技术的发展,Linux作为一个免费开源的Unix类操作系统,因其强大的功能、高效的性能以及良好的可移植性,在嵌入式系统乃至高性能服务器领域获得了广泛应用。理解Linux...

    linux内核启动流程1

    Linux 内核启动流程分析 在 Linux 内核启动流程中,内核自解压过程是非常重要的一步。这个过程中,uboot 将 uImage 头部进行解析,并将里面的 zImage 搬移到指定的内存位置,然后跳转到该内存位置处开始执行。 在 ...

    linux内核启动过程

    ### Linux内核启动过程 #### 一、引言 Linux作为一个免费开源的Unix类操作系统,在全球范围内得到了广泛应用,从嵌入式系统到超级服务器均有其身影。Linux内核以其紧凑的结构、强大的功能、高效的性能以及优秀的可...

    Linux内核启动(详细)

    ### Linux内核启动详解 #### 一、启动过程概述 Linux内核的启动是一个复杂而精细的过程,涉及多个阶段和步骤。一旦内核被加载到内存中并完成必要的解压缩操作,内核会跳转到`start_kernel`函数,这是整个内核启动...

    linux内核启动流程分析及移植步骤

    linux内核启动流程分析及移植步骤(需要Mindjet MindManager软件打开)

    Linux内核启动过程分析

    ### Linux内核启动过程分析 #### 一、引言 随着技术的发展,Linux作为一个免费开源的操作系统,在嵌入式系统到高性能服务器等多个领域都获得了广泛的应用。Linux内核以其高效、稳定、可移植性强等特点备受青睐。...

    linux内核启动流程解析

    Linux 内核启动流程解析 Linux 内核启动流程是指从 Bootloader 将控制权交给 Linux 内核开始,直到内核完全启动的整个过程。这个过程涉及到多个组件的交互,包括 Bootloader、Linux 内核、硬件等。 首先,...

    linux内核启动流程.doc

    "Linux内核启动流程" Linux内核启动流程是计算机启动过程中的一个重要步骤,它涉及到硬件检测、引导程序加载、内核初始化等多个方面。在本文中,我们将对 Linux 内核启动流程进行详细的分析和说明。 一、硬件检测 ...

    Linux内核启动流程

    Linux内核启动流程是操作系统核心运行的起点,它涉及了一系列复杂的步骤,确保系统能够正确地加载和执行。这里,我们将详细探讨从自解压到CPU初始化,再到`start_kernel`函数的整个过程。 1. **BIOS启动**:当...

    Linux内核源码分析--内核启动之(1)zImage自解压过程(Linux-3.0 ARMv7)1

    zImage自解压过程是Linux内核启动过程中的一个重要步骤,涉及到Bootloader的准备、zImage的生成和工作原理、MMU的设置等方面。通过对zImage自解压过程的分析,可以更好地理解Linux内核的启动过程,并为后续的内核...

    linux启动地址,解压缩,内核参数问题探讨

    ### Linux内核启动地址、解压缩及内核参数解析 #### 一、Linux内核启动地址确定 在深入了解Linux内核启动的过程之前,我们首先需要理解内核如何被加载到内存,并确定其启动地址。这一过程对于理解内核启动机制至关...

    Linux内核完全注释:基于0.11内核(V5.0)_0.11内核_linux_linux内核完全注释_Linux内核注释_

    《Linux内核完全注释:基于0.11内核(V5.0)》是一部深入解析Linux内核的重要参考资料,它详细解读了Linux操作系统的核心机制,对于理解操作系统的工作原理以及进行系统级编程具有极大的帮助。这部书籍以0.11内核为...

Global site tag (gtag.js) - Google Analytics