CPU 上电时是如何读取 SPI Flash 里面内容的,不需要驱动吗?

2020-12-04 09:56:37 +08:00
 liyongjun0803

硬件的驱动都写在 uboot 或 kernel 里面,它们都是存储在 SPI Flash 中的,那么,CPU 刚上电时,不需要驱动来读取 SPI Flash 吗?

1618 次点击
所在节点    问与答
6 条回复
BingoXuan
2020-12-04 10:07:26 +08:00
我記得是 arm 不需要,cpu 上電後會通過自帶硬件讀取 flash 的程序到內存然後從特定內存位置開始
zhujinliang
2020-12-04 10:10:28 +08:00
其实 CPU 内还有一块 ROM,固化了一段启动代码,作用大概就是读取配置字节或 GPIO 状态确定从哪些外设启动、搜索可用于启动的设备、从外设读出数据放到内存做第 1 阶段的引导
第 1 阶段引导程序通常大小固定,只有 64K 或者 128K,用来加载 uboot 等引导程序
liyongjun0803
2020-12-04 11:40:01 +08:00
@zhujinliang 这段固化的启动代码,是不是根据 CPU (甚至主板) 自身设计的?我如果替换一颗 Flash,只要这颗 Flash 的基本参数和原来 Flash 一致,是否对 CPU 来说是无感的。这也就是为什么好多路由器玩家自己替换 Flash 也能够成功运行的原因吗?
hjc4869
2020-12-04 13:21:16 +08:00
bootrom 负责加载 SPI flash 里的 bootloader,bootrom 知道怎么初始化 SoC 上的 sd/emmc 或者 spi 控制器并且读取内容,至于怎么跟 spi flash 打交道,是 spi 控制器的事情。
cmostuor
2020-12-04 15:06:29 +08:00
机器上电后读取 spiflash 的内容有多种实现方式 你的驱动是指硬驱或软驱? 还是指操作系统层面的驱动? 硬驱实现方式是在 cpu 上电时通过复位信号让 spi 控制器从 0x0 地址读取到内存然后 CPU 在执行这过程纯硬件实现 软驱用 bootrom 简单的 bootrom 其实不过是让 spi 控制器从 0x0 地址开始读取数据到内存地址然后在跳转过去比如这个 https://github.com/kchhero/riscv-bootrom 复杂的比如这个 https://github.com/j-core/bootrom
benmaowang
2020-12-04 21:40:43 +08:00
SPI Flash 有个标准的读指令,CPU 上电后会自动读 N 字节到启动地址(一般映射到片内 RAM,或 Cache,或内存),然后跳转过去执行。
所以 Flash 上起始地址会保存 uboot 等 bootload 程序,尽量在这 N 字节内做到把内存初始化,并实现把剩余的 boot 代码拷到内存。
bootload 一旦运行起来,其它的就好办了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/731993

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX