- 博客(17)
- 资源 (18)
- 收藏
- 关注
原创 linux设备驱动程序之并发和竞态(一)
信号量的头文件在<asm/semaphore.h>,所以要使用信号量就必须包含这个头文件。 声明:struct semaphore sem; 初始化: 1、静态初始化: DECLARE_MUTEX(&sem); //这个信号量初始化为1,可以马上使用; DECLARE_MUTEX_LOCKED(&sem); //这个信号量初始化为0,如果要使用要先解锁,打开信号量
2015-06-28 12:59:33 1098
转载 linux 文件系统之SSD
固态驱动器当前非常流行,但是嵌入式系统很久以前就开始使用固态驱动器进行存储。您可以看到 flash 系统被用于个人数字助理(PDA)、手机、MP3 播放器、数码相机、USB flash 驱动(UFD),甚至笔记本电脑。很多情况下,商业设备的文件系统可以进行定制并且是专有的,但是它们会遇到以下挑战。基于 Flash 的文件系统形式多种多样。本文将探讨几种只读文件系统,并回顾目前可用的各种读/写文
2015-06-17 11:24:58 3353
转载 SSD 之wl(wear leveling)算法分析
转来一篇关于NAND FLASH均衡算法的文章,加上一点思考和笔记,认为这种思考有助于更深刻的理解,更好的记忆,所以也算半原创了吧,最起码笔记是原创的。有意思的是,帖子提起这个算法并不是因为嵌入式开发的需要,而是企业存储。因为提到硬盘驱动器HDD的速度硬伤,目前估计就SSD一种好的存储介质解决方案吧,而SSD除了暂时价格小高以外,主要有一个寿命短的硬伤。这样的话就不可避免的涉及到映射、磨损均衡、存
2015-06-17 11:17:19 6833
原创 linux环境编程之多线程同步
多线程同步,当有多个线程同时访问共享内存时就会产生数据不一致性。所以为了保证数据的一致性必须让线程同步,同步方式有下面几种:互斥量 互斥量从本质上来说是一把锁,在访问共享资源前对互斥量进行加锁,访问完后释放互斥量上的锁。对互斥量加锁后,任何其他的线程对互斥量加锁都会被阻塞,直到互斥量上的锁释放。当锁释放后,阻塞的所有线程都会变成可运行的,然后进行抢占。 互斥
2015-06-16 20:46:05 1075
转载 SSD 之WL磨损平衡
闪存寿命是以P/E次数来计算的,而WL就是确保闪存内每个块被写入的次数相等的一种机制。若没有这个机制,SSD内的闪存颗粒就无法在同一时间内挂掉,那对用户来说就是灾难。 会出现这种情况的原因在于,用户在LBA空间里的数据更新速度是不同的,有部分是经常需要更新,而有些却长期不需要变更,因此若没有WL,很显然那些经常被更新的数据所在的闪存寿命会首先被消耗完毕,而不怎么需要变更的数据所在的
2015-06-16 16:19:51 4759
转载 SSD 之FTL转换层
闪存的读写单位为页,而页的大小一般为4KB或8KB,但我们的操作系统读写数据是按HDD的扇区尺寸进行的(512Byte(字节)),更麻烦的是闪存擦除以块作单位,而且未擦除就无法写入,这导致操作系统现在使用的文件系统根本无法管理SSD,需要更换更先进、复杂的文件去解决这个问题,但这样就会加重操作系统的负担。 而为了不加重操作系统的负担,SSD采用软件的方式把闪存的操作虚拟成磁盘的独立
2015-06-16 16:18:33 3473
转载 SSD 之GC垃圾回收机制
在前面向大家讲解FTL时,我们提到了GC的操作,所谓GC就是把一个闪存块里的‘有效’页数据复制到一个‘空白’块里,然后把这个块完全擦除。GC是SSD里的一个非常关键的操作,其效率对性能有决定性影响。闪存块里‘有效’页的数量对GC效率有决定性的影响,因数量越少,需要复制的页就越少, 花费的时间也越少,效率就高了。(GC操作参考下图)请看下图,把X块和Y块里的“有效”页复制到N块里,然后擦
2015-06-16 16:17:06 6546
转载 SSD 之Trim指令
Trim,其实是一个ATA指令,并无正式中文名称,操作系统发送此指令给SSD主控,以通知它哪些数据占用的地址是‘无效’的。 在讲解Trim的重要性前,先说一点文件系统的相关知识。当我们在操作系统中删除一个文件时,系统并没有真正删掉这个文件的数据,它只是把这些数据占用的地址标记为‘空’,即可以覆盖使用。但这只是在文件系统层面的操作,硬盘本身并不知道那些地址的数据已经‘无效’,除非系统
2015-06-16 16:15:24 6383
转载 SSD 之OP预留空间
SSD上的OP指的是用户不可操作的容量,大小为实际容量减去用户可用容量,OP区域一般被用于优化操作如:WL,GC和坏块映射等。 OP一般分三层(见下图)。第一层容量固定为SSD标称容量的7.37%,这是因为标称容量采用千进制为单位,而NAND颗粒容量单位为1024进制,两者正好相差约7.37%。这部分空间被默认用于作OP。第二层OP是否存在及容量大小取决于厂商设置。第三层OP是用户
2015-06-16 16:12:27 5242
转载 SSD 之WA写入放大
WA是闪存及SSD相关的一个极为重要的属性。由于闪存必须先擦除才能再写入的特性,在执行这些操作时,数据都会被移动超过1次。这些重复的操作不单会增加写入的数据量,还会减少闪存的寿命,更吃光闪存的可用带宽而间接影响随机写入性能。WA这个术语在2008年被Intel公司和SiliconSystems公司(于2009 年被西部数据收购)第一次提出并在公开稿件里使用。 举个最简单的例子:当要
2015-06-16 16:09:41 2590
转载 SSD 之BBM坏块管理机制
不管WL算法如何高明,在使用中都会碰到一个头痛的问题,那就是坏块,所以一个SSD必须要有坏块管理机制。何谓坏块?一个闪存块里包含有不稳定的地址,不能保证读/写/擦时数据的准确性。 坏块分出厂坏块和使用过程中出现的坏块,SSD有坏块表来管理坏块。出厂坏块在上面会有标记,所以很容易就能被识别,而使用中出现的坏块就要靠主控的能力了。一般来说,越到闪存生命的后期(P/E数开始接近理论最
2015-06-16 16:05:05 3237
转载 SSD 之ECC校验和纠错
ECC的全称是 Error Checking and Correction or Error correction Coding,是一种用于差错检测和修正的算法。上一节的BBM中我们提到过,NAND闪存在生产和使用中都会产生坏块,BBM就是坏块的管理机制,而要有效管理坏块的首要前提就是有可靠的坏块检测手段。如果操作时序和电路稳定性不存在问题,NAND闪存出错的时候一般不会造成整个Block或Pag
2015-06-16 16:02:10 8110
转载 SSD 之写入放大带来的难题
NAND闪存的写入(P/E循环)次数有限,SLC的量级是1万-10万次,而MLC普遍只有3000-5000次,TLC则更少,因此围绕SSD可靠性的争议和研究就没停止过,随便搜索SSD的资料见的最多的就是讨论SSD可靠性(reliability)的文章。 当然,也有一种说法称即便只有3000次写入寿命,60GB SSD的写入数据寿命也有3000*60GB=180TB,120GB也有3
2015-06-16 15:58:53 3843
原创 linux环境编程之线程基础知识
/tmp/ccc9R9dJ.o: In function `main':test.c:(.text+0x3c): undefined reference to `pthread_create'collect2: ld returned 1 exit status就很可能是因为编译时没有加-lpthread 选项;
2015-06-14 21:46:12 1102
原创 买哪种牌子的笔记本电脑好呢?
其实这是个被问烂了的问题,我想每个有电脑的人都问过这样的问题,因为谁买电脑的时候都想买个好一点的。我大一买电脑的时候也是这样的,找各种资料对比,我是从农村来的,上大学前我根本不知道电脑和电视有什么区别。为买个好电脑我查各种资料,过了一两个礼拜,我竟然对电脑的各种组件都有了一定的理解。比上课听老师讲这些组件的相关知识强多了。所以如果你想了解一门产品,最好的方法就是去买个,因为在买之前你一定会看各种资料进行对比(土豪除外)。哈哈,有些偏题了。 我现在手上有三台电脑:一台我自己的,是宏基4741
2015-06-14 10:46:08 6815
原创 多线程的生产者和消费者问题
多线程的生产者和消费者问题是比较经典的多线程问题,如果知道编码解决生产者和消费者问题,那么对于多线程应该基本算掌握了。我不知道大家的生产者和消费者问题是怎么样的(应该有几个版本吧),这里我说下我的生产者和消费者问题: 有多个生产线程,他们只负责生产资源;有多个消费者,同样他们只负责消费。但是他们需要满足下面条件: 生产者:只有当资源没有的时候,生产者才开始生产,但是为了防止浪费,每次只能生产指定数量的资源。当生产者生产完足够资源时,就进入睡眠,同时叫醒消费者去消费;
2015-06-12 14:51:55 3237
原创 ubunte中用ibus-setup安装中文输入法
(process:2553): Gtk-WARNING **: Locale not supported by C library. Using the fallback 'C' locale.Traceback (most recent call last): File "/usr/share/ibus/setup/main.py", line 582, in <module> locale.setlocale(locale.LC_ALL, '') File "/usr/lib/
2015-06-09 23:15:43 2556
嵌入式Linux之我行系列
2015-07-20
Oracle VM VirtualBox 桥接模式驱动
2015-03-10
软件开发电子书百宝箱
2014-08-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人