linux内核 image,linux内核zImage详解
以下内容基于s5pv210进行分析
zImage由head.o,piggy.gzip.o,misc等链接组成,piggy.gzip.o中包含压缩的内核镜像,zImage的作用实际上就是对内核进行解码。
zImage还是位置无关码,它的链接地址为0,可以在任何地址运行,因为在对其源文件进行编译时编译器参数设置了-fpic,通过反汇编看到编译生成了.got和.got.plt段。.dot.plt为空,查看反汇编得知编译器对c语言函数的调用是通过bl指令实现的,所以c的函数调用是位置无关码;而对于c中全局变量的处理是通过相对寻址找到全局变量一一对应的.got地址(这里的相对寻址是:在每个函数段中如果使用了全局变量都会存放.got首地址相对运行pc的偏移量以及全局变量在.got中的偏移),所以无论运行地址和链接地址匹不匹配,代码都能正确找到全局变量的.got地址。.got地址中存放了全局变量的链接地址,所以只要在zImage的初始化c语言运行环境部分增加对.got部分全局变量的重定位则代码将正确运行,因此zImage成为了位置无关码
现在开始分析arch/arm/boot/compressed/head.s进行代码分析:
start: .typestart,#function //用于指定标号start为函数 .rept8 //指定.endr以前的指令循环8次 movr0, r0 .endr b1f .word0x016f2818@魔数用于表示zImage的身份 .wordstart@ zImage的链接地址 .word_edata@ zImage的链接结束地址 1:movr7, r1@ save architecture ID movr8, r2@ save atags pointer
#ifndef __ARM_ARCH_2__ /*用于判断是不是angel启动,我们是u-boot启动进来时已经是svc模式了所以直接跳到 not_angel */ mrsr2, cpsr@ get current mode tstr2, #3@ not user? bnenot_angel movr0, #0x17@ angel_SWIreason_EnterSVC ARM(swi0x123456)@ angel_SWI_ARM THUMB(svc0xab)@ angel_SWI_THUMB not_angel: mrsr2, cpsr@ turn off interrupts to orrr2, r2, #0xc0@ prevent angel from running msrcpsr_c, r2 #else teqppc, #0x0c000003@ turn off interrupts #endif
.text adrr0, LC0 //将LC0的运行地址加载到r0, ARM(ldmiar0, {r1, r2, r3, r4, r5, r6, r11, ip, sp}) /*将r0指定的地址中的数据依次加载到括号里的寄存器中: r1 : LC0的链接地址 r2 : BSS start r3 : BSS end r4 : 内核的链接地址 r5 : zImage的链接地址 r6 : 内核的大小 r11 :.got的起始链接地址, ip :.got的结束链接地址 sp :链接下的栈顶 r0 : LC0的运行运行地址*/ THUMB(ldmiar0, {r1, r2, r3, r4, r5, r6, r11, ip}) //无效 THUMB(ldrsp, [r0, #32]) //无效 subsr0, r0, r1@r0成为运行地址与链接地址的偏移量 beqnot_relocated@运行地址与连接地址相同跳转该语句 addr5, r5, r0 @r5 : zImage的运行地址 addr11, r11, r0 @r11:.got的起始运行地址 addip, ip, r0 @ip:.got的结束运行地址
linux内核 image,linux内核zImage详解相关推荐
- Linux 内核中RAID5源码详解之守护进程raid5d
Linux 内核中RAID5源码详解之守护进程raid5d 对于一个人,大脑支配着他的一举一动:对于一支部队,指挥中心控制着它的所有活动:同样,对于内核中的RAID5,也需要一个像大脑一样的东西来支配 ...
- Linux中/proc目录下文件详解
Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...
- linux tf命令,Linux系统命令介绍之vmstat命令详解
今天小编要跟大家介绍的vmstat命令详解.熟悉Linux系统和使用Linux系统工作的小伙伴都知道Linux的命令有很多,而真正在工作中用到的命令应该不超过几十个,为了让大家更好的掌握这些命令,小编 ...
- Linux中/proc目录下文件详解(二)
Linux中/proc目录下文件详解(二) /proc/mdstat文件 这个文件包含了由md设备驱动程序控制的RAID设备信息. 示例: [root@localhost ~]# cat /proc/ ...
- linux 进程间通信 dbus-glib【实例】详解一(附代码)(d-feet工具使用)
linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...
- 关于Linux的缓存内存 Cache Memory详解
30 (总结)关于Linux的缓存内存 Cache Memory详解 发表于: Linux, UNIX, 个人日记, 原创总结 | 作者: 谋万世全局者 标签: cache,Linux,Memory, ...
- 【Linux系统编程】fork()函数详解
00. 目录 文章目录 00. 目录 01. 进程创建函数 02. 父子进程结构 03. 父子进程地址空间 04. 附录 01. 进程创建函数 #include <sys/types.h> ...
- linux中fdisk的参数,Linux fdisk命令参数及用法详解--Linux磁盘分区管理命令fdisk
fdisk 命令 linux磁盘分区管理 用途:观察硬盘之实体使用情形与分割硬盘用. 使用方法: 一.在 console 上输入 fdisk -l /dev/sda ,观察硬盘之实体使用情形. 二.在 ...
- linux基础配置脚本,Linux中selinux基础配置教程详解
selinux(Security-Enhanced Linux)安全增强型linux,是一个Linux内核模块,也是Linux的一个安全子系统. 三种模式: Enforcing:强制模式,在selin ...
- java线程和内核线程的,Java中内核线程理论及实例详解
1.概念 内核线程是直接由操作系统内核控制的,内核通过调度器来完成内核线程的调度并负责将其映射到处理器上执行.内核态下的线程执行速度理论上是最高的,但是用户不会直接操作内核线程,而是通过内核线程的接口 ...
最新文章
- 搭建Zabbix分布式监控
- 我这两年收藏的保姆级深度学习(TF、Pytorch....)资源,并做了学习笔记
- SOA学习笔记(一)
- 学python用什么书-python有什么好的书籍
- BUUCTF(pwn)ciscn_2019_ne_5
- pygame中使用事件扫描实现对按键的检测以及小游戏的编写
- 工业以太网的冗余功能有哪些?
- python行与缩进_Python行结构与缩进的简单介绍
- 基于JAVA+SpringMVC+Mybatis+MYSQL的电影购票系统
- 2021李宏毅机器学习课程笔记——Explainable AI
- linux下载并安装JDK流程
- 为什么游戏加速器都会设置韩国节点
- 用python实现PR对视频处理的基本操作
- 深富策略:险资密集调研 周期股板块能否崛起?
- cgcs2000大地坐标系地图_测绘人必备!从地方坐标系到2000国家大地坐标系的转换...
- Unity笔记之动画遮罩
- 房屋托管网络管理系统_学习管理系统和共享托管
- 串口通信协议简介—学习笔记
- MT6323 PMIC 功能介绍
- 归并排序实现思想及代码模板