移植u-boot学习笔记2-----分析启动过程之内存分布
2016-09-03 16:37
417 查看
1、重定位的需求及原理
新的u-boot是nor flash启动,程序的链接地址是0地址,一开始在nor flash的0地址执行,假若某个全局变量也在nor flash的某个地址上,nor flash可以像内存一样读,但不能像内存一样写,程序执行中读取nor flash上存储的某个变量没有问题,但写某个变量不会成功,程序会出现问题,因而需要重定位。程序运行时也要把nor flash上的程序复制到SDRAM中,复制到SDRAM的哪个位置可以任选,也就是说需要重定位。但是程序的链接地址是0,复制到SDRAM后为什么能执行。因为复制过去后还要修改代码,改变里面变量、函数的地址。比如访问nor
flash上某个变量的地址是0x100,把涉及的程序复制到0x3200,0000里面去,想访问同一个变量,使用0x300,0100来访问,如果那段程序涉及多个变量,就需要在把这段程序从nor flash复制到SDRAM后,修改程序里变量、函数的地址。
2、重定位旧地址存在哪里
在链接时加上pie选项(arm-linux-ld -pie),地址信息就会生成,然后存在段里面。在链接脚本里面存储地址信息的段是下面的.rel.dyn和.dynsym,
3、根据旧地址信息修改代码,把旧地址改成新地址,程序就可以复制到任何地方去。
4、重定位代码分析(c语言调用汇编代码)
(1)函数实现
定义函数类型
最终调用到下面来
addr_sp值存在r0里面
id值存在r1里面
addr值存在r2里面,r2是目标地址
(2)参数分析
参数addr_sp
其初始值等于addr减去TOTAL_MALLOC_LEN,也就是栈的地址
后面还有相关的对addr_sp的操作,最终会在预留的12字节后。
参数addr
是目的地址,是指把u-boot从flash拷贝到SDRAM的哪里去
CONFIG_SYS_SDRAM_BASE是SDRAM的基址0x3000,0000,ram_size是64M,也就是说addr的初始值是0x3400,0000.指向SDRAM 的最高地址
addr指向u-boot代码段的首地址,也就是相对于CONFIG_SYS_MALLOC_LEN这个堆的最后位置
参数id
看下面程序指向gd结构体的前面
5、u-boot的内存分布图
bd是bd_info结构体(含单板的一些信息:波特率、IP地址等),gd结构体的bd成员指向[b]bd_info结构体[/b]
CONFIG_SYS[b]_MALLOC_LEN是指堆,写应用程序会用到各种malloc函数,malloc函数就是去一块内存上拿出一小部分给你用,怎么管理这一块内存,我们写应用程序的时候是C库帮我们做的。在u-boot里需要自己实现这个管理
[/b]
新的u-boot是nor flash启动,程序的链接地址是0地址,一开始在nor flash的0地址执行,假若某个全局变量也在nor flash的某个地址上,nor flash可以像内存一样读,但不能像内存一样写,程序执行中读取nor flash上存储的某个变量没有问题,但写某个变量不会成功,程序会出现问题,因而需要重定位。程序运行时也要把nor flash上的程序复制到SDRAM中,复制到SDRAM的哪个位置可以任选,也就是说需要重定位。但是程序的链接地址是0,复制到SDRAM后为什么能执行。因为复制过去后还要修改代码,改变里面变量、函数的地址。比如访问nor
flash上某个变量的地址是0x100,把涉及的程序复制到0x3200,0000里面去,想访问同一个变量,使用0x300,0100来访问,如果那段程序涉及多个变量,就需要在把这段程序从nor flash复制到SDRAM后,修改程序里变量、函数的地址。
2、重定位旧地址存在哪里
在链接时加上pie选项(arm-linux-ld -pie),地址信息就会生成,然后存在段里面。在链接脚本里面存储地址信息的段是下面的.rel.dyn和.dynsym,
3、根据旧地址信息修改代码,把旧地址改成新地址,程序就可以复制到任何地方去。
4、重定位代码分析(c语言调用汇编代码)
(1)函数实现
定义函数类型
最终调用到下面来
addr_sp值存在r0里面
id值存在r1里面
addr值存在r2里面,r2是目标地址
(2)参数分析
参数addr_sp
其初始值等于addr减去TOTAL_MALLOC_LEN,也就是栈的地址
后面还有相关的对addr_sp的操作,最终会在预留的12字节后。
参数addr
是目的地址,是指把u-boot从flash拷贝到SDRAM的哪里去
CONFIG_SYS_SDRAM_BASE是SDRAM的基址0x3000,0000,ram_size是64M,也就是说addr的初始值是0x3400,0000.指向SDRAM 的最高地址
addr指向u-boot代码段的首地址,也就是相对于CONFIG_SYS_MALLOC_LEN这个堆的最后位置
参数id
看下面程序指向gd结构体的前面
5、u-boot的内存分布图
bd是bd_info结构体(含单板的一些信息:波特率、IP地址等),gd结构体的bd成员指向[b]bd_info结构体[/b]
CONFIG_SYS[b]_MALLOC_LEN是指堆,写应用程序会用到各种malloc函数,malloc函数就是去一块内存上拿出一小部分给你用,怎么管理这一块内存,我们写应用程序的时候是C库帮我们做的。在u-boot里需要自己实现这个管理
[/b]
相关文章推荐
- TQ2440 学习笔记—— 30、移植U-Boot【U-Boot 的启动过程第一阶段源码分析】
- TQ2440 学习笔记—— 31、移植U-Boot【U-Boot 的启动过程第二阶段源码分析】
- 移植u-boot学习笔记1-----实验及分析启动过程之概述
- 移植u-boot学习笔记3-----分析启动过程之重定位
- 学习笔记--- U-BOOT从启动到引导内核过程分析
- Uboot学习笔记③---(uboot移植及启动过程)
- Uboot学习笔记②---(bootloader的一些共同特性、uboot启动过程、编译环境、地址规划设计)
- u-boot启动过程分析——基于lpc2210的移植代码
- OK6410之uboot移植(2)——U-Boot启动过程完全分析
- u-boot 学习之启动过程完全分析
- 韩顺平_轻松搞定网页设计(html+css+javascript)_第26讲_js函数调用过程内存分析_js函数细节_学习笔记_源代码图解_PPT文档整理
- uboot-2012.04.01移植到mini2440(一)启动流程、内存分布及重定位初步分析
- 学习笔记 --- LINUX内核启动第二阶段分析(不考虑自解压过程)
- 11u-boot启动过程分析——基于lpc2210的移植代码
- u-boot启动过程分析——基于lpc2210的移植代码
- u-boot启动过程分析——基于lpc2210的移植代码[转]
- 【嵌入式Linux学习七步曲之第三篇 Linux系统bootlaoder移植】U-BOOT全线移植分析系列之四--U-boot如何引导Linux内核启动?
- 嵌入式linux开发uboot移植(三)——uboot启动过程源码分析
- 移植u-boot学习笔记5----- 修改代码之支持NAND启动
- TQ2440 学习笔记—— 28、移植U-Boot【U-Boot 的配置过程】