匿名
未登录
登录
百问网嵌入式Linux wiki
搜索
查看“No os hardware boot”的源代码
来自百问网嵌入式Linux wiki
名字空间
页面
讨论
更多
更多
页面选项
Read
查看源代码
历史
←
没有操作系统硬件启动
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
该页面已被保护以防止编辑和其他操作。
您可以查看与复制此页面的源代码。
=第01节_XIP的概念= who runs programe? 我们常说运行程序,程序通过cpu运行,保存在存储设备上。 存储设备有多种,如下分类 <syntaxhighlight lang="c" > |----hard dsik |----sd card |----Flash |----Nor Flash |----Nand FLash </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> 那么问题来了:<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框架= tu 1............................. 主芯片内部有ROM,ROM程序协助从非XIP设备启动。 以SD卡启动为例。 CPU只能运行XIP设备中的程序 ROM程序做什么? 显然:ROM需要把SD卡上的程序读到内存里(片内RAM或是片外的DDR) ROM程序要做的事情: a. 初始化硬件 初始化时钟,提高CPU、外设速度 初始化内存:DDR需要初始化才能使用 初始化其他硬件,比如看门狗、SD卡控制器等 b. 从外设把程序复制到内存,拷贝过程无外乎三个要素: <syntaxhighlight lang="c" > src(源) dest(目的) len(长度) | | | | | |->长度需要指定 | |---->拷贝到ram 或者DDR只需要指定一个地址即可 | |b.2 内存那么大,把程序从SD卡等设备,复制到内存哪个位置?复制多长? | |-->烧写在SD卡等设备上的程序,含有一个头部信息,里面指定了内存地址和长度;或 | |-->不给客户选择,程序被复制到内存固定的位置,长度也固定。 |---->从哪一个设备拷贝代码 |b.1支持那么多的启动方式,SD卡、SPI FLASH、USB DISK,怎么选择? |-->通过跳线,选择某个设备;或 |-->通过跳线,选择一个设备列表,按列表顺序逐个尝试或 |-->不让客户选择,按固定顺序逐个尝试 </syntaxhighlight> 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节_具体单板的启动流程=
该页面使用的模板:
模板:Space
(
查看源代码
)(受保护)
返回至
没有操作系统硬件启动
。
导航
导航
WIKI首页
官方店铺
资料下载
交流社区
所有页面
所有产品
MPU-Linux开发板
MCU-单片机开发板
Linux开发系列视频
单片机开发系列视频
所有模块配件
Wiki工具
Wiki工具
特殊页面
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志