XIP技术与Flash
XIP技术与Flash
参考:
NOR Flash 和 NAND Flash
首先认识下nandflash和norflash。
NOR Flash 和 NAND Flash是现在市场上两种主要的非易失闪存技术。
Intel于1988年首先开发出NOR Flash 技术,彻底改变了原先由EPROM(Electrically Programmable Read-Only-Memory电可编程序只读存储器)和EEPROM(电可擦只读存储器Electrically Erasable Programmable Read - Only Memory)一统天下的局面。
紧接着,1989年,东芝公司发表了NAND Flash 结构,强调降低每比特的成本,有更高的性能,并且像磁盘一样可以通过接口轻松升级。
- NOR Flash 的特点是芯片内执行(XIP ,eXecute In Place),这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中。NOR 的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响到它的性能。
- NAND的结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于Flash的管理和需要特殊的系统接口。通常读取NOR的速度比NAND稍快一些,而NAND的写入速度比NOR快很多。
程序能直接在norlash执行的原因在XIP。
那什么是XIP?工作原理又是怎么样的?
XIP:eXecute In Place
eXecute In Place,即芯片内执行,指应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。
flash内执行是指nor flash 不需要初始化,可以直接在flash内执行代码。但往往只执行部分代码,比如初始化RAM.
(注:片内执行不是说程序在存储器内执行哦,CPU的基本功能就是取指、译码和执行。norflash能在芯片内执行,就是指CPU的取指模块能够直接从norflash中把指令取出来,供后面的译码和执行模块使用)
Nand-Flash
NandFlash器件使用复杂的I/O口来串行地存取数据,8个引脚用来传送控制、地址和数据信息。由于时序较为复杂,所以一般CPU最好集成NAND控制器。
另外由于NandFlash没有挂接在地址总线上,所以如果想用NandFlash作为系统的启动盘,就需要CPU具备特殊的功能,如s3c2440在被选择为NandFlash启动方式时会在上电时自动读取NandFlash的4k数据到地址0的SRAM中。
如果CPU不具备这种特殊功能,用户不能直接运行NandFlash上的代码,那可以采取其他方式,比如好多使用NandFlash的开发板除了使用NandFlash以外,还用上了一块小的NorFlash来运行启动代码。
Nor-Flash
但norflash就不用了,因为它是片内执行的,区别如图:

为什么nandflash很少用来做XIP?
接着说为什么norflash可以实现XIP,而不是nandflash?
解释1: 嵌入式系统中代码的执行方式不同
嵌入式系统中代码的执行方式主要有3种:
- 完全映射(fully shadowed):嵌入式系统程序运行时,将所有的代码从非易失存储器(Flash、ROM等)复制到RAM中运行。
- 按需分页(demand paging):只复制部分代码到RAM中。这种方法对RAM中的页进行导入/导出管理,如果访问位于虚存中但不在物理RAM中会产生页错误,这时才将代码和数据映射到RAM中。
- eXecute In Place (XIP):在系统启动时,不将代码复制到RAM,而是直接在非易失性存储位置执行。RAM中只存放需要不断变化的数据部分,如图1所示。
如果非易失性存储器的读取速度与RAM相近,则XIP可以节省复制和解压的时间。NOR Flash和ROM的读取速度比较快(约100 ns),适合XIP;而NAND Flash的读操作是基于扇区的,速度相对很慢(μs级),因此不宜实现XIP系统。而NAND
闪存写入速度比NOR快,更适合SND(存储和下载)系统。

解释2:各flash芯片结构不同
NOR flash之所以可以片内执行,就是因为他符合CPU去指令译码执行的要求。CPU送一个地址出来,NORflash就能给一个数据让CPU执行,中间不需要额外的处理操作。
NAND flash不一样是因为nand flash有地址,数据,命令共用IO口的问题,cpu把地址发出来之后,并不能直接得到数据,还需要控制线的操作才能完成。就是他没有专用的SRAM接口。
解释3:工艺要求不同
芯片内执行主要是是看芯片可不可以线性存储代码(假如硬件支持芯片接口),只要能保证芯片的存储空间是线性的(也就是无坏块),都可以片上执行。
在读取Flash时候,容易出现“位翻转(bitconvert)。
在Flash的位翻转(一个bit位发生翻转)现象上,NAND的出现几率要比NorFlash大得多。
这个问题在Flash存储关键文件时是致命的,所以在使用NandFlash时建议同时使用EDC/ECC等校验算法。 ”
凡是NAND型Flash都绕不开坏块(Bad Block)问题,这也是NAND Flash区别于NOR Flash的一个重要特点。
NAND技术上允许坏块的存在,这降低了NAND生产工艺要求,因此NAND单位容量价格比NOR低。
NAND内部按粒度从大到小划分依次为Plane、Block、Page、Byte(如下图所示),因为坏块导致了一些Block无法有效存储数据,这些Block会被标记拉黑,所以从主设备访问角度来看,NAND中的数据并不是按地址连续存储的,坏块占据的地址均为无效地址,这就是所谓的非线性存储,而非线性存储设备显然无法作为XiP设备。
非线性存储器,对于写入操作,无法保证应用程序一定放在指定链接的地址(即在Flash中的对应偏移地址),写入过程中遇到坏块,会跳过坏块,而那些坏块占据的无效地址极有可能就是应用程序实际链接地址。
强行ECC校验导致的Page Read等待
我们现在假设一种理想情况,NAND中不存在任何坏块,可以强行把NAND当作线性存储设备,这种情况下是不是就可以被用作XiP设备了呢?
我们来看串行NAND的完整读时序,0x13(Page Read)是FLASH控制器发送的第一个命令,用于通知NAND主设备想要访问Page了,随后发送列地址,指明要读的Page位置,此时NAND便会将内部状态寄存器里Busy位标志起来并进入忙状态。
在忙状态时间里,NAND会从内存块里将指定的Page数据全部拷贝到临时缓存区(Cache memory),对这一整个Page数据进行ECC校验,校验完成后将状态寄存器里相应ECC标志起来以及将Busy位清除掉,然后结束忙状态,进入数据输出准备状态。
由于不知道NAND什么时候会结束忙状态,因此FLASH控制器需要不断发送0x0F(Get Feature命令)去读取状态寄存器的值,直到状态寄存器里Busy位被清零才能去读取Page数据,这种逻辑判断行为在lookupTable里无法自动实现(NOR读时序里无需逻辑判断)。

如果特意省略读状态寄存器的步骤,避免逻辑判断行为,在lookupTable直接填入Dummy周期来代替行不行呢?理论上倒是可以的。我们来算一下,比如NAND典型的50MHz时钟频率,一个Dummy Cycle周期耗时20ns,NAND Page Read等待典型值是45us,即2250个Dummy Cycle,lookupTable有16条Sequence,每个Seqence支持8个instruction,每个instruction如果都设为CMD_SDR,参数设最大255,则9个instruction就能满足这个等待时间。

但即使这么做能勉强实现NAND Flash的XiP,代码实际执行效率也是非常低下的,毕竟涉及到跨Page的指令长跳转(暂不讨论Cache因素)就需要等待45us,这在嵌入式世界里是不短的时间,系统实时性无法保证,又有什么意义呢?
结论
所谓XIP,就是CODE是在FLASH上直接运行,NANDFLASH只是不适合做XIP,但并不是不能做XIP。
要一段CODE能够正确的运行,要保证它的CODE是连续的,正确的。
由于一些电气特性的原因,NOR FLASH能够做到这一点,不存在坏道或坏块,所以能够做XIP。
而对于NAND FLASH, 它只保证它的BLOCK 0是好的,其他的块并不保证,虽然出错的几率比较低,但还是有出错的可能,所以CODE可能无法连续正确地执行。
但只要你有额外的保障措施,比如说在执行CODE之前去做一次ECC校验,来确保CODE是连续正确的,那也可以做XIP。有人这么做了,而且也证明是成功的。但效率很低,无法接受。
个人认为解释3是主要原因,其他的是次要原因。
XIP技术与Flash的更多相关文章
- nor flash和nand flash的区别
NOR和NAND是现在市场上两种主要的非易失闪存技术.Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面.紧接着,1989年,东芝公司发表了 ...
- (三)NAND flash和NOR flash的区别详解
我们使用的智能手机除了有一个可用的空间(如苹果8G.16G等),还有一个RAM容量,很多人都不是很清楚,为什么需要二个这样的芯片做存储呢,这就是我们下面要讲到的.这二种存储设备我们都统称为“FLASH ...
- ROM、RAM、DRAM、SRAM和FLASH区别
ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写. ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都 ...
- NAND flash和NOR flash的区别详解
我们使用的智能手机除了有一个可用的空间(如苹果8G.16G等),还有一个RAM容量,很多人都不是很清楚,为什么需要二个这样的芯片做存储呢,这就是我们下面要讲到的.这二种存储设备我们都统称为“FLASH ...
- NOR型flash与NAND型flash的区别
1) 闪存芯片读写的基本单位不同 应用程序对NOR芯片操作以“字”为基本单位.为了方便对大容量NOR闪存的管理,通常将NOR闪存分成大小为128KB或者64KB的逻辑块,有时候块内还分成扇区.读写时 ...
- NOR flash和NAND flash区别,RAM 和ROM区别
ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写.ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是 ...
- NOR flash和NAND flash区别,RAM 和ROM区别d
ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写.ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是 ...
- FLASH和EEPROM的最大区别
源:http://www.cnblogs.com/bingoo/p/3551753.html FLASH和EEPROM的最大区别是FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储 ...
- ROM、RAM、DRAM、SRAM和FLASH的区别
ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写.ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是 ...
- SRAM/DRAM,PROM/EPROM/EEPROM,NOR/NAND FLASH区别
SRAM/DRAM,PROM/EPROM/EEPROM,NOR/NAND FLASH区别 RAM / ROM 存储器 ROM和RAM指的都是半导体存储器,R ...
随机推荐
- js实现懒加载原理
概念:对于页面有很多静态资源的情况下(比如网商购物页面),为了节省用户流量和提高页面性能,可以在用户浏览到当前资源的时候,再对资源进行请求和加载.原理:当图片元素的偏移高度<=设备高度+滚动条与 ...
- Golang csv操作
目录 csv读写 追加写入 追加写入封装 csv读写 封装成工具包 package utils import ( "encoding/csv" "fmt" &q ...
- C语言:实现数组的删除和增加
/* 删除方法: 如:12 32 56 84 95 用覆盖的方法 若删除第三个,则第四个要覆盖第三个,第五个要覆盖第四个 覆盖完:12 32 84 ...
- 2022年官网下安装ActiveMQ最全版与官网查阅方法
目录 一.环境整合 构建工具(参考工具部署方式) 二.下载安装 1.百度搜索ActiveMQ,双击进入.或访问官网https://activemq.apache.org/ 2.进入下载界面,两种方式, ...
- C 语言编程 — 编程实践
目录 文章目录 目录 前文列表 程序示例 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本数据类型> < ...
- SuperSocket AppServer.NewRequestReceived 不触发 接受不到字节
SuperSocket AppServer.NewRequestReceived 不触发 接受不到字节 针对.netframework版本 1.6.* 使用 FixedHeaderReceiveFil ...
- .NET 将多个程序集合并成单一程序集的 4+3 种方法
将 .NET 程序集与依赖合并到一起的方法有下面四种: 使用 .NET Core 3.0 自带的 PublishSingleFile 属性合并依赖使用 Fody使用 SourceYard 源代码包使用 ...
- Flutter(九)Json序列化与反序列化(转Model)
在日常开发中JSON的序列化与反序列化是一个常见的操作:而Dart语言不支持反射,运行时反射会影响Dart的tree shaking(摇树优化),tree shaking可以"抖掉" ...
- openCV编译安装-MSCV-Windows10-Qt
openCV编译安装-MSCV-Windows10-Qt 1.准备工作 CMake:下载最新版本即可 openCV:下载任意版本,可以下载源码或者官方编译好的VS版(其中也带有源码),我下载的是ope ...
- 日常Bug排查-MVCC和for update混用导致读数据不一致
日常Bug排查-MVCC和for update混用导致读数据不一致 前言 日常Bug排查系列都是一些简单Bug的排查.笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材. Bug现场 又是喜闻 ...