“No os hardware boot”的版本间的差异

来自百问网嵌入式Linux wiki
 
(未显示1个用户的16个中间版本)
第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>
 +
如何访问存储空间,通过访问每行左上角的编号去访问里面的数据,称这些编号为地址,而编号对应的数值,称为数据<br>
 +
如何访问存储设备(就是为了读写某一个存储空间)?<br>
 +
#发出地址
 +
#读数据(从设备里面范围给CPU)/写数据(从CPU发给存储设备)
 +
 
 +
地址和数据如何传输?<br>
 +
如果地址和数据直接来自CPU,或者说数据直接发给CPU,那么这个存储设备,我们就称为XIP device(cpu可以直接访问存储设备) <br>
 +
 
 +
[[File:No_os_hardware_boot_chapter1_002.jpg|1000px]]
 +
----------
 +
按照正常的执行流程,cpu和存储设备之间还会有内存控制器
 +
 
 +
U盘的内部存储结构
 +
 
 +
如何访问U盘的内部存储结构
 +
U盘对外只有5条线,cpu不可能直接发数据给u盘的,中间需要引入一个USB控制器
 +
cpu可以直接访问到usb控制器,通过usb控制器发送符合U盘传输协议的信息,间接的访问U盘数据。所以usb设备不是XIP device
 +
 
 +
如何识别一个存储设备是否是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>
  
-------------图1
+
那么问题来了:<br>
 +
{{space}}CPU如何执行SPI FLASH上的代码?<br>
 +
{{space}}一上电, CPU执行的第1个程序、第1条指令在哪里?<br>
  
比如,第0个存储空间存放的0x31这个数据,第一个存储空间存放的0x30这个数据
+
-------------
 +
[[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框架=
1.发出地址
+
tu 1.............................
2.读数据(从设备里面范围给CPU)/写数据(从CPU发给存储设备)
 
  
地址和数据如何传输?
 
如果地址和数据直接来自CPU,或者说数据直接发给CPU,那么这个存储设备,我们就称为XIP device(cpu可以直接访问存储设备)
 
  
--------------------图2
+
主芯片内部有ROM,ROM程序协助从非XIP设备启动。
 +
以SD卡启动为例。
 +
CPU只能运行XIP设备中的程序
  
按照正常的执行流程,cpu和存储设备之间还会有内存控制器
+
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>
 +
  
U盘的内部存储结构
 
  
如何访问U盘的内部存储结构
+
解释如下图:假设为1GB SD卡,在512前面的地方有分区表,表示U盘或者SD卡分为几个区<br>
U盘对外只有5条线,cpu不可能直接发数据给u盘的,中间需要引入一个USB控制器
 
cpu可以直接访问到usb控制器,通过usb控制器发送符合U盘传输协议的信息,间接的访问U盘数据。所以usb设备不是XIP device
 
  
如何识别一个存储设备是否是XIP设备?
+
tu2...............
1.CPU可以直接寻址的设备。
 
2.看是否有分开的地址总线和数据总线。
 
  
  
CPU通过SPI控制器才能得到spiflash中的数据,所以,spi flash不是XIP device
+
可以把程序或者头部加程序烧写在某一个地址处 row.bin,也可以作为一个文件通过window访问拷贝到某个分区内file.bin<br>
  
 +
使用那种方式来保存启动代码,由Boot Rom能力决定<br>
 +
如果Boot Rom能力比较强,可以识别分区,解析文件系统,那么他可以读取分区里的程序,就可以支持文件方式存储那些启动程序<br>
 +
如果Boot Rom能力比较弱,只能读取SD卡 U盘里的原始数据,没有能力去解析分区,解析文件系统,那么就支持raw bin方式<br>
  
------------图3 13.09
+
  
对于SD card也是类似的,CPU需要通过SD/MMC Controller才能把地址发给SD card,也必须通过SD/MMC Controller得到里面的数据并执行,所以SDcard不是XIP device
+
*c. 执行新程序:跳到目的地执行程序
  
=第02节_嵌入式系统硬件组成=
 
=第03节_SOC框架=
 
 
=第04节_具体单板的启动流程=
 
=第04节_具体单板的启动流程=

2020年1月7日 (二) 10:39的最新版本


第01节_XIP的概念

who runs programe? 我们常说运行程序,程序通过cpu运行,保存在存储设备上。

存储设备有多种,如下分类

 
|----hard dsik
|----sd card
|----Flash
	|----Nor Flash
	|----Nand FLash

无论是哪一种存储设备,内部的抽象结构是一样的,如下图所示
No os hardware boot chapter1 001.jpg


比如,第0个存储空间存放的0x31这个数据,第一个存储空间存放的0x30这个数据
如何访问存储空间,通过访问每行左上角的编号去访问里面的数据,称这些编号为地址,而编号对应的数值,称为数据
如何访问存储设备(就是为了读写某一个存储空间)?

  1. 发出地址
  2. 读数据(从设备里面范围给CPU)/写数据(从CPU发给存储设备)

地址和数据如何传输?
如果地址和数据直接来自CPU,或者说数据直接发给CPU,那么这个存储设备,我们就称为XIP device(cpu可以直接访问存储设备)

No os hardware boot chapter1 002.jpg


按照正常的执行流程,cpu和存储设备之间还会有内存控制器

U盘的内部存储结构

如何访问U盘的内部存储结构 U盘对外只有5条线,cpu不可能直接发数据给u盘的,中间需要引入一个USB控制器 cpu可以直接访问到usb控制器,通过usb控制器发送符合U盘传输协议的信息,间接的访问U盘数据。所以usb设备不是XIP device

如何识别一个存储设备是否是XIP设备?

  1. CPU可以直接寻址的设备。
  2. 看是否有分开的地址总线和数据总线。

No os hardware boot chapter1 004.jpg

CPU通过SPI控制器才能得到spiflash中的数据,所以,spi flash不是XIP device.


No os hardware boot chapter1 003.jpg

对于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条指令在哪里?


No os hardware boot chapter2 001.jpg

答案:

  • 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 FLASHUSB 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. 执行新程序:跳到目的地执行程序

第04节_具体单板的启动流程