目录
一、I.MX 6ULL介绍
i.MX 6ULL处理器采用NXP的ARM Cortex-A7内核。
该处理器可连接DDR3、DDR3L、LPDDR2(单通道)DRAM存储器件。
二、I.MX 6ULL内存映射
内存映射从0000 0000 ~ FFFF FFFF,即4GB内存大小。
对以上四点进行描述:
1、DDR 映射区域。DDR作为i.MX6U的主内存区域,它被映射在 0x8000 0000 地址处,最大空间为 2G,实际可用大小与选择的 DDR 芯片容量有关。
2、QSPI1 映射区域,i.MX6UL可以外接串行 norfash,norfahs 映射到 0x6000 000 起始地址处。因为开发板已经使用了容量更大的 EMMC 或 nand fash作为主存储器,所以配套开发板并没有外接norFlash。
3、EIM 外扩存储器映射区域。i.MX6UL 可以通过 EIM 总线外扩存储器。
4、启动引导程序(Boo位于起始地址 0x0000 0000 处。我们知道芯片上电后(或硬件复位)会自动从“0”地址处开始执行。
简单来说:
i.MX6UL支持将多种存储器映射到 4G 的地址空间,我们只使用了 DDR 作为 i.MX6UL 的主内存区域,起始地址为 0x8000 0000 ,大小由实际使用的 DDR 芯片决定。
三、i.MX 6UL的启动流程
i.MX 6UL的启动流程由下图所示:
一般启动流程为以下几步:
1、复位
2、检查CPU的ID
3、检查复位类型
4、检查启动模式
5、加载初始启动程序映像
6、校验映像
7、执行映像
3.1 复位
系统上电或硬件复位。
3.2 检查CPU的ID
系统上电或硬件复位后,CPU 从0x0000 0000地址开始执行 Boot ROM 代码。Boot ROM 代码首先会检査 CPU的ID。这一步官方手册中也没有过多介绍,我们默认检测通过。
3.3 检查复位类型
两种情况:正常的硬件复位、从低功耗模式唤醒。
3.4 检查启动模式
启动模式引脚设置(选定BOOT_MODE[1:0] = 10B ,i.MX6UL 将会从“内部”启动):
BOOT_MODE[1:0] 启动类型 00 熔断器启动 01 串行加载 10 内部启动 11 保留 具体从那种“内部”设备启动,由 BOOT_CFG1[7:4] 决定。
内部启动设备表如下:
BOOT_CFG1[7:4] 内部启动设备 0000 NOR/OneNAND(EIM) 0001 QSPI(nor flash启动) 0011 Serial ROM (SPI) 010x SD/eSD/SDXC(SD卡启动) 011x MMC/eMMC(emmc启动) 1xxx RaW NAND(nand flash启动)
3.5 加载初始启动程序映像
Boot ROM 代码并不能立即加载启动映像,因为我们的代码保存在芯片外部存储设备,从这些存储设备读数据之前首先要进行初始化。
Boot ROM 程序根据保存在芯片中的默认配置信息配置这些存储器接口。大多数情况下并不能发挥外设的最大性能,还需要使用 DCD(Device Confifiguration Data)进行二次配置。
DCD 地址信息保存在 IVT(Image Vector Table) 中,Boot ROM 通过读取 IVT 得到 DCD 地址信息。
简单来说:启动方式确定后 Boot ROM 需要从固定地址读取 IVT。
IVT 地址偏移表如下:
启动设备类型 映像向量表偏移 初始加载区域大小 NOR 4 Kbyte = 0x1000 bytes 整个映像大小 OneNAND 256 bytes = 0x100 bytes 1 Kbyte SD/MMMC/eSD/eMMC/SDXC 1 Kbyte = 0x400 bytes 4 Kbyte SPI EEPROM 1 Kbyte = 0x400 bytes 4 Kbyte 以 eMMC 为例,如果从eMMC启动,那么 IVT 位于 eMMC 的 0x400 偏移地址处。
初始化完成后,Boot ROM 便可以加载我们编写的程序。
3.6 校验映像
使用 HAB 校验,可以防止攻击者修改可编程内存中的代码或数据区域。
3.7 执行映像
以 eMMC 启动为例,在执行跳转之前 Boot ROM 已经将代码从 eMMC 加载到了 DDR,所以直接跳转到程序的入口地址即可。
四、ARM 工作模式与内核寄存器
4.1 ARM 工作模式简介
在 Cortex-M3 或者 M4 内核的的芯片中,工作模式分为特权模式和非特权模式。
特权模式下 CPU 完全控制芯片。
非特权模式下不能操作某些特殊的寄存器。
在 i.MX 6U 处理器中,将 CPU 工作模式进一步细分,支持九种工作模式下表所示。
处理器模式 编码 特权等级 执行(Implemented) 安全状态 User 10000 PL0 Always Both FIQ 10001 PL1 Always Both IRQ 10010 PL1 Always Both Supervisor 10011 PL1 Always Both Monitor 10110 PL1 With Security Extensions Secure only Abort 10111 PL1 Always Both Hyp
11010 PL2 With Security Extensions Non-secure only Undefined 11011 PL1 Always Both System 11111 PL1 Always Both User 用户模式:用户模式是相对于 Linux 系统来说的,有 Linux 的情况下 Linxu 应用程序运行在 User 模式,i.MX 6U 特权等级从低到高被分为3个等级(PL0~PL2),用户模式属于PL0。用户模式下的执行有时被描述为“无特权执行”,对系统来说 User 是安全的,User 程序不会破坏系统。
FIQ 快速中断模式:当发生 FIQ 中断后 CPU 就会进入 FIQ 模式。
IRQ 中断模式:当发生 IRQ 中断后 CPU 会进人中断模式。
Supervisor 管理模式:相比于User 用户模式,管理模式权限更高在。在该模式下我们可以操作所有的寄存器。系统上电(复位)后CPU默认处于该模式,我们的裸机程序也是运行在管理模式。
Monitor mode 监听模式:就像后台服务,这个模式主要用来安全扩展模式,只用于安全。
Abont mode 终止模式:CPU读取数据错误或者预取错误发生时将会进入终止模式。终止模式可以认为系统“挂了”。
Hyp mode 超级的监视模式:它主要用于一些虚拟化的扩展。
Undefined mode 未定义指令异常模式:当 CPU加载到一个无法识别的指令后将会进入该模式,同Abont mode 终止模式一样,是不正常的。
System 系统模式:以系统模式执行的软件在 PL1 处执行。系统模式具有与User 用户模式相同的可用寄存器。
4.2 ARM 内核寄存器
外设寄存器与内核寄存器的区别:
外设寄存器本质是单片机(处理器)地址空间中的一块内存区域,CPU 不能直接在内存中进行数据运算。
与外设寄存器不同,内核寄存器并没有“地址”的概念,每款 CPU 的内核寄存是固定的。
i.MX 6 内核寄存器分类:32 位通用寄存器 R0~R12、SP(栈指针寄存器)、LR(链接寄存器)、PC(程序计数寄存器)和 PSR(程序状态寄存器)。
SP 栈指针寄存器:指向当前堆栈的顶部地址,用于管理函数调用时的局部变量、参数和返回地址。ARM 架构中通常使用 R13 作为 SP。
LR 链接寄存器:函数调用或异常处理下,保存函数调用后的返回地址(即
BL
或BLX
指令的下一条指令地址)。对应 R14。PC 程序计数寄存器:指向下一条要执行的指令地址。对应 R15。
R0~R12 通用寄存器:用于存储临时数据、函数参数、局部变量等。所有工作模式共用 R0~R7。 在 FIQ 模式有自己的 R8~R12,其他工作模式共用 R8~R12。
PSR 程序状态寄存器:保存当前程序的状态信息,包括条件标志、执行模式和中断控制位。