资讯
HOME
资讯
正文内容
nand 写oob Linux设备驱动框架里的设计模式之——模板方法(Template Method)
发布时间 : 2024-11-24
作者 : 小编
访问数量 : 23
扫码分享至微信

Linux设备驱动框架里的设计模式之——模板方法(Template Method)

本文系转载,著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

作者: 宋宝华

来源: 微信公众号linux阅码场(id: linuxdev)

前言

《设计模式》这本经典的书里面定义了20多种设计模式,虽然都是面向对象的,似乎需要C++、Java这样的语言才能实现,但是根据笔者前面反复强调的,Linux内核虽然是用C语言和汇编语言写成,但是其实也到处充满了面向对象的设计。面向对象更多的是一种思想,而不是一个语言。我们可以用C语言实现极大的OO,Linux内核到处都有OO。

模版方法

比如,在Linux的设备驱动框架中,就用了一种非常经典简单的设计模式——模板方法(Template Method),当然还有一些其他的设计模式。而设计模式牛逼的地方在于,高手往往不经意之间已经用到了设计模式,甚至自己都不知道。如果高手没有系统地学习过设计模式,这其实不见得是一个问题。这并不意味着它不懂设计模式,只是他自己都不知道自己用到了哪个模式。而设计模式学习的终极目的,当然也是忘记设计模式,这个跟练独孤九剑没什么区别,到最后其实是无招胜有招。

模板方法这个模式,强调定义一个基类,这个基类实现了通用的流程和算法。比如做一件事情需要经过step1()、step2()、step3()。那么我们定义一个基类:

而其中的step1()、step2()、step3()、step4()具体如何实现则是因人而异,所以我们从baseClass类里面,继承出来的类里面,实现step1()、step2()、step3()这样的代码,override掉baseClass里面的函数。

这样的设计让外部不关心derivedClass,因为流程和接口都是在基类的。而基类实现的doSomething()成员函数,是对外的接口。这个UML关系是非常简单的:

驱动案例

在Linux设备驱动里面,大量存在类似的设计,我们以NAND为例子。在drivers/mtd/nand/nand_base.c这层里面,定义了NAND的一些操作流程。

比如写OOB的代码:

它这个里面要走cmdfunc()、write_buf()、cmdfunc()、waitfunc()这些步骤,这些步骤,不管是全世界哪个NAND的硬件,都是一样的通用的,但是具体的不同的NAND硬件控制器,实现这些步骤中涉及到的cmdfunc()等函数的实现方法却因人而异。

譬如freescale的版本fslelbcnand.c就是:

nandbase.c这个C文件是NAND的中间层,它非常类似我们前面说的实现baseClass这一层的代码,nandwriteoobstd函数类似baseClass :: doSomething。而Linux驱动中定义的nandchip的各个不同的NAND控制器,对nandchip这个结构体中成员函数cmdfunc()、writebuf()等的实现则是各异的,类似derivedClass里面override掉step1()、step2()。nandchip定义在include/linux/mtd/nand.h:

这样的设计,好处是非常明显的。特定的硬件只用管与自身操作相关的事情,而通用的流程,都由nand_base搞定,最大程度上减小了具体实例的代码量,也最大程度上复用了中间层的代码。

这样的例子无处不在,比如我们在LCD的中间层:

后语

本文后语不搭前言,请见谅。最近有很多童鞋询问笔者,做Linux驱动有没有前途?笔者明确地告诉大家:根本没有前途! 但是前途是自己赚的,这依赖你从驱动进去,但是从更大的视角出来:

通过做驱动理解很多OO的架构设计思想,升华自己高内聚和低耦合的理解,把自己变成一个更高level的software engineer;通过做驱动,进一步理解Linux本身的进程、内存、IO等知识,升华对软件系统和性能分析的理解,把自己变成一个更高level的技术expert。

如果做了5年驱动,进入的时候是调试寄存器搞示波器,出来的时候还是调寄存器搞示波器,那自然是完全没有什么前途的!

有没有前途,这个事情,完全是因人而异的。前途是无所谓有,无所谓无的。你如果有抽象、衍生的能力和不断学习总结的精神,无论是做驱动还是不做驱动,都会是很有前途的事情。反之,做什么基本都没前途。

更多精彩更新中……欢迎关注微信公众号:linux阅码场(id: linuxdev)

一文了解固态硬盘(SSD)

固态硬盘(SSD), Solid State Disk,固态硬盘是用固态电子存储芯片阵列而制成的硬盘,主要由两部分组成。(注:本文主要介绍主流产品)

1 主控单元:用来操作存储单元,并驻留一定固件,带有操作系统的部件。

2 存储阵列:闪存芯片(NAND FLASH),单片FLASH芯片有64GB/128GB/256GB,也有少量SSD存储芯片采用DRAM芯片制作而成。

SSD的外观可以被制作成多种模样,例如:笔记本硬盘、微硬盘、存储卡、U盘等样式。这种SSD固态硬盘最大的优点就是可以移动,而且数据保护不受电源控制,能适应于各种环境,适合于个人用户使用。

固态硬盘接口:

常见的固态硬盘内部如下图所示,主要由控制器、电源、NAND FLASH阵列、对外连接器组成。

对外接口主要保护以下:IDE、SATA、mSATA、PCIE、M.2,IDE接口的固态硬盘由于采用并行数据传输方式,数据线较多,且常常速度较慢已经逐步被淘汰;SATA2.0支持最大速率3Gbps,这类接口由于最大支持的速度有限,无法完全发挥出SSD的性能。SATA3.0支持最大速率达6Gbps(Gb per second)。而其最大的优点就是目前市场非常成熟,市场上很多硬盘都是这种接口。

m SATA 也称为mini-SATA,适用于对尺寸要求较高的场合,m SATA是一种小型化的SATA接口。

PCI-E接口也是最初出现的一种接口,开始主要应用于企业级SSD及其他数据传输场合,随着SATA接口速率瓶颈的到来, PCI-E硬盘才逐步开始在高端消费市场流行起来。

M.2原名是NGFF接口,这是为超级笔记本量身定做的新一代接口标准,主要用来取代mSATA接口。不管是从非常小巧的规格尺寸上讲,还是说从传输性能上讲,这种接口要比mSATA接口好很多。M.2可以同时支持SATA和PCIE接口,如今的M.2接口可支持PCI-E 3.0 x4通道,理论带宽达到了32Gbps,且该接口支持新的NVME标准,进一步提升了固态硬盘的数据传输性能。

NAND FLASH是如何存储信息的?

固态硬盘通常包含多片FLASH芯片,每一片FLASH内部可分为多个Plane,每个Plane又可分为多个Block。 通常使用的是2D的NAND FLASH,目前最新研制的3D NAND FLASH已经面试,采用立体堆叠的方式可以使得单片NAND FLASH的容量大大提升。

Block就是我们通常说的块,对某个块进行数据读写的操作。而每个Block上,又可分为多个Page,绝大多数的固态硬盘的单个Page由4Kb的数据区+128b的OOB组成。

OOB(out of band,带外数据)在 NAND Flash 中是附加数据空间,用于存放额外的 ECC 纠错码和元数据。

在数据读写的过程中,Page是最小单位,即写数据和删除数据时只能对整个Page进行操作。所以Nand Flash在硬件设计时候,对于每一片(Plane),都有一个对应的区域专门用于存放缓存数据,将要写入到物理存储单元中去的或者刚从存储单元中读取出来的数据放入这个数据缓存区,本质上就是一个缓存buffer,也叫做page register 。固态电子盘在读写数据时的数据流向如下。

存储颗粒是什么?

存储颗粒是存储数据的最小单元,目前主要有三种:SLC、MLC和TLC。

颗粒都是有寿命的,即固态硬盘是有寿命的,在达到固态硬盘寿命以后,FLASH 内部的坏块数量将以指数形式上升,很快使得硬盘不能使用。而直接影响寿命的因素就是存储颗粒的重复擦写次数。

其中SLC为30000~100000次;MLC为:3000~5000次;TLC为:500~1000次。市面上主流固态硬盘均为TLC 颗粒,容量大,价格低。在可靠性要求较高的场合可使用MLC颗粒,SLC通常应用于国防军工等高可靠性场合,通常单片64GB的SLC颗粒的FLASH价格可达几千元。

计算机中所有的信息都会回归到0和1上,因此只要能用来区分0和1的物体都可以用来记录数据,例如原来用绳子打结来计数的方式。

写入数据时,在CONTROL施加电压,电子由SOURCE流经DRAIN时就会有部分电子跃迁至FLOATING层。

擦除时,在底下的半导体施加电压,即可释放掉悬浮层中的电子,在没有外来电场的作用下,悬浮层中的电子由于上下两个SiO2层的作用使其无法逃离,电荷/数据可以保存十多年之久。

这种单个颗粒仅有高或者低两种状态的颗粒就是SLC的工作模式,由于在不断擦写的过程中,电子需要不断的穿越中间的SiO2衬底,会逐渐破坏其隔离电子通过的性能,直到颗粒彻底损坏。

SLC单个颗粒有两种电平,可以保存1bit数据,MLC可以保存2bit数据,TLC可以保存3bit数据,QLC可以保存4bit的数据,但是由于其寿命仅有一百余次,目前市面上很少见到这种产品出现。

固态硬盘的寿命保护机制:擦写次数不够,容量来凑。

1容量冗余操作:为什么我们买的512GB的硬盘到手只有四百多GB,除了部分用来存放SSD本身的固件外,还有一大部分用来备用,当某个Page颗粒坏掉以后,将其标记为不可用以后,用备用的区域来替代。

2 写数据均衡操作:你重复的写4KB数据到一块TLC颗粒的固态硬盘中1000次,盘会坏掉吗?答案当然是否定的,控制器会自动分配操作FLASH单元的物理地址,会尽量避免长时间对同一个BLOCK进行重复读写,以免影响寿命。

还有很多其他的保护操作,欢迎大家留言一起交流、讨论

相关问答

求一些军事用语英文缩写,像ETA,IED,ASAP,LZ之类的_作业帮

[回答]美军常用术语简写:A:Attacker=攻击机AA:Anti-Air=防空AAA:Anti-AirArtillery=高射炮AAAV:AdvancedAmphibiousAss...

怎样学习好jq?

大致分类一下,便于学习,第一,学会jq的引入第二,看各种效果方法如显示隐藏动画等第三,各种事件方法单击双击键盘事件等第四,各种HTML和css方法改...大...

M的地方时为()A.17: OOB .18:00C.20:OOD.21:00_作业帮

[最佳回答]由图中信息可以判断,地球自转的方向为自西向东(北极上空俯视为逆时针),晨线与昏线分别交L于M、N,由此可以得到MN为昼弧,昼弧长度为120°,昼长为8小...

耳炎这个字怎么读_作业帮

[回答]郯tán部首笔画部首:阝部外笔画:8总笔画:10五笔86:OOBH五笔98:OOBH仓颉:FFNL笔顺编号:4334433452四角号码:97827Unicode:CJK统一汉字U+...

上面一个火,下面一个火,右面耳刀念什么】.是什麽字/_作业帮

[回答]郯tánTán-英文翻译郯的中文解释以下结果由汉典提供词典解释郯tán部首笔画部首:阝部外笔画:8总笔画:10五笔86:OOBH五笔98:OOBH仓颉:FFNL...

郯这个字读什么?

郯读音:tán郯(坦tán)是由炎和邑“阝(在右)”会意而成的字。炎为光照之意,由于所处位置,靠近东海,是日出光焰之地。邑“阝”表述郡城。借“坦”声表示...郯...

A、B为n阶方阵,证明:r(A)+r(B)=rA00B._作业帮

[回答]证明:由题意,设r(A)=r1,r(B)=r2根据矩阵秩的定义,得A中有一个r1阶的子式不为零,设为det(A*);B中有一个r2阶子式不为零,设为det(B*),从而,在矩阵AOOB...

strcpy用法?

strcpy是C语言中的一个字符串函数,用于将源字符串中的内容复制到目标字符串中。它的基本语法如下:char*strcpy(char*dest,constchar*src);其中,de...

华为al 00b是什么型号手机多少钱?

al00b是华为畅享9plus高配版。售价在1500元左右。华为畅享9Plus机身采用双玻璃材质,在玻璃机身基础上,采用3D板材收弧设计。拥有6.5英寸1080P刘海全面屏,屏...

拆电脑快递需要注意什么?

电脑开封注意事项如下1.开箱如果能在快递员面前开最好,快递员一般比较忙,可能不会理你,不过没关系,你可以回去之后自己拍个视频。为什么要拍个视频,电脑的mon...

 魔古山宝库  易触 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2024  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部