bootrom启动流程【转】

简介: 转自:http://blog.csdn.net/blueoceanindream/article/details/6851787 闲来无事,总结一下linux bootrom的启动流程: 环境:MIPS+linux+交换机 nor flash和nand flash nor flash:引脚多;支持片内执行; nand flash:引脚通过IO串行实现,不支持片内执行; 一.

转自:http://blog.csdn.net/blueoceanindream/article/details/6851787

闲来无事,总结一下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需要执行的代码段。

函数board_init_f()是在flash中执行的,是重要函数。

board_init_f()中调用lib_mips/board.c文件中定义的 init_sequence[]函数指针数组中的函数
init_fnc_t *init_sequence[] = {
octeon_boot_bus_init, ----> lib_mips/lib_octeon.c/octeon_boot_bus_init()
timer_init,  ----> lib_mips/time.c/timer_init()
env_init,  ----> common/env_flash.c/env_init() /*CFG_ENV_IS_IN_FLASH*/
early_board_init, ----> board/octeon_ebt3000/octeon_ebt3000_board.c
init_baudrate, ----> lib_mips/board.c/init_baudrate()
serial_init,  ----> 无
console_init_f, ----> common/console.c/console_init_f()
display_banner, ----> lib_mips/board.c/display_banner()
init_dram,  ----> lib_mips/board.c/init_dram()
checkboard,  ----> board/octeon_ebt3000/octeon_ebt3000_board.c
init_func_ram,
NULL,
};

【作者】 张昺华
【新浪微博】 张昺华--sky
【twitter】 @sky2030_
【facebook】 张昺华 zhangbinghua
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
目录
相关文章
|
安全 Linux Android开发
【ATF】bootloader与安全相关启动分析
【ATF】bootloader与安全相关启动分析
582 0
|
存储 缓存 网络协议
DPDK入门(环境搭建以及小demo)
DPDK入门(环境搭建以及小demo)
1827 0
|
网络协议 Linux Android开发
探索eBPF:Linux内核的黑科技(下)
探索eBPF:Linux内核的黑科技
|
4月前
|
人工智能 Rust 运维
这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
9358 21
|
1月前
|
人工智能 Shell Python
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(4)Subagents (子智能体)
本文介绍AI Agent开发中的子智能体(Subagent)模式。通过将复杂任务外包给临时子智能体处理,只返回最终摘要,避免上下文污染。父智能体保持干净对话,子智能体拥有独立上下文,完成任务后立即销毁,实现高效的任务分工和上下文管理。
833 3
|
2月前
|
人工智能 API 网络安全
2026年OpenClaw Windows本地+阿里云部署:附Friendli.ai免费GLM5/MiniMax M2.5对接喂饭级教程
2026年AI大模型生态迎来新突破,Friendli.ai平台免费开放GLM 5、MiniMax M2.5等主流大模型的无限制使用权限,还提供标准API接口,可无缝对接OpenClaw(原Clawdbot)这款开源AI自动化工具。结合OpenClaw的轻量化部署、多场景自动化能力,能让普通用户零成本拥有“大模型能力+自动化执行”的专属AI助手。
1085 3
|
3月前
|
人工智能 程序员 决策智能
2026年智能体(Agent)怎么学?从入门到实战的全景避坑指南
2026年,AI进入“智能体元年”。本文系统解析智能体四大核心架构与Agentic Workflow设计模式,涵盖开发者、产品经理到业务人员的实战路径,助力把握AI代理红利期,实现从工具应用到架构创新的跃迁。
3910 6
|
3月前
|
IDE 安全 开发工具
告别频繁切换分支!用 Git Worktrees + Claude Code 构建高效并行开发流
本文介绍 Git Worktrees 与 Claude Code 的高效组合:用 Worktrees 创建多分支独立工作区,零拷贝、秒级切换;Claude 则在隔离环境中安全试错、并行开发。告别 stash 焦虑,实现真正并行开发流。(239字)
2807 1
|
4月前
|
API Docker 异构计算
从 Docker Run 到生产级部署:vLLM推理大模型服务的 Docker Compose 完整实战指南
本文详解如何将vLLM大模型推理服务从基础docker run升级为生产级Docker Compose部署。涵盖GPU支持、网络隔离、配置参数化、API优化与压测实践,解决命名冲突、环境混乱等痛点,助力AI/DevOps工程师构建可维护、可扩展的容器化推理平台。
|
11月前
|
Ubuntu NoSQL 编译器
在Ubuntu 20.04上构建RISC-V和QEMU环境
以上的步骤只是开始,RISC-V的世界里有无数的未知等待你去探索。加油,勇敢的探险家。
724 18

热门文章

最新文章

下一篇
开通oss服务