前面已经把定位的数据通过加载LC0结构来加载到寄存器里,已经具备了定位的条件。那么内核进行重定位主要做些什么事情呢?要了解整个过程,当然要学习编译原理,因为进行重定位之后,主要是为了建立C语言的运行环境的需求。由于C语言是基于栈式的语言,又有全局变量,说明内存结构至少有两个,一个是全局数据区,一个是栈。因此,重定位就是修改全局数据区和栈的访问。在全局数据的内存的表达方式,GCC是使用GOT(GLOBALOFFSET TABLE)来组织的,所以需要修改GOT表里每一项的数据地址,才可以让C语言编译出来的程序可以访问到正确的地址。
由于栈的内存需要更新和写入,所以需要栈指向的内存是可读写的。但ROM不具备随机写入的,所以需要栈重定位。
/*
* We're running at a different address. We need to fix
* up various pointers:
* r5 - zImage base address
* r6 - GOT start
* ip - GOT end
*/
add r5,r5, r0
add r6,r6, r0
add ip,ip, r0
这段代码就是重新计算GOT的开始位置和结束位置。
#ifndefCONFIG_ZBOOT_ROM
/*
* If we're running fully PIC === CONFIG_ZBOOT_ROM = n,
* we need to fix up pointers into the BSS region.
* r2 - BSS start
* r3 - BSS end
* sp - stack pointer
*/
add r2,r2, r0
add r3,r3, r0
add sp,sp, r0
这段代码是主要重定位堆和栈的位置。
/*
* Relocate all entries in the GOT table.
*/
1: ldr r1,[r6, #0] @ relocate entries in the GOT
add r1,r1, r0 @ table. This fixes up the
str r1,[r6], #4 @ C references.
cmp r6,ip
blo 1b
#else
/*
* Relocate entries in the GOT table. We only relocate
* the entries that are outside the (relocated) BSS region.
*/
1: ldr r1,[r6, #0] @ relocate entries in the GOT
cmp r1,r2 @ entry < bss_start ||
cmphs r3,r1 @ _end < entry
addlo r1,r1, r0 @ table. This fixes up the
str r1,[r6], #4 @ C references.
cmp r6,ip
blo 1b
#endif
这段代码主要就是重新计算GOT表里每一项的数据项地址。
分享到:
相关推荐
Linux内核解压过程
linux 内核启动过程以及挂载android 根文件系统的过程
Android Framework精编内核解析
Android内核剖析 柯元旦 Android内核剖析 柯元旦 Android内核剖析 柯元旦 Android内核剖析 柯元旦 Android内核剖析 柯元旦 Android内核剖析 柯元旦
zImage内核镜像解压过程详解 zImage内核镜像解压过程详解
Android和Linux内核版本对应关系
Android Framework精编内核解析.pdf 百度网盘永久地址
Android内核和驱动篇-Android内核介绍
Android 原生浏览器内核,包名 com.android.webview,内核版本116。 适用版本:Android API 24 及以上版本。 com.android.webview_116.0.5845.163-minAPI24.apk
Android各个版本与Linux内核的关系 获得某个内核分支的方法 获得Android某个版本的源码 查看android版本方法
《Android内核剖析》一书附带的图 附图名称如下: 附图1:Framework基本框架 附图2:Activity中创建窗口的过程 附图3:点击图标启动Activity 附图4:Activity的停止以及内存回收时机 附图5:按键消息获取流程 ...
android Framework精编内核解析
Android framework 系统编译 新版WebView浏览器内核101.0.4951.61
Android x5内核集成demo 解决webview在使用内核时跟h5混合调用时出现的白屏,加载缓慢,vue报错各种兼容问题。在x5内核加载失败时,会切换成系统本身的内核来加载h5内容。如果项目上架Google商店等海外市场运营的,...
Android内核和驱动篇-Android内核介绍.txt
android 内核剖析 柯元旦
基于腾讯X5内核 目前已有功能: 1、文件浏览(支持pdf/ppt/doc/excel/txt) 2、文件上传(JS) 3、文件下载 4、Android与JS交互 5、自定义交互(进度条、下拉回弹) 6、视频播放 1、添加依赖和配置 根目录build....
Android4.0内核源代码,自己用Get获取的Android4.0内核源代码,需要的朋友自己拿去研究。
android手机的内核操作(命令) 1、 进入android手机的内核操作界面 adb Shell 2、 查看andorid根文件系统 #ls 查看全属性 #ls –l 查看所有文件,包括隐藏文件 #ls –a 3、 查看当前运行的所有进程 #ps 4、 查看...