bootrom启动流程

本文详细介绍了MIPS架构下Linux系统的bootrom启动流程,从firmware和bootloader的交互,到Linux内核参数传递,再到文件系统和用户应用程序的加载。重点讨论了在启动阶段CPU状态设置、芯片版本识别、TLB映射初始化,以及如board_init_f()函数在启动过程中的作用。涉及关键函数包括timer_init、env_init、serial_init、console_init_f等。

闲来无事,总结一下linux bootrom的启动流程:

环境:MIPS+linux+交换机

nor flash和nand flash

nor flash:引脚多;支持片内执行;

nand flash:引脚通过IO串行实现,不支持片内执行;

一.基本概念

对于linux的bootloader主要可以分为四个层次:

1.firmware+bootloader

采用固件和bootloader两部分的bootrom方式,在Marvell平台中,CPU中集成了bootrom芯片,实质上是nand flash,CPU上电启动过程中,先执行固件中的程序,然后再执行boot代码。由于固件中代码已经初始化了串口,因此我们开发boot中不需要顾及串口初始化。

2.linux内核参数传递

不止是linux,vxworks也一样,image参数主要通过bootloader进行传递,或者是系统默认的,在我们系统中,都是采用bootloader把参数设置好,向image传递固定数据结构的地址,image启动时就能够获取参数,并按照预定的方式启动。

3.文件系统

主要是基于Flash等内存设备上,包含linux运行时所用的应用程序、库等,比如说给开发提供的Shell、动态链接程序。

4.用户应用程序

存储在文件系统中,例如会在文件系统和内核总放置一个图形化界面,例如minigui。


linux 常见分区:

bootloader + boot parameter + linux kernel + boot filesystem


二.boot常见的启动阶段

在我们产品中,首先设置CPU status寄存器KX,SX,UX;然后读取是哪个CORE,决定走不同的分支;然后读取不同的芯片版本,决定走不同分支;并区分是软复位和硬复位;区分不同的CORE,初始化相应的TLB映射,并根据不同的CORE,计算每个CORE需要执行的代码段。

函数boar

<think>好的,用户想了解如何修改BootROM启动地址。首先,我需要回忆一下BootROM的基本概念。根据引用[1],BootROM是嵌入式系统中负责启动的固件,它在系统上电时执行,主要任务是加载引导加载程序。修改启动地址可能涉及到硬件配置或固件代码调整,但具体方法因平台而异。 接下来,用户提到的引用[3]提到Zynq 7000的BootROM执行流程,其中提到BootROM代码由CPU 0执行,并且不初始化DDR控制器。这可能意味着启动地址的修改需要关注特定的寄存器或配置位。比如,在Xilinx的Zynq平台中,启动地址可能通过Boot Header中的字段设置,或者通过跳线、熔丝位来调整启动顺序。 另外,引用[4]中提到了进入BootROM菜单的方法,可能需要通过特定按键组合进入配置界面,但修改启动地址可能更底层,通常不是在运行时配置,而是在编译或烧写阶段处理。例如,在开发阶段,修改链接脚本或项目配置中的内存映射地址,然后重新编译生成BootROM镜像,再烧写到设备中。 还需要考虑不同的硬件平台有不同的方法。比如,某些微控制器可能通过BOOT引脚的电平选择启动地址,而其他系统可能需要修改固件中的绝对地址。此外,安全性问题也很重要,修改启动地址可能影响系统的启动流程,导致设备无法启动,因此需要谨慎操作,并确保有恢复机制。 用户可能没有提到的深层需求是,他们可能在开发或调试过程中遇到了需要从不同地址启动的需求,比如引导多个操作系统或进行固件升级。因此,除了步骤之外,还需要提醒备份原始固件、验证配置的正确性,以及可能的硬件兼容性问题。 总结步骤的话,可能需要:1. 确定硬件平台和文档;2. 查找启动地址配置方法(寄存器、熔丝位、跳线);3. 修改配置并重新生成固件;4. 烧写测试。同时,引用相关文档和示例,确保用户按照正确流程操作,避免变砖。</think>在嵌入式系统开发中,修改BootROM启动地址属于底层硬件操作,需要结合具体硬件平台和芯片架构进行操作。以下是通用性较强的实现方法和注意事项(以Xilinx Zynq 7000系列为例): ### 一、修改原理 BootROM启动地址由芯片的硬件配置寄存器决定,通常包含以下控制要素: 1. **启动模式选择**:通过物理引脚(如Zynq的MIO[8:2])电平设置 2. **地址映射配置**:在BootROM代码中定义的内存映射表 3. **安全启动寄存器**:如Zynq的SLCR.BOOT_ADDR寄存器 ### 二、具体步骤 #### 1. 硬件配置阶段 ```c // Zynq示例代码片段 #define SLCR_BOOT_ADDR 0xF8000000 + 0x230 volatile uint32_t *boot_addr_reg = (uint32_t *)SLCR_BOOT_ADDR; *boot_addr_reg = 0x00100000; // 设置新启动地址为0x00100000 ``` 需配合硬件引脚设置(以QSPI启动模式为例): $$ MIO[8:2] = 0010011_2 \quad (十六进制值0x13) $$ #### 2. 软件开发阶段 修改链接脚本(.ld文件): ``` MEMORY { BOOTROM (rx) : ORIGIN = 0x00100000, LENGTH = 64K RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 512M } ``` #### 3. 安全验证流程 ```mermaid graph TD A[备份原BootROM镜像] --> B[修改启动地址寄存器] B --> C[生成新BootROM.bin] C --> D[烧录验证] D -->|失败| E[恢复备份] D -->|成功| F[锁定安全寄存器] ``` ### 三、注意事项 1. **地址对齐**:启动地址必须满足芯片要求的对齐方式(通常为4KB对齐) 2. **内存映射冲突**:需避免与片上RAM、外设寄存器空间重叠[^3] 3. **安全机制**:部分芯片需要先解锁安全保护位才能修改启动地址[^4] 4. **时序要求**:在Zynq平台中,PL的初始化时序需与PS启动流程协调[^3] ### 四、验证方法 1. 使用JTAG读取SLCR寄存器值 2. 通过串口输出调试信息验证执行流 3. 使用逻辑分析仪捕捉启动时的地址总线信号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值