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