查看: 1333|回复: 0

MYS-6ULX-IOT试用-uboot分析

[复制链接]

该用户从未签到

发表于 2018-3-5 09:33:18 | 显示全部楼层 |阅读模式
分享到:
最近有点忙,所以没有及时更新,谢谢可依小姐姐的提醒!3Q
通过米尔科技官方的手册我们知道配置uboot的命令,但是在make之前我们进入根目录下Makefile的246行修改为如下内容:
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE ?=
endif
CROSS_COMPILE ?= arm-linux-gnueabihf-
然后执行make mys_imx6ull_14x14_nand_defconfig
最后执行make生成uboot.bin,下面我们分析uboot。
投机取巧一下,通过分析make以后所打印的信息,我们发现在根目录下面生成了u-boot.lds,打开分析:

程序执行的首地址是0x00000000,然后紧接着是__image_copy_start,那么我们用sourceInsight搜索一下,发现在arch\arm\lib\sections.c文件里面被定义为:
char __image_copy_start[0] __attribute__((section(".__image_copy_start")));
同时在common/board_r.c里面被调用;
vectors在arch\arm\lib\vectors.S里面被定义.section ".vectors", "ax",也就是说通过.section自定义一个可以允许执行的段,该段以段名为起始地址,以下一个段的段名为结束地址,所以,紧接着就是可以执行的代码;

b reset,跳转到标号为reset的地址处执行,reset定义在arch\arm\cpu\armv7\start.S文件内,同样符合连接脚本里面所定义的:

继续reset标号出分析:


发现仍然是跳转到标号save_boot_params_ret:出执行
mrs r0, cpsr
and r1, r0, #0x1f@ mask mode bits
teq r1, #0x1a@ test for HYP mode
bicne r0, r0, #0x1f@ clear all mode bits
orrne r0, r0, #0x13@ set SVC mode
orr r0, r0, #0xc0@ disable FIQ and IRQ
msr cpsr,r0
上述代码最重要的作用就是设置cpu为svc32模式,mrs是将状态寄存器cpsr的内容读取到r0寄存器里面,而msr是将寄存器的内容写入到状态寄存器里面,对于cpsr状态寄存器如下图:

and是逻辑与操作,r1 = r0 & 0x1f也就是模式位bit[4:0]不变;
然后r1于0x1a进行按位异或操作,并且改变cpsr的状态值,r1 = r1 xor 0x1a;r1的bit[4:0] = 00101
bicne就是r0 = r0 & ~(0x1f),也就是清除bit[4:0]为0;
orrne就等于r0 = r0 | 0x13,根据模式为分析可以知道此步骤是为了设置为svc32模式
orr r0, r0, #0xc0表示 r0 = r0 | 0xc0 = r0 | 11000000B也就是禁止FIQ和IRQ中断
msr cpsr,r0在通过msr指令将r0写入到状态寄存器里面,这样就完成了设置cpu模式和关闭FIQ和IRQ的作用!
待续.......................
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条

手机版|小黑屋|与非网

GMT+8, 2024-4-19 06:33 , Processed in 0.116153 second(s), 18 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.