“No os hardware boot”的版本间的差异
Zhouyuebiao(讨论 | 贡献) |
|||
(未显示1个用户的15个中间版本) | |||
第1行: | 第1行: | ||
+ | {{DISPLAYTITLE:没有操作系统硬件启动}} | ||
+ | |||
=第01节_XIP的概念= | =第01节_XIP的概念= | ||
第13行: | 第15行: | ||
|----Nand FLash | |----Nand FLash | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | 无论是哪一种存储设备,内部的抽象结构是一样的,如下图所示 | + | 无论是哪一种存储设备,内部的抽象结构是一样的,如下图所示<br> |
− | + | [[File:No_os_hardware_boot_chapter1_001.jpg|800px]] | |
− | + | ---------- | |
− | + | 比如,第0个存储空间存放的0x31这个数据,第一个存储空间存放的0x30这个数据<br> | |
− | 比如,第0个存储空间存放的0x31这个数据,第一个存储空间存放的0x30这个数据 | + | 如何访问存储空间,通过访问每行左上角的编号去访问里面的数据,称这些编号为地址,而编号对应的数值,称为数据<br> |
− | |||
− | 如何访问存储空间,通过访问每行左上角的编号去访问里面的数据,称这些编号为地址,而编号对应的数值,称为数据 | ||
− | |||
− | |||
如何访问存储设备(就是为了读写某一个存储空间)?<br> | 如何访问存储设备(就是为了读写某一个存储空间)?<br> | ||
#发出地址 | #发出地址 | ||
#读数据(从设备里面范围给CPU)/写数据(从CPU发给存储设备) | #读数据(从设备里面范围给CPU)/写数据(从CPU发给存储设备) | ||
− | + | ||
地址和数据如何传输?<br> | 地址和数据如何传输?<br> | ||
− | 如果地址和数据直接来自CPU,或者说数据直接发给CPU,那么这个存储设备,我们就称为XIP device(cpu可以直接访问存储设备) | + | 如果地址和数据直接来自CPU,或者说数据直接发给CPU,那么这个存储设备,我们就称为XIP device(cpu可以直接访问存储设备) <br> |
− | |||
− | |||
+ | [[File:No_os_hardware_boot_chapter1_002.jpg|1000px]] | ||
+ | ---------- | ||
按照正常的执行流程,cpu和存储设备之间还会有内存控制器 | 按照正常的执行流程,cpu和存储设备之间还会有内存控制器 | ||
第39行: | 第37行: | ||
cpu可以直接访问到usb控制器,通过usb控制器发送符合U盘传输协议的信息,间接的访问U盘数据。所以usb设备不是XIP device | cpu可以直接访问到usb控制器,通过usb控制器发送符合U盘传输协议的信息,间接的访问U盘数据。所以usb设备不是XIP device | ||
− | 如何识别一个存储设备是否是XIP设备? | + | 如何识别一个存储设备是否是XIP设备?<br> |
− | + | #CPU可以直接寻址的设备。<br> | |
− | + | #看是否有分开的地址总线和数据总线。<br> | |
+ | [[File:No_os_hardware_boot_chapter1_004.jpg|1000px]] | ||
− | + | CPU通过SPI控制器才能得到spiflash中的数据,所以,spi flash不是XIP device. | |
+ | ---------- | ||
+ | [[File:No_os_hardware_boot_chapter1_003.jpg|1000px]] | ||
+ | 对于SD card也是类似的,CPU需要通过SD/MMC Controller才能把地址发给SD card, | ||
+ | 也必须通过SD/MMC Controller得到里面的数据并执行,所以SDcard不是XIP device | ||
− | ------------ | + | =第02节_嵌入式系统硬件组成= |
+ | |||
+ | 一句话引出整个嵌入式系统: 支持多种设备启动 | ||
+ | |||
+ | 问题引出:<br> | ||
+ | *a.系统支持SPI FLASH启动.这意味着可以运行SPI FLASH上的代码.<code>the system can boot from spi flash,so it needs to run code on spi flash</code> | ||
+ | |||
+ | *b.但是SPI FLASH不是XIP设备, cpu无法直接执行里面的代码<code>but the spi flash isn't xip device,cpu can't run code on spi flash directly</code> | ||
+ | |||
+ | 那么问题来了:<br> | ||
+ | {{space}}CPU如何执行SPI FLASH上的代码?<br> | ||
+ | {{space}}一上电, CPU执行的第1个程序、第1条指令在哪里?<br> | ||
+ | |||
+ | ------------- | ||
+ | [[File:No_os_hardware_boot_chapter2_001.jpg|800px]] | ||
+ | |||
+ | 答案: | ||
+ | *a.ARM板子支持多种启动方式:XIP设备启动、非XIP设备启动等等。<br> | ||
+ | {{space}}比如:Nor Flash、SD卡、SPI Flash, 甚至支持UART、USB、网卡启动。<br> | ||
+ | {{space}}这些设备中,很多都不是XIP设备。<br> | ||
+ | |||
+ | 问:既然CPU无法直接运行非XIP设备的代码,为何可以从非XIP设备启动?<br> | ||
+ | 答:上电后,CPU运行的第1条指令、第1个程序,位于片内ROM中,它是XIP设备。<br> | ||
+ | {{space}}这个程序会执行必要的初始化,<br> | ||
+ | {{space}}比如设置时钟、设置内存;<br> | ||
+ | {{space}}再从"非XIP设备"中把程序读到内存;<br> | ||
+ | {{space}}最后启动这上程序。<br> | ||
+ | |||
+ | 猜测: ARM芯片内部有很多部件,这是一个片上系统(System on chip),比如有:<br> | ||
+ | cpu | ||
+ | rom | ||
+ | ram | ||
+ | memory controller --- ddr | ||
+ | sd/mmc controller --- sd card | ||
+ | spi controller --- spi flash | ||
+ | usb controller --- usb storage device | ||
+ | uart controller | ||
+ | ...... | ||
+ | interrtupt controller | ||
− | + | b. 跟PC的类比:<br> | |
+ | CPU ---- 单独的芯片 | ||
+ | 启动设备 ---- BIOS芯片 | ||
+ | DDR ---- 单独的可拔插式模块 | ||
+ | 存储设备 ---- SATA硬盘,可拔插 | ||
+ | usb controller ... | ||
− | |||
=第03节_SOC框架= | =第03节_SOC框架= | ||
+ | tu 1............................. | ||
+ | |||
+ | |||
+ | 主芯片内部有ROM,ROM程序协助从非XIP设备启动。 | ||
+ | 以SD卡启动为例。 | ||
+ | CPU只能运行XIP设备中的程序 | ||
+ | |||
+ | ROM程序做什么?<br> | ||
+ | 显然:ROM需要把SD卡上的程序读到内存里(片内RAM或是片外的DDR)<br> | ||
+ | -------- | ||
+ | ROM程序要做的事情:<br> | ||
+ | *a. 初始化硬件<br> | ||
+ | {{space}}初始化时钟,提高CPU、外设速度<br> | ||
+ | {{space}}初始化内存:DDR需要初始化才能使用<br> | ||
+ | {{space}}初始化其他硬件,比如看门狗、SD卡控制器等<br> | ||
+ | |||
+ | *b. 从外设把程序复制到内存,拷贝过程无外乎三个要素: | ||
+ | <syntaxhighlight lang="c" > | ||
+ | |||
+ | src(源) dest(目的) len(长度) | ||
+ | | | | | ||
+ | | | |->长度需要指定 | ||
+ | | |---->拷贝到ram 或者DDR只需要指定一个地址即可 | ||
+ | | |b.2 内存那么大,把程序从SD卡等设备,复制到内存哪个位置?复制多长? | ||
+ | | |-->烧写在SD卡等设备上的程序,含有一个头部信息,里面指定了内存地址和长度;或 | ||
+ | | |-->不给客户选择,程序被复制到内存固定的位置,长度也固定。 | ||
+ | |---->从哪一个设备拷贝代码 | ||
+ | |b.1支持那么多的启动方式,SD卡、SPI FLASH、USB DISK,怎么选择? | ||
+ | |-->通过跳线,选择某个设备;或 | ||
+ | |-->通过跳线,选择一个设备列表,按列表顺序逐个尝试或 | ||
+ | |-->不让客户选择,按固定顺序逐个尝试 | ||
+ | |||
+ | b.3 程序在SD卡上怎么存? | ||
+ | 原始二进制(raw bin), | ||
+ | 或 | ||
+ | 作为一个文件保存在分区里 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | |||
+ | 解释如下图:假设为1GB SD卡,在512前面的地方有分区表,表示U盘或者SD卡分为几个区<br> | ||
+ | |||
+ | tu2............... | ||
+ | |||
+ | |||
+ | 可以把程序或者头部加程序烧写在某一个地址处 row.bin,也可以作为一个文件通过window访问拷贝到某个分区内file.bin<br> | ||
+ | |||
+ | 使用那种方式来保存启动代码,由Boot Rom能力决定<br> | ||
+ | 如果Boot Rom能力比较强,可以识别分区,解析文件系统,那么他可以读取分区里的程序,就可以支持文件方式存储那些启动程序<br> | ||
+ | 如果Boot Rom能力比较弱,只能读取SD卡 U盘里的原始数据,没有能力去解析分区,解析文件系统,那么就支持raw bin方式<br> | ||
+ | |||
+ | |||
+ | |||
+ | *c. 执行新程序:跳到目的地执行程序 | ||
+ | |||
=第04节_具体单板的启动流程= | =第04节_具体单板的启动流程= |
2020年1月7日 (二) 10:39的最新版本
第01节_XIP的概念
who runs programe? 我们常说运行程序,程序通过cpu运行,保存在存储设备上。
存储设备有多种,如下分类
|----hard dsik
|----sd card
|----Flash
|----Nor Flash
|----Nand FLash
比如,第0个存储空间存放的0x31这个数据,第一个存储空间存放的0x30这个数据
如何访问存储空间,通过访问每行左上角的编号去访问里面的数据,称这些编号为地址,而编号对应的数值,称为数据
如何访问存储设备(就是为了读写某一个存储空间)?
- 发出地址
- 读数据(从设备里面范围给CPU)/写数据(从CPU发给存储设备)
地址和数据如何传输?
如果地址和数据直接来自CPU,或者说数据直接发给CPU,那么这个存储设备,我们就称为XIP device(cpu可以直接访问存储设备)
按照正常的执行流程,cpu和存储设备之间还会有内存控制器
U盘的内部存储结构
如何访问U盘的内部存储结构 U盘对外只有5条线,cpu不可能直接发数据给u盘的,中间需要引入一个USB控制器 cpu可以直接访问到usb控制器,通过usb控制器发送符合U盘传输协议的信息,间接的访问U盘数据。所以usb设备不是XIP device
如何识别一个存储设备是否是XIP设备?
- CPU可以直接寻址的设备。
- 看是否有分开的地址总线和数据总线。
CPU通过SPI控制器才能得到spiflash中的数据,所以,spi flash不是XIP device.
对于SD card也是类似的,CPU需要通过SD/MMC Controller才能把地址发给SD card, 也必须通过SD/MMC Controller得到里面的数据并执行,所以SDcard不是XIP device
第02节_嵌入式系统硬件组成
一句话引出整个嵌入式系统: 支持多种设备启动
问题引出:
- a.系统支持SPI FLASH启动.这意味着可以运行SPI FLASH上的代码.
the system can boot from spi flash,so it needs to run code on spi flash
- b.但是SPI FLASH不是XIP设备, cpu无法直接执行里面的代码
but the spi flash isn't xip device,cpu can't run code on spi flash directly
那么问题来了:
CPU如何执行SPI FLASH上的代码?
一上电, CPU执行的第1个程序、第1条指令在哪里?
答案:
- a.ARM板子支持多种启动方式:XIP设备启动、非XIP设备启动等等。
比如:Nor Flash、SD卡、SPI Flash, 甚至支持UART、USB、网卡启动。
这些设备中,很多都不是XIP设备。
问:既然CPU无法直接运行非XIP设备的代码,为何可以从非XIP设备启动?
答:上电后,CPU运行的第1条指令、第1个程序,位于片内ROM中,它是XIP设备。
这个程序会执行必要的初始化,
比如设置时钟、设置内存;
再从"非XIP设备"中把程序读到内存;
最后启动这上程序。
猜测: ARM芯片内部有很多部件,这是一个片上系统(System on chip),比如有:
cpu rom ram memory controller --- ddr sd/mmc controller --- sd card spi controller --- spi flash usb controller --- usb storage device uart controller ...... interrtupt controller
b. 跟PC的类比:
CPU ---- 单独的芯片 启动设备 ---- BIOS芯片 DDR ---- 单独的可拔插式模块 存储设备 ---- SATA硬盘,可拔插 usb controller ...
第03节_SOC框架
tu 1.............................
主芯片内部有ROM,ROM程序协助从非XIP设备启动。
以SD卡启动为例。
CPU只能运行XIP设备中的程序
ROM程序做什么?
显然:ROM需要把SD卡上的程序读到内存里(片内RAM或是片外的DDR)
ROM程序要做的事情:
- a. 初始化硬件
初始化时钟,提高CPU、外设速度
初始化内存:DDR需要初始化才能使用
初始化其他硬件,比如看门狗、SD卡控制器等
- b. 从外设把程序复制到内存,拷贝过程无外乎三个要素:
src(源) dest(目的) len(长度)
| | |
| | |->长度需要指定
| |---->拷贝到ram 或者DDR只需要指定一个地址即可
| |b.2 内存那么大,把程序从SD卡等设备,复制到内存哪个位置?复制多长?
| |-->烧写在SD卡等设备上的程序,含有一个头部信息,里面指定了内存地址和长度;或
| |-->不给客户选择,程序被复制到内存固定的位置,长度也固定。
|---->从哪一个设备拷贝代码
|b.1支持那么多的启动方式,SD卡、SPI FLASH、USB DISK,怎么选择?
|-->通过跳线,选择某个设备;或
|-->通过跳线,选择一个设备列表,按列表顺序逐个尝试或
|-->不让客户选择,按固定顺序逐个尝试
b.3 程序在SD卡上怎么存?
原始二进制(raw bin),
或
作为一个文件保存在分区里
解释如下图:假设为1GB SD卡,在512前面的地方有分区表,表示U盘或者SD卡分为几个区
tu2...............
可以把程序或者头部加程序烧写在某一个地址处 row.bin,也可以作为一个文件通过window访问拷贝到某个分区内file.bin
使用那种方式来保存启动代码,由Boot Rom能力决定
如果Boot Rom能力比较强,可以识别分区,解析文件系统,那么他可以读取分区里的程序,就可以支持文件方式存储那些启动程序
如果Boot Rom能力比较弱,只能读取SD卡 U盘里的原始数据,没有能力去解析分区,解析文件系统,那么就支持raw bin方式
- c. 执行新程序:跳到目的地执行程序