linux内核启动地址 解压缩 启动参数

linux内核启动地址修改 介绍如何修改linux内核的启动地址,比如zreladdr-y := 0x80008000;是描述ti的DM368的,但对普通linux也一样有效。 立即下载


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

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

zImage是由压缩后的vmlinux和解压缩程式组成

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

  是由同一目录下的vmlinux.lds.in文件生成的

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

  ifeq ($(CONFIG_ARCH_S3C2410),y)

  ZTEXTADDR     = 0x30008000

  ZRELADDR     = 0x30008000

  endif

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

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

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

  ifeq ($(CONFIG_ARCH_S3C2410),y)

  ZTEXTADDR     = 0x30008000

  ZRELADDR     = 0x30008000

  endif

  # 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)

  #

  查看2410的datasheet ,发现内存映射的基址是0x3000 0000 ,那么  0x30008000又是怎么来的呢?

  在内核文件kernel/Document/arm/Booting 文件中有:

  Calling the kernel image

  Existing boot loaders: MANDATORY

  New boot loaders: MANDATORY

  There are two options for calling the kernel zImage. If the zImage is stored in flash, and is linked correctly to be run from flash, then it is legal for the boot loader to call the zImage in flash directly.

  The zImage may also be placed in system RAM (at any location) and called there. Note that the kernel uses 16K of RAM below the image to store page tables. The recommended placement is 32KiB into RAM.

  看来在image下面用了32K(0x8000)的空间存放内核页表,

  0x30008000就是2410的内核在RAM中的启动地址,这个地址就是这么来的。

  关于内核解压缩的过程分析

  内核压缩和解压缩代码都在目录kernel/arch/arm/boot/compressed,

  编译完成后将产生vmlinux、head.o、misc.o、head-s3c2410.o、piggy.o这几个文件,

  head.o是内核的头部文件,负责初始设置;

  misc.o将主要负责内核的解压工作,他在head.o之后;

  head-s3c2410.o文件主要针对的初始化,将在链接时和head.o合并;

  piggy.o是个中间文件,其实是个压缩的内核(kernel/vmlinux),只不过没有和初始化文件及解压文件链接而已;

  vmlinux是没有(zImage是压缩过的内核)压缩过的内核,就是由piggy.o、head.o、misc.o、head-s3c2410.o组成的。

  在BootLoader完成系统的引导以后并将Linux内核调入内存之后,调用bootLinux(),

  这个函数将跳转到kernel的起始位置。

  如果kernel没有压缩,就能启动了。

  如果kernel压缩过,则要进行解压,在压缩过的kernel头部有解压程式。

  压缩过得kernel入口第一个文件源码位置在arch/arm/boot/compressed/head.S。

  他将调用函数decompress_kernel(),这个函数在文件arch/arm/boot/compressed/misc.c中,

  decompress_kernel()又调用proc_decomp_setup(),arch_decomp_setup()进行设置,

  然后使用在打印出信息“Uncompressing Linux...”后,调用gunzip()。将内核放于指定的位置。

  以下分析head.S文件:

  (1)对于各种arm CPU的DEBUG输出设定,通过定义宏来统一操作。

  (2)设置kernel开始和结束地址,保存architecture ID。

  (3)如果在arm2以上的CPU中,用的是普通用户模式,则升到终极用户模式,然后关中断。

  (4)分析LC0结构delta offset,判断是否需要重载内核地址(r0存入偏移量,判断r0是否为零)。

  这里是否需要重载内核地址,我以为主要分析arch/arm/boot/Makefile、arch/arm/boot/compressed /Makefile

  和arch/arm/boot/compressed/vmlinux.lds.in三个文件,主要看vmlinux.lds.in链接文件的主要段的位置,

  LOAD_ADDR(_load_addr)=0x30008000,而对于TEXT_START(_text、_start)的位置只设为 0,BSS_START(__bss_start)=ALIGN(4)。

  对于这样的结果依赖于,对内核解压的运行方式,也就是说,内核解压前是在内存(RAM)中还是在FLASH上,

  因为这里,我们的BOOTLOADER将压缩内核(zImage)移到了RAM的0x30008000位置,我们的压缩内核是在内存(RAM)从 0x30008000地址开始顺序排列,

  因此我们的r0获得的偏移量是载入地址(0x30008000)。

  接下来的工作是要把内核映像的相对地址转化为内存的物理地址,即重载内核地址。

  (5)需要重载内核地址,将r0的偏移量加到BSS region和GOT table中。

  (6)清空bss堆栈空间r2-r3。

  (7)建立C程式运行需要的缓存,并赋于64K的栈空间。

  (8)这时r2是缓存的结束地址,r4是kernel的最后执行地址,r5是kernel境象文件的开始地址。检查是否地址有冲突。

  将r5等于r2,使decompress后的kernel地址就在64K的栈之后。

  (9)调用文件misc.c的函数decompress_kernel(),解压内核于缓存结束的地方(r2地址之后)。此时各寄存器值有如下变化:

  r0为解压后kernel的大小

  r4为kernel执行时的地址

  r5为解压后kernel的起始地址

  r6为CPU类型值(processor ID)

  r7为系统类型值(architecture ID)

  (10)将reloc_start代码拷贝之kernel之后(r5+r0之后),首先清除缓存,而后执行reloc_start。

  (11)reloc_start将r5开始的kernel重载于r4地址处。

  (12)清除cache内容,关闭cache,将r7中architecture ID赋于r1,执行r4开始的kernel代码。

几率大的Redis面试题(含答案) 本文的面试题如下: Redis 持久化机制 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题 热点数据和冷数据是什么 Memcache与Redis的区别都有哪些? 单线程的redis为什么这么快 redis的数据类型,以及每种数据类型的使用场景,Redis 内部结构 redis的过期策略以及内存淘汰机制【~】 Redis 为什么是单线程的,优点 如何解决redis的并发竞争key问题 Red... 阅读详情

相关推荐

(详细总结)python爬取 163收件箱邮件内容,收件箱列表的几种方法(urllib, requests, selenium)

需求:最近有一个需求,需要将163邮箱收件箱里面的所有邮件的内容全部copy下来,整理到一个word里面,不多也就28页的邮件(不要问我为什么有这需求,不告诉你),自己手动去ctrl+ cv 的话,估计要搞吐。然后就想能不能用python的爬虫来实现,虽然过程比较苦(后期改bug改的要吐了)。但是会后还是将需求实现了。这基本也算是入门了 urllib、requests、selenium这几个py...

man_tou_22 1万+

Linux 启动流程之自解压(二)

Linux 启动流程之自解压(二) 2 Head.s .start段程序入口start Start是zImage在启动时,最开始执行的代码。也就是说.start段被链接到代码的最开头处。 .section ".start", #alloc, #execinstr //创建.start段,将以下代码放入该段空间中 /* * sort out different calling conventi...

枫潇潇 629

TortoiseSVN的安装与使用

TortoiseSVN的安装与应用1、安装1.1、下载TortoiseSVN    点击下载TortoiseSvn1.2、下载汉化包。上面的页面中,找到Chinese, simplified汉化包,点击32位或者64位的Setup,下载汉化包。1.3、安装TortoiseSVN。在选择安装路径页面时要记得勾选“command line client tools”,默认不是勾选的。这里不勾选的话在I...

qq_28566071的博客 4万+

安卓linux内核打开,Android arm linux kernel启动流程(一)

虽然这里的Arm Linux kernel前面加上了Android,但实际上还是和普遍Arm linuxkernel启动的过程一样的,这里只是结合一下Android的Makefile,讲一下bootimage生成的一个过程。这篇文档主要描述bootimage的构造,以及kernel真正执行前的解压过程。在了解这些之前我们首先需要了解几个名词,这些名词定义在/Documentation/arm/Po...

weixin_32429589的博客 997

vos如何对接okcc(保姆级教程)

1.添加账户 点击 系统->账户管理 [图片] 2.创建费率 系统->费率管理 点击添加

qq_46333281的博客 3453

ComfyUI安装包运行前准备:增加虚拟内存

在Windows系统中,虚拟内存是一种重要的系统资源管理机制,它主要通过将硬盘空间用作内存来扩展系统的可用内存容量。以下是虚拟内存的主要作用: 1. 扩展物理内存容量 当物理内存(RAM)不足时,系统会将一部分数据从内存转移到硬盘上的虚拟内存区域(也称为“分页文件”或“交换文件”)。这样可以为正在运行的程序提供额外的“内存空间”,确保系统能够继续运行,而不会因为内存不足而崩溃。 2. 提高系统稳定性 虚拟内存为系统提供了一个缓冲区。如果没有虚拟内存...

聚梦小课堂 1万+

linux 内核解压缩一

内核的实际起始函数为 start_kernel() 函数,然后再调用其他函数来执行启动。再调用此函数之前,需要先将通过编译内核获得的 zImage 进行解压,请按成页目录构建等基本任务。   调用 start_kernel 的过程分为以下三个阶段: 1.保存boot下传递给内核的参数,并且关闭中断进入svc 模式 2.缓存和mmu的初始化; 3.内核的搬移; 4.内核的解压缩; 1.1 准备阶段   解压缩准备阶段将执行中断禁用、分配动态内存、初始化BBS区域、初始化页目录、打开缓存等任务。.

u012787604的博客 1291

避开地图定位偏差!手把手教你用Python实现火星坐标与WGS84精准转换

本文深入解析了国内地图服务中火星坐标(GCJ-02)与国际标准WGS84坐标系之间的偏差问题,并提供了基于Python的精准转换解决方案。文章详细阐述了坐标转换的核心原理,手把手教你构建可复用的转换工具包,并演示如何将其集成到实际应用(如Flask API)中,帮助开发者和数据分析师有效解决地图定位不准、多源数据无法对齐的痛点,提升地理信息处理能力。

weixin_29250403的博客 123

Linux内核启动分析

Linux 内核启动分析1.       内核启动地址1.1.   名词解释ZTEXTADDR解压代码运行的开始地址。没有物理地址和虚拟地址之分,因为此时MMU处于关闭状态。这个地址不一定时RAM的地址,可以是支持读写寻址的flash等存储中介。Start address of decompressor. heres no point in talking about virtual

空之轨迹~约修亚 2483

S7-1200中OB100和OB20中断使用方法及示例程序说明(图文)

S7-1200中OB100和OB20中断使用方法及示例程序说明(图文)

Robot_PLC_HMI_Automation 8582

YOLOv8实战教程:从模型训练到改进的全流程指南

回顾这段YOLOv8的实战历程,从最初的模型训练到后来的各种改进尝试,我深刻体会到目标检测技术的魅力与挑战。YOLOv8作为一款优秀的框架,不仅易用性强,而且具备很强的可扩展性,让我能在其基础上不断创新。未来,我计划在以下几个方向继续探索:一是将YOLOv8与多模态技术结合,尝试实现图像与文本的联合目标检测;二是深入研究自监督学习在YOLOv8中的应用,减少对标注数据的依赖;三是探索YOLOv8在更广泛场景的部署,如机器人、自动驾驶等。

LXY_LOVE36的博客 279

linux内核启动内核解压过程分析

内核编译完成后会生成zImage内核镜像文件。关于bootloader加载zImage到内核,并且跳转到zImage开始地址运行zImage的过程,相信大家都很容易理解。但对于zImage是如何解压的过程,就不是那么好理解了。本文将结合部分关键代码,讲解zImage的解压过程。  先看看zImage的组成吧。在内核编译完成后会在arch/arm/boot/下生成zIm...

weixin_33766168的博客 324

Spark Sql 连接mysql

转载请务必注明原创地址为:http://dongkelun.com/2018/03/21/sparkMysql/ 1、基本概念和用法(摘自spark官方文档中文版) Spark SQL 还有一个能够使用 JDBC 从其他数据库读取数据的数据源。当使用 JDBC 访问其它数据库时,应该首选 JdbcRDD。这是因为结果是以数据框(DataFrame)返回的,且这样 Spark SQL操作轻松或便......

主要分享大数据相关的知识,如Spark、Hudi 1万+

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

linux内核启动地址的确定内核编译链接过程是依靠vmlinux.lds文件,以arm为例vmlinux.lds文件位于kernel/arch/arm/vmlinux.lds,vmlinux-armv.lds的生成过程在kernel/arch/arm/Makefile中ifeq ($(CONFIG_CPU_32),y)PROCESSOR     = armvTEXTADDR     =

Figo的专栏 827

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

 linux内核启动地址的确定内核编译链接过程是依靠vmlinux.lds文件,以arm为例vmlinux.lds文件位于kernel/arch/arm/vmlinux.lds,vmlinux-armv.lds的生成过程在kernel/arch/arm/Makefile中ifeq ($(CONFIG_CPU_32),y

嵌入式 Linux ARM ADS ADHOC C C++ PLC 单片机 2645

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

linux压缩内核启动,linux内核启动地址,解压缩,启动参数

内核编译链接过程是依靠vmlinux.lds文件,以arm为例vmlinux.lds文件位于kernel/arch/arm /vmlinux.lds,vmlinux-armv.lds的生成过程在kernel/arch/arm/Makefile中ifeq ($(CONFIG_CPU_32),y)PROCESSOR = armvTEXTADDR = 0xC0008000LDSCRIPT...

weixin_35330534的博客 178

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

linux内核启动地址的确定[转载]

内核编译链接过程是依靠vmlinux.lds文件,以arm为例vmlinux.lds文件位于kernel/arch/arm/vmlinux.lds, vmlinux-armv.lds的生成过程在kernel/arch/arm/Makefile中 ifeq ($(CONFIG_CPU_32),y) PROCESSOR     = armv TEXTADDR     = 0xC0008

我的博客 1306

linux内核地址的确定

内核编译链接过程是依靠vmlinux.lds文件,以arm为例vmlinux.lds文件位于kernel/arch/arm/vmlinux.lds,vmlinux-armv.lds的生成过程在kernel/arch/arm/Makefile中ifeq ($(CONFIG_CPU_32),y)PROCESSOR     = armvTEXTADDR     = 0xC0008

wangyunqian6的专栏 713

linux内核启动地址的确定

内核编译链接过程是依靠vmlinux.lds文件,以arm为例vmlinux.lds文件位于kernel/arch/arm/vmlinux.lds, vmlinux-armv.lds的生成过程在kernel/arch/arm/Makefile中ifeq ($(CONFIG_CPU_32),y)PROCESSOR     = armvTEXTADDR     = 0xC0008000LDSCRIP...

weixin_33782386的博客 103

linux内核学习(1)第一阶段启动 解压缩内核

grub越过实模式直接跳转到保护模式的内核,找到自己的位置 ENTRY(startup_32) //head_32.S (arch\x86\boot\compressed) 3871 2010/8/3 testb $(1<<6), BP_loadflags(%esi) //来源于grub的struct linux_kernel_params.loadflags jnz 1f cli movl $__BOOT_DS, %eax movl %eax, %ds movl %eax,

shipinsky的博客 455

linux启动流程分析(代码分析) .

一 bootloader启动内核过程     ================================     Author: taoyuetao     Email:     [email=tao_yuetao@yahoo.com.cn]tao_yuetao@yahoo.com.cn[/email]     Blog:     http://www.eetop.cn/bl

gjy938815的专栏 596

uboot启动内核学习笔记

=============================================================================== uboot启动内核 =============================================================================== 命令行中输入print 得到信息bootcmd=nan...

retacn_yue的专栏 202

3.linux启动流程分析(代码分析)

一 bootloader启动内核过程     ================================     Author: taoyuetao     Email:     [email=tao_yuetao@yahoo.com.cn]tao_yuetao@yahoo.com.cn[/email]     Blog:     http://www.eetop.cn/bl

hare_Lee的专栏 947

bootm命令分析

bootm命令函数do_bootm位于Cmd_bootm.c,其流程为:确定是否要校验uImage和ramdisk里的数据,默认校验,若想不校验:设置了环境变量verify=n。 s = getenv ("verify"); verify = (s && (*s == 'n'))

roadtoforest的专栏 936

arm linux head.s,arm-linux head.S 源代码分析

arm-linux head.S 源代码分析arm-linux head.S 源代码分析这是ARM-Linux运行的第一个文件,这些代码是一个比较独立的代码包裹器。其作用就是解压Linux内核,并将PC指针跳到内核(vmlinux)的第一条指令。Bootloader中传入到Linux中的参数总共有三个,Linux中用到的是第二个和第三个。第二个参数是architecture id,第三个是tagl...

weixin_39822423的博客 184

Linux启动过程代码分析

Linux启动过程代码分析1,入口函数和链接地址2,head.S文件分析 1,入口函数和链接地址 从链接脚本中可以找到入口函数,Linux内核的链接脚本arch/arm/kernel/vmlinux.lds是由arch/arm/kernel/vmlinux.lds.S这个汇编文件生成的。 从链接脚本可以得出内核的入口函数为stext函数,在arch/arm/kernel/head.S中。 从链接脚...

ITdadada的博客 625
上一篇: ubuntu下安装OpenGL并搭建OpenGL开发环境
下一篇: Linux 内存管理之highmem简介
evenness
博客等级 码龄15年 99粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值