p定位但怎么去如何理解p值k10系统主要都有哪些游戏类别啊?

【极速彩K10 7寸儿童平板电脑儿童平板电脑玩具游戏平板电脑通话功能平板电脑】价格_厂家_图片 -Hc360慧聪网
您是不是在找:
买家还在看:
商品数量:
广东省&深圳市
手机访问店铺
极速彩K10 7寸儿童平板电脑儿童平板电脑玩具游戏平板电脑通话功能平板电脑
[商品已下架]
相关商品推荐
&28.00/个
&28.00/千克
&95.00/平方米
商家等级:
所在地区:
广东省 深圳市
认证信息:
同参数产品
同参数产品
同参数产品
同参数产品
操作系统:
同参数产品
产品尺寸:
同参数产品
同参数产品
处理器主频:
同参数产品
附加功能:
同参数产品
同参数产品
内存容量:
同参数产品
屏幕尺寸:
同参数产品
上市时间:
同参数产品
同参数产品
通讯功能:
同参数产品
网络类型:
同参数产品
同参数产品
硬盘容量:
同参数产品
同参数产品
同参数产品
同参数产品
续航时间:
同参数产品
适用送礼场合:
同参数产品
产品定位:
同参数产品
无线网卡:
同参数产品
货源类别:
同参数产品
同参数产品
同参数产品
加工定制:
同参数产品
售后类型:
同参数产品
存储类型:
同参数产品
内置感应:
同参数产品
处理器核心:
同参数产品
是否支持代理加盟:
同参数产品
3C证书编号:
同参数产品
正在加载中........
慧聪网厂家深圳大森鸿运科技有限公司为您提供极速彩K10 7寸儿童平板电脑儿童平板电脑玩具游戏平板电脑通话功能平板电脑的详细产品价格、产品图片等产品介绍信息,您可以直接联系厂家获取极速彩K10 7寸儿童平板电脑儿童平板电脑玩具游戏平板电脑通话功能平板电脑的具体资料,联系时请说明是在慧聪网看到的。
热门商品推荐
我的浏览记录
平板电脑相关资源
平板电脑相关热门专题
您在慧聪网上采购商品属于商业贸易行为。以上所展示的信息由卖家自行提供,内容的真实性、准确性和合法性由发布卖家负责,请意识到互联网交易中的风险是客观存在的。推荐使用慧付宝资金保障服务,保障您的交易安全!
按字母分类 :
让慧聪网撮合专家为您解决采购难题
您采购的产品:
请输入采购产品
您的手机号码:
请输入手机号码
*采购产品:
请输入采购产品
*采购数量/单位:
请输入采购数量
请选择单位
*采购截止日期:
请输入正确的手机号码
请输入验证码
*短信验证码:
<input id="valid_Code1" maxlength="6" placeholder="请输入验证码" name="VALIDCODE" class="codeInput" onkeyup="this.value=this.value.replace(/\D/g,'')" onkeypress="if(event.keyCode
57) event.returnValue =" type="text">
免费获取验证码
为了安全,请输入验证码,我们将优先处理您的需求!
请输入验证码
发送成功!
慧聪已收到您的需求,我们会尽快通知卖家联系您,同时会派出采购专员1对1为您提供服务,请您耐心等待!
联系人:毕生&
公司名称:深圳大森鸿运科技有限公司
请输入正确的手机号码
请输入验证码
*短信验证码:
免费获取验证码
为了安全,请输入验证码,我们将优先处理您的需求!
请输入验证码
每一份需求都会在24小时内得到行业多家优质供应商报价。
每一份需求的报价供应商工商信用资质都会经过专业人员检验,交易安全有保障。
免费咨询行业专家
免费咨询行业专家
服务主题:
筛选发货地
验证供应商真伪
提供其他优质供应商
采购数量:
用途描述:
成功加入采购单!
当前采购单共3种货品
成功加入采购单!
当前采购单共3种货品
不能购买自己发布的产品!
选中货品中含失效货品,无法完成下单,可能是:
1.货品库存不足
2.货品已过期,或被卖家删除
3.货品不支持在线交易
卖家暂时不在线,留下联系方式,卖家会主动联系您
*我要采购:
我的姓名:
留言内容:p和值机巧大全图解k10古诗词的要求都有哪些啊_百度知道
p和值机巧大全图解k10古诗词的要求都有哪些啊
p和值机巧大全图解k10古诗词的要求都有哪些啊文言文翻译答:刘瞻的父亲是个贫寒的读书人,十多岁的时候,他就在郑纟因身旁管理
我有更好的答案
好,玩,啊 cp1233.n&shye&shyt
用手机下载后就能玩速度不卡还能看美女呢
采纳率:100%
为您推荐:
其他类似问题
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。&figure&&img src=&https://pic3.zhimg.com/v2-7cfec805a93f8f977a9ab1ac18ebe3a6_b.jpg& data-rawwidth=&550& data-rawheight=&252& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&https://pic3.zhimg.com/v2-7cfec805a93f8f977a9ab1ac18ebe3a6_r.jpg&&&/figure&&blockquote&高级配置与电源接口(Advanced Configuration and Power Interface,ACPI)的应用已经广泛分布在计算机领略的各个细分市场。从手机、笔记本电脑、台式机到工作站和服务器上都可以找到它的身影。从体系架构上来看,不光X86阵营,ARM生态圈也加入进来。那究竟什么是ACPI,为什么要采用ACPI呢?&/blockquote&&h2&&b&Why ACPI?&/b&&/h2&&p&PC生态圈玩家众多,有OS 厂商(OSV)定期发布操作系统,如Windows,Ubuntu;芯片厂商提供CPU等,如Intel, AMD;主板厂商(OEM)提供电脑主板;扩展板提供显卡等等PCIE扩展卡;内存厂家推出一代一代不同的内存条等等。DIY玩家可以自由选择搭配合适/兼容的产品搭配出自己心仪的机器,休闲上网用户花2000多元就可以搭配出一套可用的电脑,而游戏玩家则可能花费上万元才能满足游戏配置需求。DIY市场的存在使一个厂商(例如苹果MacBook)垂直整合整个链条成为不可能。这样,OS厂家就面临一个难题:如何能够让一个OS可以在所有这些搭配中得到一致的运行感受?能不能抽象出一层接口,它既能用统一形式报告硬件的不同,又留给主板厂商足够的灵活性可以做出大胆的创新应用?&/p&&h2&&b&ACPI诞生&/b&&/h2&&p&在ACPI诞生前,高级电源管理(APM, Advanced Power Management)将电源管理几乎完全交给BIOS,呆板而限制很多,这让微软十分不爽,它希望在电源管理和硬件配置上能有更多的自主权,这也是合理的,谁比操作系统更懂现在用户在干什么呢?&/p&&p&1997年由英特尔、微软、东芝公司共同提出、制定了ACPI 1.0规范。ACPI,顾名思义,就是配置硬件和管理电源的规范。2000年8月康柏和凤凰科技加入,推出 ACPI 2.0规格。2004年9月惠普取代康柏,推出 ACPI 3.0规格。日則推出 ACPI 4.0规格。日推出ACPI 5.0规格。由于ACPI技术正被多个操作系统和处理器架构采用,该规格的管理模式需要与时俱进。2013年10月,ACPI的推广者们一致同意将ACPI的属有归到UEFI论坛。从那以后新的ACPI规格将由UEFI论坛制定。最新的规范是ACPI 6.1,大家可以在&a href=&https://link.zhihu.com/?target=http%3A//www.uefi.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Welcome to Unified Extensible Firmware Interface Forum&/a&上下载到最新的版本。&/p&&p&Windows 98是微软第一个支持ACPI的操作系统。FreeBSD v5.0是支持ACPI的第一个UNIX操作系统。Linux、NetBSD和OpenBSD等都支持ACPI。&/p&&p&ACPI整体框图如下:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-10ffa36e895ee625f188ce5_b.jpg& data-caption=&& data-rawwidth=&463& data-rawheight=&466& class=&origin_image zh-lightbox-thumb& width=&463& data-original=&https://pic2.zhimg.com/v2-10ffa36e895ee625f188ce5_r.jpg&&&/figure&&p&&br&&/p&&p&可以看出它并不包含古老的PIC,CMOS,PIT等等规范,这些我们称之为Legacy支持。ACPI可以实现的功能包括:&/p&&p&&b&1.系统电源管理&/b&(System power management)&/p&&p&&b&2.设备电源管理&/b&(Device power management)&/p&&p&&b&3. 处理器电源管理(Processor power management)&/b&&/p&&p&&b&4.设备和处理器性能管理&/b&(Device and processor
performance management)&/p&&p&&b&5.配置/即插即用&/b&(Configuration/Plug
and Play)&/p&&p&&b&6.系统事件&/b&(System Event)&/p&&p&&b&7.电池管理&/b&(Battery management)&/p&&p&&b&8.温度管理&/b&(Thermal management)&/p&&p&&b&9.嵌入式控制器&/b&(Embedded Controller)&/p&&p&&b&10.SMBus控制器&/b&(SMBus Controller)&/p&&p&我们前面几篇CPU电源管理的定义也可以在这里找到出处,从整体来看整个电源状态转化图如下:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-b5a8ae93fe5a98da742c_b.jpg& data-caption=&& data-rawwidth=&615& data-rawheight=&475& class=&origin_image zh-lightbox-thumb& width=&615& data-original=&https://pic1.zhimg.com/v2-b5a8ae93fe5a98da742c_r.jpg&&&/figure&&p&&br&&/p&&p&G0/G1/G2/G3表示整体的状态,S1/S2/S3/S4/S5表示睡眠状态,C1/C1../Cn和P0/P1..Px就是我们前文的Pstates(EIST)和CStates,D0/D1/D2/D3表示不同的设备电源状态。有机会我们再详细介绍G/S/D的内容。&/p&&p&从另外一个角度,我们可以将ACPI可以看作分为两个部分:&br&&/p&&p&&b&1.
各种表单(Tables)&/b&。这些表单描述了系统的各种状态,如MADT,SRAT等等,这些状态需要OS知晓,例如有多少个CPU(逻辑上),NUMA亲缘关系如何,APIC等等。&/p&&p&&b&2.
由Differentiated System Description Table (DSDT)和Secondary System Description Table (SSDT)指向的AML代码&/b&。这是一种ACPI规范规定的伪代码,可以想象成Java的Bytecode(功能上相差巨大)。它由ASL编译而成(对应于Java source code)。ASL程序提供了OS和固件调用的接口(method)。ACPI定义了很多预定义的Method,通过它们,OS和firmware互相传送信息(例如 主板PCI设备树,IRQ,OS支持哪些功能等等);OS还可以调用firmware提供的接口;固件从OS那里能得到各种事件(Event)的通知等等。这点正是ACPI强大灵活之处。&/p&&p&&br&&/p&&h2&&b&ACPI VS APM&/b&&/h2&&p&如前面提到的,ACPI取代了APM。这主要归咎于APM将电源管理归于BIOS,OS无从插手,而且其只有电源管理的能力而没有配置的功能(ACPI里的Configuration)。有趣的是APM也是微软和Intel发明的,那是在1992年,他们为了支持那时候才开始火热的IBM兼容机,才加上了电源管理模块。可是计划赶不上变化,才没过几年就不得不提出新的规范。从APM到ACPI的转化使得OS可以全面掌控各个电源模式的转化,并提供了配置功能。&/p&&p&&br&&/p&&h2&&b&ACPI VS FDT/DT&/b&&/h2&&p&对于ARM和PowerPC世界的人来说,FDT(Flattened Device Tree)/DT(Device Tree)已经占据统治地位很久了。它的诞生源于Linus对于ARM各种SOC与Linux kernel driver强耦合性的一次大爆发(说是 pain in the ass)。从此DT的被设计出来了,ARM的耦合性得到了一定的缓解。那时ARM控制着嵌入式和手机世界,X86统治着PC和服务器,曲径分明,井水不犯河水,而ACPI和FDT也相安无事。和平没有持续很久,在X86试图进入手机领域时,ARM也试图进入PC和服务器,大战爆发了。ARM世界的FDT在新战场受到了残酷的抵抗,PC和服务器的玩家们不喜欢FDT,他们希望用一套工具集(toolchain)能同时解决两家问题,他们提出的理由也很有道理:FDT没有ACPI灵活!确实,FDT虽然在提供各种表单方面近似于ACPI,却缺少AML/ASL这样的灵活性。结局是ARM世界宣布在PC和服务器领域全面淘汰FDT,换用ACPI,而在嵌入式系统继续使用FDT。这也是合理的,毕竟嵌入式系统不需要这么多的灵活性,而迁移的代价是巨大的。另一方面,ACPI却随着X86进入嵌入式领域而在X86嵌入式领域生根发芽。&/p&&h2&&b&ACPI VS UEFI???&/b&&/h2&&p&有人也许会说ACPI提供了OS可用的硬件抽象和接口(method),UEFI也提供了抽象和接口,是不是也有冲突?其实两者面向的方面不同,ACPI主要是从硬件抽象的角度来抽象硬件,UEFI是从软件一致方向定义规范。这也是他们不但没有替代关系,反而从ACPI 5.0 开始ACPI并入UEFI论坛管理的原因。需要指出的是ACPI和UEFI没有绑定关系,ACPI可以在uboot上实现,而UEFI也可以报告DT,但他们一起工作起来会更加顺畅。UEFI提供了帮助安装更新ACPI table的接口(protocol).大家可以在UEFI/PI spec里面找到相应的接口定义。&/p&&h2&&b&后记&/b&&/h2&&p&ACPI规范林林总总一千多页,涵盖了很多方面,从EC到服务器的错误报告(APEI)很多细节,这里只是从整体介绍一下。&/p&&p&&b&UEFI历史和架构其他文章:&/b&&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&UEFI和UEFI论坛 - 知乎专栏&/a&&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&UEFI背后的历史 - 知乎专栏&/a&&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&ACPI与UEFI - 知乎专栏&/a&&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&UEFI安全启动 - 知乎专栏&/a&&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&UEFI与硬件初始化 - 知乎专栏&/a&&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&UEFI架构 - 知乎专栏&/a&&/p&&p&欢迎大家关注本专栏和用微信扫描下方二维码加入微信公众号&UEFIBlog&,在那里有最新的文章。同时欢迎大家给本专栏和公众号投稿!&/p&&figure&&img src=&https://pic3.zhimg.com/v2-45479ebdd2351fcdcfb0771bd06fff3a_b.jpg& data-rawwidth=&344& data-rawheight=&344& class=&content_image& width=&344&&&figcaption&用微信扫描二维码加入UEFIBlog公众号&/figcaption&&/figure&
高级配置与电源接口(Advanced Configuration and Power Interface,ACPI)的应用已经广泛分布在计算机领略的各个细分市场。从手机、笔记本电脑、台式机到工作站和服务器上都可以找到它的身影。从体系架构上来看,不光X86阵营,ARM生态圈也加入进来。那究竟…
&figure&&img src=&https://pic4.zhimg.com/v2-53d1c0a608e8f403b20859_b.jpg& data-rawwidth=&1057& data-rawheight=&369& class=&origin_image zh-lightbox-thumb& width=&1057& data-original=&https://pic4.zhimg.com/v2-53d1c0a608e8f403b20859_r.jpg&&&/figure&&p&原来经常帮长辈修电脑,我首先开出的第一个药方就是重启一下电脑。是啊,重启大法能解决大多数怪异的问题,如果现象还存在,那就重装一下吧。这就是修电脑的三板斧,经过我几十年的统计,能解决电脑95.7%的问题!如果你问我三板斧怎么才两个,我还有一个秘密绝招:一定要插电源!&/p&&p&开个玩笑,不过我们日常使用电脑中不可避免的会重启(reset,reboot)。围绕着它,有些很有趣的问题。有的小伙伴就好奇为什么重启后CPU都不运行代码了,它是怎么又重新开始的,不是说好CPU掌控一切吗,在这个短暂的空挡,发生了什么。还有同学觉得重启就是关机再开机。&/p&&p&今天我们就来用户感受、软件接口和硬件来看看reset的原理,以及了解一下,它和关机再开机有哪些相似和不同。&/p&&h2&&b&操作系统&/b&&/h2&&p&对于用Window 8以前版本的用户来说,重启和关机再开机感受没有什么不同,过后都是一片白茫茫大地真干净。Windows 8/10启用了快速启动,从而两者产生了明显不同,详见:&/p&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic1.zhimg.com/v2-d59c65f5cb48042eace57dfa869eca70_180x120.jpg& data-image-width=&728& data-image-height=&400& class=&internal&&老狼:Windows快速启动背后的功臣:休眠&/a&&p&简单总结一下:关机再开机,会利用休眠功能(hibernate)直接进入到一个预存储的登陆画面,加速启动,但环境并不干净;而重启动则不变,从0开始一个个加载驱动,相对更加干净,也更慢。&/p&&p&操作系统当然是能够区分重启和关机再开机的,那么主板和CPU这么多种,它是怎么知道如何重新启动的呢?是通过ACPI,参见:&/p&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic3.zhimg.com/v2-7cfec805a93f8f977a9ab1ac18ebe3a6_180x120.jpg& data-image-width=&550& data-image-height=&252& class=&internal&&老狼:ACPI与UEFI&/a&&p&ACPI的Fixed ACPI Description Table (FADT)表定义了如何reset:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-2e949dabb260c0fe519b20_b.jpg& data-size=&normal& data-rawwidth=&1056& data-rawheight=&383& class=&origin_image zh-lightbox-thumb& width=&1056& data-original=&https://pic4.zhimg.com/v2-2e949dabb260c0fe519b20_r.jpg&&&figcaption&FADT表中reset的定义&/figcaption&&/figure&&p&简单来说就是BIOS要通过FADT来告诉操作系统,向哪个寄存器(RESET_REG)写入什么值(RESET_VALUE)会重启。操作系统记住后,在有重启的需求时照着做就好了。&/p&&h2&&b&Reset的种类&/b&&/h2&&p&如果你有观看ACPI的工具,你可以在Windows下看一下BIOS到底在FADT里面报上来什么寄存器。如果你没有,这里推荐RWEverything(&a href=&https://link.zhihu.com/?target=http%3A//rweverything.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Read & Write Everything&/a&),一个台湾同胞(?)写的免费的工具,十分强大:&/p&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic3.zhimg.com/v2-610a7bbd8f669d47f62ea_180x120.jpg& data-image-width=&553& data-image-height=&353& class=&internal&&老狼:也许是最良心的硬件信息读取工具:RW-everything&/a&&p&你会看到,现在大多数使用Intel芯片组的电脑,都是告诉OS,向0xCF9的IO口,写入6。你也可以自己用工具写一下试试,你会发现电脑真的重启了,你没有保存的文件也消失了。。。。&/p&&p&那这个神奇的0xCF9 IO端口是什么东西呢?它一般是南桥或者southcomplex实现的逻辑,在它之前还有0x92和0x66端口,这里按下不表。CF9的使用已经好多代了,我们在很多地方都可以找到它,我们在Intel的官网搜索E3800的datasheet,就可以找到它的寄存器定义,如下:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-f11cb7ce440b277cb0ee9d_b.jpg& data-size=&normal& data-rawwidth=&692& data-rawheight=&357& class=&origin_image zh-lightbox-thumb& width=&692& data-original=&https://pic1.zhimg.com/v2-f11cb7ce440b277cb0ee9d_r.jpg&&&figcaption&CF9寄存器定义&/figcaption&&/figure&&p&简单来说,就是:&/p&&ol&&li&写入02,光进行CPU的reset,也叫soft reset,即将CPU的INIT#信号拉低16个PCI clock。CPU会重新启动,重新从reset vector执行程序。这时很多CPU的uncore寄存器和南桥芯片组寄存器都没有被reset。&/li&&li&写入06,进行hard reset。这是最常用的reset。它通过assert PLTRST#信号,通知所有芯片,包括外围的网卡等等,一起reset。过后系统的绝大多数寄存器都会被重置为缺省值,CPU当然也会从reset vector开始执行程序。&/li&&li&写入0x0E,进行Full reset,这是最彻底的reset。系统会经历一次full power cycle,看起来也就是关机再开机了一次,风扇也会挺一下,再运行。系统会依次经历S3,S4,S5的过程,时间较长。它会在2)的基础上重置一下需要关机才能清除的寄存器,有时候这些动作在设置某些功能时是必不可少的。&/li&&/ol&&p&你要问还有没有更牛的reset,其实还有一个,那就是global reset。0xCF9的reset只影响inband的所有器件,而global reset还会reset out-of-band的模块,譬如ME和BMC等等。Global Reset需要置起相应标志位。&/p&&h2&&b&结论&/b&&/h2&&p&小小的reset,还有这么多的种类,这是很多人想象不到的。计算机知识浩如烟海,全部掌握似乎不太可能,我们只有每天进步一点点,日积月累下来,你也可以成为计算机大牛!&/p&&p&&b&其他相关文章:&/b&&/p&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic3.zhimg.com/v2-c60540a80baf96ea8f72_180x120.jpg& data-image-width=&369& data-image-height=&266& class=&internal&&老狼:按下电源键后发生了什么?电脑是如何优雅地开机的?&/a&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic1.zhimg.com/v2-f143bd2aac13ax120.jpg& data-image-width=&1280& data-image-height=&720& class=&internal&&老狼:按下电源键后发生了什么?电脑是如何关机的?&/a&&p&欢迎大家关注本专栏和用微信扫描下方二维码加入微信公众号&UEFIBlog&,在那里有最新的文章。同时欢迎大家给本专栏和公众号投稿!&/p&&figure&&img src=&https://pic2.zhimg.com/v2-121ecd3d4080deb1c557bf47dc00d246_b.jpg& data-size=&normal& data-rawwidth=&511& data-rawheight=&368& class=&origin_image zh-lightbox-thumb& width=&511& data-original=&https://pic2.zhimg.com/v2-121ecd3d4080deb1c557bf47dc00d246_r.jpg&&&figcaption&用微信扫描二维码加入UEFIBlog公众号&/figcaption&&/figure&&p&&/p&&p&&/p&&p&&/p&&p&&/p&&p&&/p&&p&&/p&&p&&/p&&p&&/p&&p&&/p&&p&&/p&
原来经常帮长辈修电脑,我首先开出的第一个药方就是重启一下电脑。是啊,重启大法能解决大多数怪异的问题,如果现象还存在,那就重装一下吧。这就是修电脑的三板斧,经过我几十年的统计,能解决电脑95.7%的问题!如果你问我三板斧怎么才两个,我还有一个秘…
&figure&&img src=&https://pic1.zhimg.com/v2-518ecd46e35fbb7bcb06d_b.jpg& data-rawwidth=&5200& data-rawheight=&1400& class=&origin_image zh-lightbox-thumb& width=&5200& data-original=&https://pic1.zhimg.com/v2-518ecd46e35fbb7bcb06d_r.jpg&&&/figure&&h2&1. GPU历史&/h2&&p&Arch.Release YearCompute CapabilityProcessMost highlighted FeaturesFlagship GTX/Tesla/Jetson GPUsTesla.1, 1.2, 1.365 nmGPU baseline architectureGTX8800, GTX9800, GTX280,Tesla1060Fermi.140 nmL1/L2 caches, dual schedulerGTX480, GTX460, GTX580,Tesla2070Kepler.2, 3.5, 3.740/28 nmFloating-point performanceGTX680, GTX-TitanZ, Tesla-K10,Tesla-K20, Tesla-K40, Tesla-K80,Jetson-TK1Maxwell.2, 5.328 nmPower efficiencyGTX750Ti, GTX980, GTX-TitanX,Tesla-M40, Tesla-M60, Jetson-TX1Pascal nm3D Memory, numeric SMsTesla-GP100, GTX1080&/p&&p&架构变化&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-d0bbda7cba70a853c451_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1320& data-rawheight=&757& class=&origin_image zh-lightbox-thumb& width=&1320& data-original=&https://pic3.zhimg.com/v2-d0bbda7cba70a853c451_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-d69bdfea6c769cf020c9a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1335& data-rawheight=&731& class=&origin_image zh-lightbox-thumb& width=&1335& data-original=&https://pic3.zhimg.com/v2-d69bdfea6c769cf020c9a_r.jpg&&&/figure&&p&&br&&/p&&h2&1.1 几种架构特性简述&/h2&&p&Fermi第一次出现了两级cache的设计。&/p&&p&Kelper有巨大的计算能力,因为它们每个SM有最多的CUDA cores。&/p&&p&从Maxwell开始注重功耗。&/p&&p&Pascal则因为其3D的memory架构拥有了快速的half-percision(16 bits)的计算。&/p&&p&GTX是桌面发型版,Telsa面向HPC,Jetson则是嵌入式设备。&/p&&p&&br&&/p&&h2&2. GPU&/h2&&p&GPU由多个streaming-multiprocessors (SMs)组成,它们通过crossbar内部互联网络共享L2 Cache和DRAM控制器。一个SM包含多个scalar processor cores (SPs) 和两种其他类型的功能单元(the Double-Precision Units (DPUs) for double-precision (DP) floating-point calculations and the Special-Function Units (SFUs) for processing transcendental functions and texture-fetching interpolations),还包含register files (RFs), load- store units (LSUs), scratchpad memory (i.e., shared memory), and various caches (i.e., instruction cache, constant cache, texture/read-only cache, L1 cache) for on-chip data caching。&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-f1f024a671c844ee499e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1135& data-rawheight=&807& class=&origin_image zh-lightbox-thumb& width=&1135& data-original=&https://pic2.zhimg.com/v2-f1f024a671c844ee499e_r.jpg&&&/figure&&p&&br&&/p&&h2&2.1 功能单元&/h2&&p&Scalar-Processor (SP): SM的主要基础处理器,实现基本的整数、浮点数计算,比较和类型转换等操作。每个SP包含一个单精度浮点数处理单元FPU和一个整数算数/逻辑单元ALU。都是流水线的。&/p&&p&Special-Function-Unit (SFU): SFU实现了快速透明的函数计算(sin,cos等)和平面属性插值。&/p&&p&Double-Precision-Unit (DPU): 专门的双精度计算单元。&/p&&p&Load-Store-Unit (LSU): 从内存读写数据的单元。包含独立的计算单元来快速计算内存请求的来源和目的地址。&/p&&h2&2.1.2 设备内存&/h2&&p&MemoryOn/Off ChipCachedAccessScopeLifetimeRegister FilesOnN/ARead/WritePer-threadThreadLocal MemoryOffL1/L2Read/WritePer-threadThreadShared MemoryOnN/ARead/WriteThread Block (CTA)Thread Block (CTA)Global MemoryOffL1/L2Read/WriteGPU+CPUHost AllocationConstant MemoryOffConstant cacheRead OnlyGPU+CPUHost AllocationTexture MemoryOffTexture cacheRead OnlyGPU+CPUHost Allocation&/p&&p&Register Files (RF): GPU的寄存器很大,出于吞吐量的考虑,划分成banks。因此相比于CPU寄存器,GPU寄存器的latency更大,而且有更多潜在的bank conflicts。&/p&&p&Local Memory (LM): local memory不是物理空间,而是global memory的一部分。它是线程私有的,主要用来临时的spilling,比如寄存器溢出,或者数组在Kernel里声明了,但编译器无法获得他准确的indexing。Local memory在Fremi和Kepler中可以被L1和L2 cached,但是在Maxwell和Pascal中只能被L2 cached。寄存器溢出到local memory会造成巨大的性能下降(引起了更多的指令和内存拥挤)尤其是cache miss时。&/p&&p&Shared Memory (HM,SMEM): 又称为scratchpad memory,是片上的存储,SM里的所有单元共享。它可以用来作为同一个thread blocks里不同线程之间快速数据交换的通讯接口。由于是片上存储,带宽很大,访问延迟很小。因此,把global/local memory的访问迁移到SMEM上的优化是被编程手册推荐的。为了获得更高的带宽,SMEM被划分成banks,这样就可以并行的访问(寄存器文件和L2 cache也类似)。但是如果在一次内存请求中,访问的两个地址落在了同一个bank,就造成了bank conflict,此时请求需要串行化,从而降低了SMEM的性能。&/p&&p&Global Memory (GM): 又称device memory,GPU片下内存,GPU主存。它是GPU性能的主要瓶颈。GM可达到的吞吐量取决于:(1)GM物理带宽限制,即pin数、线长度和DRAM的物理特性。因此在kelper以前增长缓慢,但是Pascal使用了3D栈内存技术,性能获得了巨大提升。(2) 访存请求合并。LSU一开始会计算每个warp的目标地址。在memory fetch之前,有一个特殊的地址合并硬件来检查同一个warp里地址是否是连续分布的。&/p&&p&Constant Memory (CM) / Constant Cache: 常量内存用来存储在Kernel执行期间没有改变的数据。在所有GPU上都是64KB的off-chip。和local memory类似,都是Global memory的一部分。不被L1或L2 cached,有专门的constant cache。每个SM上8/10KB的常量cache被专门设计,以便 the data of a single memory address can be broadcast to all&br&threads across the warp at a time。&/p&&p&Texture Memory (TM) / Texture Cache: 又称surface memory也在全局内存上。被texture cache cached。Texture cache针对2D的空间局部性进行了优化。&/p&&h2&2.1.3 设备缓存&/h2&&p&L1 Data-Cache:在Fermi上首次被提出来。SM的私有L1 Cache和SMEM共享片上存储,他们的大小是可以配置的,Fermi上16/48 or 48/16,Kepler上32/32 or 48/16。L1 cache line是128B。L1 data cache缓存global memory读和local memory的读写,并且是non-corherent。local memory主要用来寄存器溢出、函数调用和自动变量。当L1 cache 被用来缓存global memory时是只读的,当被用来缓存local memory时也是可写的。从Maxwell开始,传统的L1 cache被统一到了Texture cache里。&/p&&p&L2 Cache: 它被用来缓存各种类型的memory access,且和宿主机的CPU memory保持一致性(?)。采取写回策略。&/p&&h2&2.1.4 NC and ROP&/h2&&p&Interconnection Network (NC): crossbar network.它允许多个SM和L2 banks之间同时通信。crossbar NC包含一条地址线和两条数据线。地址线是单向的,从SM到L2 banks,而两条数据线则是双向的,存储SM和L2 banks。因此,通讯是点到点的。一个内存请求队列(memory-request queue, MRQ)和一个bank 加载队列( bank load queue, BLQ)分别对应了一个SM和L2 bank。当load请求从SM中的LSU产生时,它会首先缓存在MRQ里,然后通过NC被分发到目的BLQ中。在BLQ中等待一会,然后这个请求将被L2 banks处理。crossbar network在同时多个连接时有很高的切换代价,特别是当访问请求随机且数据量大。&/p&&p&Raster Operation Processor (ROP)。&/p&&h2&2.2 GPU执行模型 – 大批量SMIT和线程映射&/h2&&p&Arch.CC.Representative GPUSMsRFSPSFUDPULSUShared MemConstTextureL1L2Tesla1.0Tesla-C87088 KB82N/AN/A16 KB8 KB12 KBN/AN/ATesla1.3Tesla-C KB82N/AN/A16 KB8 KB12 KBN/AN/AFermi2.0Tesla-C KB KB8 KB12 KB48/16 KB768 KBFermi2.1GTX-4601632 KB KB8 KB12 KB48/16 KB512 KBKepler3.0Tesla-K10864 KB/32/48 KB8 KB48 KB48/32/16 KB512 KBKepler3.5Tesla-K401564 KB/32/48 KB8 KB48 KB48/32/16 KB1536 KBKepler3.7Tesla-K80(x2)13×2128 KB KB8 KB48 KB16 KB1536 KBMaxwell5.0GTX-750Ti564 KB KB10 KB24 KBN/A2048 KBMaxwell5.2Tesla-M402464 KB KB10 KB48 KBN/A2048 KBPascal6.0Tesla-P1006064 KB KB10 KB48 KBN/A4096 KB&/p&&h2&2.2.1 SIMT&/h2&&p&single-instruction-multiple-threads,SIMT,单指令多线程。&/p&&p&thread blocks or Cooperative-Thread-Arrays (CTAs)&/p&&p&一个Kernel函数包含很多同时运行的轻量级GPU线程,而这些线程被划分成多个thread blocks组。当Kernel开始运行时,CTAs被分配到不同的SM上去,也可能其中几个CTA被分配到相同的SM上去。&/p&&p&CTA里面的threads则进一步分组管理,这些分组叫warp,warp内遵循&b&lockstep&/b&规则,即所有线程同步执行。&b&在SM里,warp是基本的调度、执行和读写cache/memory的单元&/b&。&/p&&p&如果一个warp里的线程在某个点(if-else等)出现了分歧(warp divergence),则所有的分支顺序执行。执行if的时候,else的线程被挂起。在分歧(if-else)结束以后,再继续lockstep的执行。warp divergence造成了巨大的overhead。&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-a3a7d2eda5927edce6da9ef29f753f25_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&615& data-rawheight=&212& class=&origin_image zh-lightbox-thumb& width=&615& data-original=&https://pic1.zhimg.com/v2-a3a7d2eda5927edce6da9ef29f753f25_r.jpg&&&/figure&&p&&br&&/p&&p&GPU支持multi-issuing和multi-dispatching。在执行期间,dual- or quad- warp scheduler选择两个或四个ready状态的warps分调度到不同的功能单元上(SPs,SFUs,当然大多数指令都是在SP上完成的)。&/p&&h2&2.2.2 线程级别的映射&/h2&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-e7ef453e6e9fe410ae7b8dbb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1319& data-rawheight=&592& class=&origin_image zh-lightbox-thumb& width=&1319& data-original=&https://pic3.zhimg.com/v2-e7ef453e6e9fe410ae7b8dbb_r.jpg&&&/figure&&p&&br&&/p&&ul&&li&线程以warp为单位被映射到SP、SFU或者DPU上。&/li&&li&CTA被映射到SM上。&/li&&li&grid映射到GPU device。&/li&&/ul&&h2&2.3 GPU编程模型&/h2&&h2&2.3.1 Kernel配置&/h2&&p&Arch.CC.Grids/GPUCTAs/GridThds/CTACTAs/SMThds/SMThds/WarpWarps/CTAWarps/SMTesla1.01(512,512,64)4Tesla1.11(512,512,64)4Tesla1.21(512,512,64)32Tesla1.31(512,512,64)32Fermi2.016(216,216,216)248Fermi2.116(216,216,216)248Kepler3.016(232-1,216,216)3264Kepler3.24(232-1,216,216)3264Kepler3.532(232-1,216,216)3264Kepler3.732(232-1,216,216)3264Maxwell5.332(232-1,216,216)3264Maxwell5.232(232-1,216,216)3264Maxwell5.316(232-1,216,216)3264Pascal6.032(232-1,216,216)3264&/p&&h2&2.3.2 编译&/h2&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-f92a8b99d2f5d313d06a5e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1269& data-rawheight=&696& class=&origin_image zh-lightbox-thumb& width=&1269& data-original=&https://pic4.zhimg.com/v2-f92a8b99d2f5d313d06a5e_r.jpg&&&/figure&&p&&br&&/p&&p&PTX stands for Parallel-Thread-Execution,是一个中间级的汇编代码。而cubin二进制则已经指定了架构。&/p&&p&Shader-Assembly (SASS),真正的机器汇编,由cubin文件经过cuobjdump工具转换而来。目前没有官方的sass to cubin的工具。&/p&&h2&2.4 GPU评测模型&/h2&&h2&2.4.1 模拟器&/h2&&p&略&/p&&h2&2.4.2 Benchmarks&/h2&&p&&a href=&https://link.zhihu.com/?target=http%3A//www.findhao.net/easycoding/2304& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GPU benchmark说明&/a&&/p&&h2&2.4.3 Profiling-Tools&/h2&&p&Visual Profiler, Command-line Profiler and nvprof.&br&intensively utilized for measuring different runtime events and performance metrics, such as kernel&br&execution time, L1 hit rate, etc. Please refer to [122] for the details about the profiler tools.&/p&&h2&Reference&/h2&&p&&a href=&https://link.zhihu.com/?target=http%3A//blog.163.com/wujiaxing009%40126/blog/%23m%3D0%26t%3D1%26c%3Dfks_095074& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CUDA性能优化 163的博客&/a&&/p&&p&&a href=&https://link.zhihu.com/?target=http%3A//www.angliphd.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Ang Li 的博士毕业论文&/a&&/p&&p&↓↓↓若代码格式混乱请查看原文↓↓↓&/p&&a href=&https://link.zhihu.com/?target=https%3A//www.findhao.net/easycoding/2296& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic3.zhimg.com/v2-f6bddf47bc95d1d423bd646_ipico.jpg& data-image-width=&128& data-image-height=&128& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GPU基础知识 - FindHao&/a&&p&&/p&
1. GPU历史Arch.Release YearCompute CapabilityProcessMost highlighted FeaturesFlagship GTX/Tesla/Jetson GPUsTesla.1, 1.2, 1.365 nmGPU baseline architectureGTX8800, GTX9800, GTX280,Tesla1060Fermi.140 nmL1/L2 caches, dual…
&figure&&img src=&https://pic2.zhimg.com/v2-71ce4d52d7942ded2a9bcf_b.jpg& data-rawwidth=&1231& data-rawheight=&641& class=&origin_image zh-lightbox-thumb& width=&1231& data-original=&https://pic2.zhimg.com/v2-71ce4d52d7942ded2a9bcf_r.jpg&&&/figure&&p&&网易新闻&是我手机上打开频率比较高的应用,常在上面看看最新的新闻。然而自从我点开几个关于电脑硬件的文章后,网易“大数据”判断我是个电脑发烧友,开始给我推送各种电脑文章。其中,网易号文章质量十分低劣,充满各种标题党和错误。昨天不小心点开一篇介绍CMOS电池的文章,说电池没电后会保存不了BIOS设置、甚至损坏芯片组。 WTF,还有这种操作?不幸的是,下面评论里面满屏的各种担心。作为BIOS的专业人士,绝对不能让这种无稽之谈四处传播,不是西风压倒东风,就是东风压倒西风。今天我们就来讲讲,为什么需要CMOS电池,它是干什么的,没电后会不会是世界末日。&/p&&h2&&b&什么是CMOS?&/b&&/h2&&p&CMOS(Complementary metal-oxide-semiconductor,互补金属氧化物半导体),对,它的名字看起来很non-sense,其实它的名字来源于它的电路设计工艺(参考资料1)。它可以用来制作随机存贮memory,也可以制作感光元件。这里当然说的是电脑主板上用来存储信息的一小段存贮器件,它分为几个Bank,我们可以通过port的index方式存取其中的内容。&/p&&h2&&b&什么是CMOS电池?&/b&&/h2&&p&CMOS中存贮的内容掉电就会消失,而我们的电脑随时都有可能被切断电源,这就需要电池给它供电,才能保证其中的内容不消失。电池通常都是CR2032:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-6f8fecc4b5b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&600& data-rawheight=&399& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic4.zhimg.com/v2-6f8fecc4b5b_r.jpg&&&/figure&&p&这种电池很普通,在某宝和某东很多。在早期,CMOS电池是可以充电的,但随着制造工艺等的发展,需要CMOS电池提供的电力越来越小,现在基本都是不能充电的。它的寿命在3到5年,如果经常开机,可以用的更久。&/p&&h2&&b&CMOS电池的主要功能是什么?&/b&&/h2&&p&这个似乎是个废话,顾名思义,当然是给CMOS供电的了。实际上,它的供电对象实际有不少:&/p&&ul&&li&CMOS内存&/li&&li&实时时钟RTC&/li&&li&没电还需要保持的寄存器(略)&/li&&/ul&&p&&b&CMOS内存&/b&&/p&&p&早期BIOS本身是存贮在PROM上的,本身不能存储信息,那BIOS需要存储的内容放在那里呢?当然是在CMOS里了,这也是直到今天还有些人还在混淆BIOS和CMOS的原因。但是随着技术的发展,现在BIOS都存在Flash里面(&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&杂谈闪存二:NOR和NAND Flash&/a&),CMOS存贮信息的功能逐渐弱化,实际上UEFI的BIOS都在尽量避免将信息放入CMOS,只在为兼容传统功能时才勉强为之。&/p&&p&&b&RTC&/b&&/p&&p&其实给CMOS供电保障其中数据的功能,现在已经不是最重要的,它现在的主要功能是保障实时时钟RTC的运作。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-adbfaa7becddbfe3bf765_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&250& data-rawheight=&255& class=&content_image& width=&250&&&/figure&&p&我们电脑关机后一段时间后,再开机会发现系统时钟并没有停止,这其中的功臣就是CMOS电池。&/p&&h2&&b&CMOS没电会发生什么?&/b&&/h2&&p&BIOS信息会丢失吗?我可以负责任的告诉大家,&b&并不会&/b&!如前面所述,现代UEFI BIOS都将信息存贮在Flash内,并不会消失。&/p&&p&Windows时间会回到1980年吗?&b&很大可能并不会&/b&。现代操作系统包括Windows、Linux会利用网络更新时间,并更新RTC。当然你没有联网或者主动关闭网络时钟校对除外。&/p&&p&会损坏芯片组吗?我可以和大家打赌5毛钱,绝对不会。我们做BIOS经常不插电池,芯片组也不会依赖那个小东西。&/p&&p&那就是什么危害都没有了?也并不是,问题可能有:&/p&&ol&&li&一些传统设备工作不正常,ME的一些信息丢失。&/li&&li&安装Windows 8/10会出现问题。大家可以实验一下,进入BIOS将时间改到1980年,安装Window 8/10会出错,这是因为Windows会检查系统时间。&/li&&/ol&&h2&&b&如何更换CMOS电池&/b&&/h2&&p&如果CMOS都没电了,就别更换电池了,主板太老了,买新的吧。。&/p&&p&好吧,既然你还想再战3年,很简单,一般电脑主板电池分成两种,卧式和竖式:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-90e93b7edd1821dee1e7c_b.jpg& data-size=&normal& data-rawwidth=&598& data-rawheight=&292& class=&origin_image zh-lightbox-thumb& width=&598& data-original=&https://pic3.zhimg.com/v2-90e93b7edd1821dee1e7c_r.jpg&&&figcaption&卧式&/figcaption&&/figure&&figure&&img src=&https://pic2.zhimg.com/v2-7d6aac757bd290d3b8c514c30de3372a_b.jpg& data-size=&normal& data-rawwidth=&566& data-rawheight=&303& class=&origin_image zh-lightbox-thumb& width=&566& data-original=&https://pic2.zhimg.com/v2-7d6aac757bd290d3b8c514c30de3372a_r.jpg&&&figcaption&竖式&/figcaption&&/figure&&p&更换很简单,掰开这个小开关,取出电池:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-51c3fb7a2d77bbe9fabdb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&400& data-rawheight=&266& class=&content_image& width=&400&&&/figure&&p&换入新的电池就好:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-ffc681aff0d82398cd44dd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&400& data-rawheight=&224& data-thumbnail=&https://pic1.zhimg.com/v2-ffc681aff0d82398cd44dd_b.jpg& class=&content_image& width=&400&&&/figure&&h2&&b&补充&/b&&/h2&&p&在评论区里面,有很多同学对&b&如何恢复BIOS初始值&/b&有疑问。毕竟使用了Flash,拔CMOS电池短接啥的应该不起作用了啊,为什么有时候还起作用,不起作用怎么办等等。&/p&&p&这里统一作答,现在主板都有一个跳线(jumper),在需要恢复初始值(缺省值,出厂设置,default等)时,设置该跳线。具体在那里,各个主板不同,需要查看主板说明书。BIOS检测到跳线改变后,会用内置的缺省值覆盖当前值,以达到恢复初始值的目的。&/p&&p&部分大的主板厂商考虑到用户使用习惯,在CMOS里面做了些手脚,当检测到CMOS预设探针变化时,认为CMOS无效了,会清空CMOS,同时恢复Flash里面的初始值。&/p&&p&欢迎大家关注本专栏和用微信扫描下方二维码加入微信公众号&UEFIBlog&,在那里有最新的文章。同时欢迎大家给本专栏和公众号投稿!&/p&&figure&&img src=&https://pic2.zhimg.com/v2-121ecd3d4080deb1c557bf47dc00d246_b.jpg& data-size=&normal& data-rawwidth=&511& data-rawheight=&368& class=&origin_image zh-lightbox-thumb& width=&511& data-original=&https://pic2.zhimg.com/v2-121ecd3d4080deb1c557bf47dc00d246_r.jpg&&&figcaption&用微信扫描二维码加入UEFIBlog公众号&/figcaption&&/figure&&p&&br&&/p&&h2&&b&参考资料:&/b&&/h2&&ol&&li&&a href=&https://link.zhihu.com/?target=https%3A//zh.wikipedia.org/wiki/%25E4%25BA%%25A3%259C%25E5%25BC%258F%25E9%E5%25B1%25AC%25E6%25B0%25A7%25E5%258C%%%25E5%258D%258A%25E5%25B0%258E%25E9%25AB%2594& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&zh.wikipedia.org/wiki/%&/span&&span class=&invisible&&E4%BA%92%E8%A3%9C%E5%BC%8F%E9%87%91%E5%B1%AC%E6%B0%A7%E5%8C%96%E7%89%A9%E5%8D%8A%E5%B0%8E%E9%AB%94&/span&&span class=&ellipsis&&&/span&&/a&&/li&&/ol&&p&&/p&&p&&/p&&p&&/p&&p&&/p&&p&&/p&
"网易新闻"是我手机上打开频率比较高的应用,常在上面看看最新的新闻。然而自从我点开几个关于电脑硬件的文章后,网易“大数据”判断我是个电脑发烧友,开始给我推送各种电脑文章。其中,网易号文章质量十分低劣,充满各种标题党和错误。昨天不小心点开一篇…
&figure&&img src=&https://pic3.zhimg.com/v2-28275eabc7dccfc93b50442eaf83d791_b.jpg& data-rawwidth=&2238& data-rawheight=&724& class=&origin_image zh-lightbox-thumb& width=&2238& data-original=&https://pic3.zhimg.com/v2-28275eabc7dccfc93b50442eaf83d791_r.jpg&&&/figure&&p&昨天写了“之一”,评论区明白人写的评论很精彩。&/p&&p&其实我研究DRAM是在2012年前后,后面好一段时间都没有再碰了,所以知识有些脱节,另外一些当时不特别关注的东西也忘记了,受“之一”评论的牵引,今天再专门补充一些关于DRAM的内容,然后时DDR的时序。&/p&&p&更新:好累,写到12点多了才写这么一点点,后面再细化吧。下一篇跟大家一起学习一下DDR4和内存控制器的设计,后面想讨论一下nvDIMM, 以及新式存储介质。&/p&&h2&DRAM的组织结构&/h2&&p&“之一”中讲的DRAM arrays实际上的名字应该叫array, 而DRAM array应该叫subarray,而且subarray之下还由MAT组成。&/p&&p&以上内容是“之一”评论区指出的,这个我确实不知道,今天查了一下确实如此。网上找到了篇资料,这里就不帖图了,&a href=&https://link.zhihu.com/?target=http%3A//niladrish.org/pubs/hpca17.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&niladrish.org/pubs/hpca&/span&&span class=&invisible&&17.pdf&/span&&span class=&ellipsis&&&/span&&/a&。&/p&&p&&br&&/p&&h2&DRAM的访问延时&/h2&&p&&br&&/p&&p&一条访存指令发到内存控制器,它的访存延时是存在不同的可能性的。&/p&&ol&&li&row buffer hit
就是说数据已经在row buffer中,这时延时主要来自于从row buffer到把数据放在数据总线上的时延,这个过程需要大约20ns的时间。(可能是比较旧的数据了,欢迎评论区发出挑战)&/li&&li&empty row buffer ,即row buffer是空的,访存延时除了从row buffer到数据总线时间,还包括从电容到sense amplifier再到row buffer的时序,需要的延时大约40ns。&/li&&li&row buffer conflict,即当前row buffer存有别的row的内容,此时需要回写过程,即把row buffer中的比特刷回电容。否则电容上的内容可能会与row buffer上的内容不同。再加上2的延时,总共约60ns。&/li&&/ol&&h2&OpenPage Policy和Close Page Policy&/h2&&p&DRAM访问有两种模式,一个Open Page 一个是Close Page。前者在完成一次访存后保留row buffer的内容,如果下一个访存命令恰好也在同一个row上,就会row buffer hit,节省访问时间,但如果后一个访问地址不在同一个row上,就可row buffer conflict,增加了访存时间。后者在完成一次访存后立即执行prechage命令,即将row buffer的内容写回cell,这种情况下下一个访存一定是empty row buffer状态。&/p&&p&&br&&/p&&h2&地址映射策略&/h2&&p&CPU给的一个访存指令中的地址可能是32位数,或是48位数。&/p&&p&现代CPU访存当然不是按字节访问的,而是按cache line访问或双cache line访问的。所以这个地址到了内存控制器之后,cache line以下的地址就没有用了,以上的那些位要做映射。&/p&&p&这个数怎么映射到为行地址、列地址、bank选择等信号上呢?&/p&&p&这就要看怎么映射访问效率高了。&/p&&p&比如说相临的两个Cache line映射到一个行上,那很好,row buffer hit可能就比较多,因为数据有空间局部性,两个cache line先后访问的概率较大。&/p&&p&比如说相临的两个Cache line映射到不同的bank上,这样也很好,同时从两个bank可以并行访问。也就是说你可以先后发两个行地址,然后再发两个列地址,以ROWA, ROWB, COLA, COLB这样的模式访问,ROWB命令就填充了ROWA到COLA之前的空闲时间,因为ROWA和COLA之前要有足够的时间间隔的。&/p&&p&实际计算机中怎么映射呢?实际上没有标准的,有多种方法,比如说:&br&row::rank::bank::channel::column::blkoffset&br&row::column::rank::bank::channel::blkoffset
&br&都是比较常见的用法。&/p&&p&&br&&/p&&h2&DDR接口&/h2&&p&后面是DDR相关的内容了, DDR规范中即涉及DRAM本质,双涉及内存条的设计规范。&/p&&h2&DIMM内存条&/h2&&p&上面提到的rank, channel都还没有介绍过。rank是内存条上的一个概念。&/p&&p&DIMM即Dual Inline Memory Moduel,即双列直插内存模块。&/p&&p&根据规范,内存条的数据线位宽是64或72,即它有一个时钟的一个边沿可以传输64位数据或72位数据。有效数据都是64比特,72=64+8, 多余的8比特给服务器用于做数据的正确性校验。当然,一些人也拿这8个位来做别的用处,比如引发一个中断,下发一些命令什么的。&/p&&p&内存条上有多个DRAM芯片,也叫内存颗粒,一般一个颗粒提供4位或8位数据,称为x4或x8内存颗粒。&/p&&p&以x8的颗粒而言,一个64位宽的家用内存条,至少要有8颗这样的芯片才能构成一个完整的内存条,提供8x8=64位数据。然而我们的内存条上好多时候不止8颗芯片,有可能是16颗,这样它就可以提供两组64位数据。这样的一组称为rank,好多内存条都有两个rank,在DDR总线上可以用一根地址线来区分当前要访问的是哪一组。&/p&&p&&br&&/p&&p&内存插槽上一个槽位只能插一根内存条,一个主板上可能有多个插槽,用来插多根内存。这些槽位分成两组或多组,组内共享物理信号线。这样的一组数据信号线、对应几个槽位、对应几根内存条称为一个channel,一个通道。(哈哈,这里我本来不是这样写的,结果评论区行家太多,吓得我double check一下,原来果然写错了)&/p&&figure&&img src=&https://pic1.zhimg.com/v2-8c4b3af564d7793ba8cff6_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&575& data-rawheight=&289& class=&origin_image zh-lightbox-thumb& width=&575& data-original=&https://pic1.zhimg.com/v2-8c4b3af564d7793ba8cff6_r.jpg&&&/figure&&p&&br&&/p&&p&这样上一节的地址映射策略时提到的几个概念就全了:&/p&&p&row::column::rank::bank::channel::blkoffset &/p&&p&row:行地址&/p&&p&coloum:列地址&/p&&p&rank: rank选择&/p&&p&bank: bank选择,多个内存颗粒同时选相同的bank,一bank即插内存颗粒上的一个array,也指一个rank上多个颗粒的相同bank的集合。&/p&&p&channel:内存通道选择&/p&&p&blkoffset:其余的地址位&/p&&h2&DRAM访问时序&/h2&&p&DRAM访问时序是由DRAM的访问特性决定的,JEDEC根据这些特性,写了一些规范来访问DRAM,比如说DDR3 SDRAM SPEC。SPEC上的内容有一部份是体现DRAM访问时序的,有一部分则体现的是内存条设计方式引入的访问时序。无论如何,我们来大致先看看。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-085dd600dabbfe_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1424& data-rawheight=&1106& class=&origin_image zh-lightbox-thumb& width=&1424& data-original=&https://pic1.zhimg.com/v2-085dd600dabbfe_r.jpg&&&/figure&&p&上图是DDR3 SPEC上截的状态机。&/p&&p&里面的ZQ Calibration, write leveling, read leveling就不说了,都是一些信号对齐之类的东西。&/p&&p&我们直接下面的法阵六芒星,要想读一个数据,首先发的命令叫Bank Activate,我上一节好像是写做row activite了,其实意思差不多,就是给定bank地址,row地址,把一个row的数据读到row buffer里面。然后发列地址,和读信号,即发一个READ命令,然后内存条就把数据放到数据总线上来。如果下一个访存仍然是同一个row上的读或写,可以连续发读或写命令,而无需发bank activate。最后如果这一行不用了,或是要切换另一行,要发precharge命令,把数据写到cell里去。&/p&&p&写是类似的。&/p&&p&下面详细介绍一下主要命令:&/p&&ol&&li&ACTIVATE、ACT&/li&&/ol&&p&
打开一个行,发这个命令时需同时带bank选择信号和行选择信号。对于DDR3而言,bank选择信号有3个,BA0到BA2,意味着它最多支持8个bank。行选择信号有16个,支持64K个行。&/p&&p&2. PRECHARGE/PRE&/p&&p&关闭一个行,把当前row buffer的比特写回cell。&/p&&p&precharge有一个变形叫PREA。它和它的变形分别用于关闭一个行和所有行。&/p&&p&关闭一个行需要时间,这个时间称为tRP,发送PRE/PREA命令后tRP时间才可以发ACT命令。&/p&&p&3. READ&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-cc861dab22f85_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1920& data-rawheight=&608& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&https://pic4.zhimg.com/v2-cc861dab22f85_r.jpg&&&/figure&&p&读命令需要发列地址。列地址给出后,要经过CL或RL时间才能从数据总线得到数据。&/p&&p&CL称为Column latency, RL称为Read latency, RL=AL+CL。这里AL=0.&/p&&p&我们说一次读只能读一个cache line或双cache line,其实不准确。&/p&&p&读支持两种模式BC4和BL8,即读命令后跟4组数据或8组数据,称为半个burst或一个burst。即Burst chop4 , burst length 8。&/p&&p&BL8情况下读到的是64*8位,即64个字节,通常是x86的一个cache line或ARM的两个Cache line。&/p&&p&&br&&/p&&p&读命令还有一个可选的位,置1的话,读命令就变成了read with prechage,即读完自动关闭行,也即close page。&/p&&p&&br&&/p&&p&4. REFRESH&/p&&p&refresh实际上是非常重要的,以至于在大一点容量的内存条上,refresh命令要花的时间占内存条总线时间的10%以上。&/p&&p&因为基本每个行每64ms就要刷新一次。&/p&&p&行多,刷新命令发的就更频繁。&/p&&p&大家已经在发力优化这个刷新时间了,比如说统计一下哪些行能坚持更久一些就大一点间隔刷。&/p&&p&&/p&&p&&/p&&p&&/p&&p&&/p&
昨天写了“之一”,评论区明白人写的评论很精彩。其实我研究DRAM是在2012年前后,后面好一段时间都没有再碰了,所以知识有些脱节,另外一些当时不特别关注的东西也忘记了,受“之一”评论的牵引,今天再专门补充一些关于DRAM的内容,然后时DDR的时序。更新…
&figure&&img src=&https://pic4.zhimg.com/v2-5edc22bf9a99_b.jpg& data-rawwidth=&500& data-rawheight=&450& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&https://pic4.zhimg.com/v2-5edc22bf9a99_r.jpg&&&/figure&&p&今天先写DRAM颗粒,后面有时间再写内存条,DDR, MC.&/p&&p&说起内存和存储, 大家大致都有一个印象:硬盘就按块寻址的,内存是按字节寻址的。&/p&&p&事情真的是这样的吗?&/p&&h2&Long Long Ago&/h2&&p&在8086时代,那时候还没有内存控制器这个部件,CPU是直接与内存颗粒建立连接的,当时他们之间的关系大致是这个样子的:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-9c50b208b8b4a28e1fb4d5d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&873& data-rawheight=&538& class=&origin_image zh-lightbox-thumb& width=&873& data-original=&https://pic2.zhimg.com/v2-9c50b208b8b4a28e1fb4d5d_r.jpg&&&/figure&&p&内存与CPU之间有三类控制线连接,即地址总线、数据总线和控制总线。看起来好像也挺多的样子,实际上并不多。20根地址总线,16根数据总线,其中16根数据总线是复用了20根地址总线的前16根,也就是说这16根线传完地址之后马上又用来传数据。控制线则只有那三两根,比如说写使用、读使能之类的,用于区分当前操作是读还是写。&/p&&p&8086的引脚图大致是如下这个样子的:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-73b426fc6cca012ff29104b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&372& data-rawheight=&308& class=&content_image& width=&372&&&/figure&&p&因为数据总线有16根,所以它可以一次取2字节的数据,以读数据为例,时序如下:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-ff180ce599_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1684& data-rawheight=&1144& class=&origin_image zh-lightbox-thumb& width=&1684& data-original=&https://pic2.zhimg.com/v2-ff180ce599_r.jpg&&&/figure&&p&但是大家别误会,上面的接口不是用来连接DRAM的,而是用来直接连接SRAM的。下面是当时8086可能在一起的小伙伴。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-3c17c4b5ddb002c882bf020_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1328& data-rawheight=&974& class=&origin_image zh-lightbox-thumb& width=&1328& data-original=&https://pic1.zhimg.com/v2-3c17c4b5ddb002c882bf020_r.jpg&&&/figure&&p&这个SRAM有10根地址线,4根数据线,即给定一个10位的地址,可以得到4位的数据,学过微机原理的你现在回顾一下是不是感觉很意外,当时根本就没有注意这件事儿。&/p&&p&这也太。。。,理想中的样子至少是给8根地址线,给8位数据啊。实际使用中,要多个片子一起用才用得起来。看起来很麻烦的样子,然而DRAM还在更麻烦一些:它地址还不能一次给完,需要分两次分别给行地址和列地址。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-70f605bfa715a0ae37bd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1318& data-rawheight=&842& class=&origin_image zh-lightbox-thumb& width=&1318& data-original=&https://pic2.zhimg.com/v2-70f605bfa715a0ae37bd_r.jpg&&&/figure&&p&这绝对不是因为电路设计人员很傻Boy,才设计成这个样子,而是有不得不设计成这个样子的原因的。&/p&&p&&br&&/p&&h2&DRAM的原理&/h2&&p&DRAM,即动态随机访问存储器,dynamical random access memory.&/p&&p&这里的动态是指它存储数据的单元是不稳定的,只能存一小会儿就得刷新一下,不然数据就没了,对,只需要不到一秒钟数据就没了,需要在它消失掉之前加电刷新才能保持。&/p&&p&大家可能知道,DRAM的存储介质是一个电容。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-2ce8cebac52f71675f0df_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&504& data-rawheight=&304& class=&origin_image zh-lightbox-thumb& width=&504& data-original=&https://pic4.zhimg.com/v2-2ce8cebac52f71675f0df_r.jpg&&&/figure&&p&对,这是Cs, 那个大大的三级管是用来选通的。学过模拟电路的大家知道,电容是可能漏电的,而在DRAM里做的密度非常高、体积非常小的电容更是漏得快。&/p&&p&所以每隔一段时间,在电容的电量还可以保证读到正确的值的时候,就要把值读出来,再重新写进去,即如果原来是1,就要给它充电充满。在90nm工艺下,电容的容量大致是30pf, 漏电流是1fA. 但我忘记是怎么算需要多久漏光的了。不过一般内存条的刷新时间都是64ms。&/p&&p&&br&&/p&&h2&DRAM Array&/h2&&p&多个DRAM存储单元以矩阵的方法排列在一起,称为一个DRAM Array,它有m行,n列,给定一个行号,一个列号,就可以唯一指定一个DRAM cell,从而从中读取或写入一个比特的数据。&/p&&p&通过指定行号,也即行地址,指定行的各个cell上的字线就会置1,从而打开三极管,使电容上的电荷流通过位线流出去。&/p&&p&由于电容上的电荷数非常少,不足以直接驱动数据电路,所以还需要一个电子部件叫Sense Amplifier,来访大这个数据,把这个数据转换为一个比特的数据。由于给完行地址之后,一行的所有列上的三极管都被打开了,所以就要把一行的数据都读出来,所以每个列都有一个Sense Amplifier,如果有1024列,就有1024个Sense amplifier。&/p&&p&这样一来,给定行地址的时候,实际上就把1024个位都读出来了,但是大家知道我们的内存条一次并不是返回1024比特的数据的,实际上这些数据都被内存条缓存起来,缓存的地方称为Row Buffer,因为它缓存的是一行的数据。&/p&&p&以上过程称为row activate,行激活。&/p&&p&&br&&/p&&p&下面要给定列地址了,给定一个列地址,从row buffer中选一个位,读回去。相对于行激活,给定列地下并从row buffer中取一个位出来快很多,不需要花费什么时间。这个时钟周期的上升沿给地址,下降沿就可以给数据了。&/p&&p&&br&&/p&&h2&DRAM颗粒的位宽&/h2&&p&从上面的介绍上,一个DRAM Array只能一次取出一个比特的数据,一个DRAM 颗粒可以取出一般2,4,8,16位的都有,这是怎么做到的呢?方法就是在一个DRAM颗粒中封装多个DRAM array,让他们同时接受行地址,同时接受列地址,同时给出一个位的数据,如果有8个dram array,就可以做成一个8位的dram 颗粒了。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-b73c8be41d940a848a36bc_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1240& data-rawheight=&1170& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&https://pic1.zhimg.com/v2-b73c8be41d940a848a36bc_r.jpg&&&/figure&&p&&br&&/p&&h2&Bank地址&/h2&&p&Row buffer是一个好东西,8个1024列的DRAM array组成的DRAM arrays(注意这里有个s,笑),给定一个行地址,实际上它已经准备好了1024 bytes的数据, 如果运气好,后面CPU需要访问的数据地址也在这个行内的话,就可以省略行激活过程,直接发列地址,取数据就好了,速度so so快。&/p&&p&行激活是一个很慢的过程,CPU发出来的访问请求都是紧挨着的这个假设不现实,比如说两个线程,大概率会访问不挨着的地址。如果两个线程交替访问,尽管他们各自来讲都在一个行内访问,但由于交替进行,就得不停的行激活。row buffer中就会两个行的数据换来换去。&/p&&p&如果有两个row buffer,分别服务不同的行,岂不是美资资?&/p&&figure&&img src=&https://pic3.zhimg.com/v2-add53aa36ba_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&2168& data-rawheight=&1106& class=&origin_image zh-lightbox-thumb& width=&2168& data-original=&https://pic3.zhimg.com/v2-add53aa36ba_r.jpg&&&/figure&&p&内存条不掌握CPU的高级信息,所以它只能用一个笨办法。&/p&&p&它在一个内存颗粒里放四个上述的dram arrays,称为四个Bank。&/p&&p&一个Bank就是一个全功能的8x1024 dram arrays.&/p&&p&在发送行地址的时候,同时还要发两个比特的bank地址,用于区分访问哪个bank。这样每个bank都有自己的row buffer,就有了四个row buffer, 使CPU大概率每个线程访问的是不同的bank,这样就可以四个row buffer大概率同时工作了。从而减少行激活,提高速度。&/p&&p&下面总结一下,一个内存颗粒有多个bank,4或8个。每个bank即一组dram arrays,一个dram array即一个mxn的dram cell矩阵,一个dram cell是1T1C结构,即一个三级管,一个电容。&/p&
今天先写DRAM颗粒,后面有时间再写内存条,DDR, MC.说起内存和存储, 大家大致都有一个印象:硬盘就按块寻址的,内存是按字节寻址的。事情真的是这样的吗?Long Long Ago在8086时代,那时候还没有内存控制器这个部件,CPU是直接与内存颗粒建立连接的,当时…
&figure&&img src=&https://pic1.zhimg.com/v2-202ed1fb46_b.jpg& data-rawwidth=&800& data-rawheight=&444& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic1.zhimg.com/v2-202ed1fb46_r.jpg&&&/figure&&p&这是IC君的第24篇原创文章 (同步于微信公众号 icstudy )&/p&&p&连续几日大雪,IC君可以在家好好写文章了。但是想想项目分配的活还是要准时高质量的完成,真是头大啊。&/p&&p&之前有一篇文章介绍了&a href=&https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzIxMzg0MDk0Mg%3D%3D%26mid%3D%26idx%3D1%26sn%3D8ec3efe6daeb%26chksm%3D97b1e4e2a0c66df49c563dddbdf2cbc61b97cd7eea1d03e3ascene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&简单优雅的总线协议——I2C&/a&,这篇文章来聊一聊SPI协议。标准SPI协议比I2C协议就多了2根线,但它的协议生涯就起了翻天覆地的变化。&/p&&p&在网上搜了一下SPI的协议,基本上都是这样写的&/p&&p&SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一 种同步串行接口技术,是一种&b&高速的,全双工,同步的&/b&通信总线。&/p&&p&高速和同步可以理解,全双工是什么鬼?&/p&&p&全双工是指host(主设备)与外围从设备之间的发送线和接受线各自独立,发送数据的同时也能够接收数据,两者同步进行。&/p&&p&&br&&/p&&p&SPI协议主要用于短距离的通信系统中,特别是嵌入式系统,比如以下芯片:&/p&&p&&b&存储器:&/b&RAM,EEPROM,Flash等&/p&&p&&b&数模转换:&/b&A/D,D/A转换器等&/p&&p&&b&驱动接口:&/b&LED显示驱动器、I/O接口芯片、UART收发器等。&/p&&p&&br&&/p&&p&2017年哪类芯片最缺货啊?存储器相关的啊!好吧,就选它了:SPI Flash。SPI Flash的本质就是使用SPI的协议去对Flash 存储器进行各种读写操作。结合Flash有助于我们更好的理解SPI协议。&/p&&p&首先我们从国内最大的SPI NOR Flash公司兆易创新网站上下载一份datasheet(公司看到可以给我打广告费了):&/p&&p&&a href=&https://link.zhihu.com/?target=http%3A//www.gigadevice.com/product/download/368.html%3Flocale%3Den_US& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&gigadevice.com/product/&/span&&span class=&invisible&&download/368.html?locale=en_US&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&&br&&/p&&p&datasheet对应的是一颗存储容量为512M-bit SPI NOR Flash。&/p&&p&&br&&/p&&p&从datasheet第4页的特征介绍可以看出这颗产品支持标准单端口(1IO)、Dual SPI(2IO)、Quad SPI(4IO)模式的SPI协议。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-ca54347fddd9fc55f5d06eb60bd25289_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&354& data-rawheight=&105& class=&content_image& width=&354&&&/figure&&p&从datasheet第5页的封装方式可以看到,芯片包含以下输入输出端口:SCLK, CS#, SI, SO, WP#, HOLD#&/p&&figure&&img src=&https://pic3.zhimg.com/v2-80b8af6e4dd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&553& data-rawheight=&370& class=&origin_image zh-lightbox-thumb& width=&553& data-original=&https://pic3.zhimg.com/v2-80b8af6e4dd_r.jpg&&&/figure&&p&从datasheet第6页的封装方式可以看到对输入输出pin功能的描述:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-11cadf027c0ee171f0cac8bc5918ef3e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&496& data-rawheight=&175& class=&origin_image zh-lightbox-thumb& width=&496& data-original=&https://pic2.zhimg.com/v2-11cadf027c0ee171f0cac8bc5918ef3e_r.jpg&&&/figure&&p&其中CS#是一个芯片选择信号,#表示这个pin输入low的时候才会选中当前芯片,其它pin的输入才可能有效;如果为high,则不选中该芯片,其它pin的输入是完全无效的。&/p&&p&&br&&/p&&p&SCLK是一个输入时钟,是由外部的主器件输入的;&/p&&p&SI是输入信号,也是有外部的主器件输入的;&/p&&p&SO是输出信号,是由从器件输出到主器件的;&/p&&p&&br&&/p&&p&通常标准SPI协议(1IO)只包含上面4个信号。对于这颗芯片中的Dual SPI (2IO)/Quad SPI(4IO) 模式还会用到另外2个pin:WP#和HOLD#。这里我们可以简单的认为WP#和HOLD#就是跟SI/SO地位平等的2个信号。&/p&&p&&br&&/p&&p&接着我们来看看这几个输入输出信号之间的时序关系,如下图所示:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-904cbc23c00a12cff4d1b842d8110767_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&497& data-rawheight=&162& class=&origin_image zh-lightbox-thumb& width=&497& data-original=&https://pic1.zhimg.com/v2-904cbc23c00a12cff4d1b842d8110767_r.jpg&&&/figure&&p&芯片选择信号CS#和时钟信号SCLK有相对关系,用来确定输入SCLK有效和无效。&/p&&p&&br&&/p&&p&&b&tSLCH :&/b&定义了CS# go low 到第一个CLK go high的时间,只有主器件给的时间大于这个时间,输入的CLK信号才算有效。这个参数在datasheet上要求最小是5n。如果主器件给的时间小于5n,则输入的第一个CLK有可能无效,整个传输过程就有可能发生错误。&/p&&p&&br&&/p&&p&&b&tDVCH和tSLCH:&/b&定义了输入数据SI和输入时钟CLK之间的setup/hold 时间,这个跟我们数字电路里面的DFF触发器的setup/hold概念是相同的。这2个参数在datasheet上定义的最小值分别是2n/2n。&/p&&p&&br&&/p&&p&SPI协议的整个工作过程如下:&br&&/p&&p&当CS# go low之后,输入到从器件的CLK开始有效,全双工的传输过程开始。主器件在信号线SI上输入数据并被从器件读取,从器件输出数据到SO信号线并被主器件读取。当CS# go high之后,从器件不再被选中,结束整个传输过程。&/p&&p&&br&&/p&&p&在传输的时候,不管是输入输出,通常都是以一个byte的最高有效位(MSB)开始传输:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-9203cfba3e3ed302eb7e4df_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&500& data-rawheight=&200& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&https://pic3.zhimg.com/v2-9203cfba3e3ed302eb7e4df_r.jpg&&&/figure&&p&比如主器件输入bit7-&6-&5-&4-&3-&2-&1&0,从器件接受每个bit之后再向右shift,最终一个byte传完之后,从器件看到的顺序是bit[0:7]。从器件的输出方式类似。&br&&/p&&p&&br&&/p&&p&在datasheet的第9页有这样一句话:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-fa3d2efbeefc102c92ca5_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&556& data-rawheight=&96& class=&origin_image zh-lightbox-thumb& width=&556& data-original=&https://pic4.zhimg.com/v2-fa3d2efbeefc102c92ca5_r.jpg&&&/figure&&p&SPI总线支持mode 0和3。这里的mode 0和3是指时钟模式,SPI协议通常有4种模式,可以通过CPOL(时钟极性 Clock Polarity)和CPHA(时钟相位 Clock Phase)来定义:&/p&&p&Mode0:CPOL=0,CPHA=0&/p&&p&Mode1:CPOL=0,CPHA=1&/p&&p&Mode2:CPOL=1,CPHA=0&/p&&p&Mode3:CPOL=1,CPHA=1&/p&&p&CPOL表示SPI总线空闲的时候时钟的default状态,对于SPI NOR Flash而言就是CS# go high之后 SCLK的值。&/p&&p&如果是Mode0, SCLK 为0;&/p&&p&如果是Mode3 ,SCLK 为1;&/p&&p&&br&&/p&&p&CPHA表示用第几个边沿去采样数据,0表示第一个,1表示第二个:&/p&&p&对于Mode0而言,SCLK go high的时候去采样数据,就像一个正沿的dffp;&/p&&p&对于Mode3 而言,因为SCLK初始值为1,而采样沿为第二个,所以SCLK必须有1-&0, 0-&1的过程,同样也是在SCLK上升沿采样输入的数据;&/p&&figure&&img src=&https://pic2.zhimg.com/v2-7e20fd194f21ff2b1697_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&258& data-rawheight=&120& class=&content_image& width=&258&&&/figure&&p&对于Mode1和Mode2,大家可以自行推断总线空闲时CLK的初始值和采样数据的时钟沿。&/p&&p&&br&&/p&&p&不得不说SPI Flash的协议支持时钟的模式是精心挑选的,都是CLK的上升沿采样数据,没有坑设计人员。如果所有的时钟模式都支持,设计和验证的工作量可能会大大增加。有时候datasheet上面的随便一句话,对于我们设计人员可能要付出很大的面积和大量的验证时间的代价,更悲剧的是这个功能95%的时间都用不到。&/p&&p&既然上升沿用来采样输出数据,那输出数据只能是下降沿了:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-372fa076ff3e61bbcfa67_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&553& data-rawheight=&167& class=&origin_image zh-lightbox-thumb& width=&553& data-original=&https://pic1.zhimg.com/v2-372fa076ff3e61bbcfa67_r.jpg&&&/figure&&p&对于SPI Flash而言,有一个参数tCLQV 用来定义在一定的负载电容下 Clock Low 到 Output Valid 的时间,实际应用中你必须大于这个时间来采样数据。如果系统的时钟频率(Host 和SPI Flash都是用的这个频率)比较慢,那你在下一个clk的上升沿就可以采集上一笔数据;如果系统的时钟频率比较快(百Mhz量级),只能在下一个时钟的下降沿去采集数据。&/p&&p&&br&&/p&&p&一般SPI的协议比较快的时钟频率可能能到几百Mhz,再快的IC君没见过。相对于I2C的几Mhz速度快了很多,速度越快要求驱动负载loading越轻。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-01b87a7f6add4debafb2e2e6e68f6eb5_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&563& data-rawheight=&154& class=&origin_image zh-lightbox-thumb& width=&563& data-original=&https://pic1.zhimg.com/v2-01b87a7f6add4debafb2e2e6e68f6eb5_r.jpg&&&/figure&&p&这颗SPI Flash的时钟最快频率是104MHz,在最差的工艺角下仿真结果也要达到这个频率。&/p&&p&&br&&/p&&p&举一个读的例子来解释SPI协议在Flash中的应用,CS# go low, 利用SPI的协议输入8 bit的读command code 03H,再输入想读的地址(门牌号),Flash开始输出内容(房间里面有什么东西),输出一段时间后,主器件不再需要数据了, CS# go high 退出这个command。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-372fa076ff3e61bbcfa67_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&553& data-rawheight=&167& class=&origin_image zh-lightbox-thumb& width=&553& data-original=&https://pic1.zhimg.com/v2-372fa076ff3e61bbcfa67_r.jpg&&&/figure&&p&SPI协议可以操作在主器件对&b&单个&/b&或者&b&多个&/b&从器件的条件下:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-a2d5dfdf711d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&363& data-rawheight=&288& class=&content_image& width=&363&&&/figure&&p&这个时候芯片选择信号有多个,但同一个时间只能有一个SS# (CS#)有效,选中一个从器件,从器件的输出信号MISO(SO)端口都是三态驱动的:&/p&&p&输出高电平 &1&;&br&&/p&&p&输出低电平 &0&;&/p&&p&如果SS# (CS# 为high,不选中该从器件 )则输出高阻态;&/p&&p&被选中的从器件驱动MISO端口输出到主器件的时候,&b&其它从器件的输出都是高阻态。&/b&&/p&&p&下面是一种CMOS三态驱动门的电路:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-aadf859f81d7411f4dda4feb5698e19b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&439& data-rawheight=&234& class=&origin_image zh-lightbox-thumb& width=&439& data-original=&https://pic3.zhimg.com/v2-aadf859f81d7411f4dda4feb5698e19b_r.jpg&&&/figure&&p&可以看到,EN=0的时候输出没有驱动能力,处于高阻状态。&/p&&p&最后总结一下,SPI协议的优缺点:&/p&&p&&b&优点&/b&&/p&&ol&&li&&b&协议简单利于硬件设计与实现,比如不需要像I2C协议中每个从器件都需要一个地址;只用到4根线,封装也很容易做&/b&&/li&&li&&b&全双工的协议,既能发送数据也能接受数据&/b&&/li&&li&&b&三态输出的驱动能力强,相对I2C的开漏输出,抗干扰能力强,传输稳定;&/b&&/li&&li&&b&相对于I2C协议,时钟速度快,没有最大限制&/b&&/li&&li&&b&输入输出的bit数也没什么限制,不局限于一个byte&/b&&/li&&/ol&&p&&br&&/p&&p&&b&缺点&/b&&/p&&ol&&li&&b&信号线4根,比I2C多,芯片选择线会随着从器件的个数的增加而增加&/b&&/li&&li&&b&传输的过程没有确认信号,撸起柚子加油传,不管从器件收不收到;在SPI Flash中会有read status 这个命令确认从器件的状态,是否处于busy状态&/b&&/li&&li&&b&没有校验机制,I2C也没有,难兄难弟啊&/b&&/li&&/ol&
这是IC君的第24篇原创文章 (同步于微信公众号 icstudy )连续几日大雪,IC君可以在家好好写文章了。但是想想项目分配的活还是要准时高质量的完成,真是头大啊。之前有一篇文章介绍了,这篇文章来聊一聊SPI协议。标准SPI协议比I2C…
&p&&a href=&//link.zhihu.com/?target=https%3A//www.toutiao.com/i7061390/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&某固态硬盘厂商拼死要保守的秘密,不惜动用黑客攻击也要掩盖&/a&&/p&&p&
最近二三十年以来,CPU、内存性能已经增长上百倍上千倍,而存储数据的硬盘却慢的跟狗一样,5200转使用了十多年才好不容易爬到7200转。所以PC对新一代储存ssd的需求渴望可想而知。&/p&&p&  现在的SSD市场有多火?处理器巨头Intel、AMD插手;之前一直嘴硬的老牌机械硬盘寡头西数、希捷断臂转型;传统SSD厂商,三星、英睿达、东芝、闪迪、浦科特等齐头并进;索泰、影驰、七彩虹等这些显卡厂商也都不务正业;之前专注于闪存盘SD卡等移动存储的厂商像金士顿、必恩威,也纷纷加入SSD竞争阵营。目前2016年底,生产SSD厂家保守估计起码有50个。&/p&&p&  显然现在各大厂商在SSD这条路上,已经是义无反顾、坚持不懈、至死方休。而在容量上,NAND闪存也越来越不是事儿,13年TB级产品已经上市,15年三星做出了16TB的固态硬盘。阻碍SSD普及的最后一道防线:价格也开始崩溃。剩下的只是降低成本和时间的问题。&b&民用市场HDD吃枣药丸。&/b&&/p&&figure&&img src=&https://pic2.zhimg.com/b935dba25d049fea5a4ec4d_b.png& data-caption=&& data-rawwidth=&448& data-rawheight=&266& class=&origin_image zh-lightbox-thumb& width=&448& data-original=&https://pic2.zhimg.com/b935dba25d049fea5a4ec4d_r.jpg&&&/figure&&p&先声明的是,我并非利益相关,只是换多了ssd稍有熟悉。不足之处多多指正。 &/p&&p&&b&一、固态硬盘内部结构&/b&&/p&&p&  SSD最基本的组成部件:主控芯片、NAND闪存芯片、固件算法。组成SSD的关键部件:PCB设计、主控、Nand闪存各家之间都几乎一样,对于相同方案的产品来说,决定性能和稳定性差异的主要是固件不同。&/p&&p&&b&1、主控:&/b&&/p&&p&  在SSD中,主控看上去只是一颗躲在某个角落、并不起眼的小芯片,基本是基于ARM架构的处理核心。有句老话叫“秤砣小,压千斤”,这用来形容主控芯片一点也不为过,除了存储部分由闪存芯片负责之外,固态硬盘的功能、规格、工作方式等正是由这颗小小的芯片控制的。&u&主控芯片在SSD中的作用就跟CPU一样&/u&,主要是面向调度、协调和控制整个SSD系统而设计的。主控芯片一方面负责合理调配数据在各个闪存芯片上的负荷,另一方面承担了整个数据中转,连连接闪存芯片和外部SATA接口。除此之外,主控还负责ECC纠错、耗损平衡、坏块映射、读写缓存、垃圾回收以及加密等一系列的功能。&/p&&p&  主控的技术含量不低,能玩得转的没几家。&u&目前主流的控制器有Marvell、SandForce、三星(自用)、Intel(自用)、JMicron、Indilinx(已被OCZ收购专用)、东芝等主控芯片&/u&。&/p&&p&  Marvell各方面都很强劲,高端大气上档次。早期运用企业级产品,现也用在浦科特、闪迪、英睿达等品牌SSD上。Marvell自身也是一家大型公司,这两年也没什么变动,技术进步也很平稳,也没出过什么主控质量问题,未来的前景也值得看好。&/p&&p&  SandForce的性能也不错,它的特点是支持压缩数据,比如一个10M的可压缩数据可能被他压成5M的写入硬盘,但还是占用10M的空间,可以提高点速度,最大的特点是会延长SSD的寿命,但是主控CPU占用会高点而且速度会随着硬盘的使用逐渐小幅度降低。代表型号为SF-2281,运用在包括Intel、金士顿、威刚等品牌的SSD上。相比Marvell公司,SandForce公司这两年就有点折腾了。被LSI、Avago多次转手之后,&u&SandForce最终于2014年落入机械硬盘厂商希捷的手中。&/u&(至于希捷好基友西数也是通过收购拓展固态硬盘业务,举债千亿收购闪迪,砸锅卖铁为君来。收购将于日生效。)&/p&&p&  Samsung主控一般只有自家的SSD上使用,性能上也是很强悍的,不会比Marvell差多少。目前三星主控已经发展到第五代MEX,主要运用在三星850EVO、850PRO上。&/p&&p&  除了自有SSD主控的公司,在外包主控的市场中,Marvell与SF占据了90%的份额,留给其他厂商的空间并不多。&u&2016年,来自台湾主控厂商,智微Jmicron、慧荣Silicon Motion、群联Phison三家公司的主控它们的成本低廉相当受SSD厂家欢迎。&/u&2012年附近几年一直是山寨厂商的最爱,如今台系主控已经不满足于廉价低端市场了,开始在技术与性能上寻求进一步突破。(目前看起来,混的比较好的是慧荣)&/p&&p&&b&2、NAND闪存:&/b&&/p&&p&  如果说主控是衡量一款固态硬盘的技术反面,那么颗粒就代表着产品的用料诚意度。&/p&&p&  SSD用户的数据全部存储于NAND闪存里,它是SSD的存储媒介。SSD成本的80%就集中在NAND闪存上。NAND闪存不仅决定了SSD的使用寿命,而且对SSD的性能影响也非常大。&/p&&p&&b&颗粒的传统分类:SLC、MLC、TLC &/b&&/p&&p&  简单来说,NAND闪存中存储的数据是以电荷的方式存储在每个NAND存储单元内的,SLC、MLC及TLC就是存储的位数不同。单层存储与多层存储的区别在于每个NAND存储单元一次所能存储的“位元数”。&/p&&p&  SLC(Single-Level Cell)单层式存储每个存储单

我要回帖

更多关于 p值为0.00怎么理解 的文章

 

随机推荐