3
27
2014
1

中国专利书写心得

最近这段时间写了两篇国内的专利,在专利格式、模板上哇自己也花了心思琢磨了一下,下面是我的一点心得,分享给大家。

以下部分的[]表示该内容可要可不要。()()表示表述该段话的不同形式

首先呢,你打开一片已经申请好的专利,会发现它由一下几个部分组成,

1.说明书摘要

2.摘要附图

3.权利要求书

4.技术领域

5.背景技术

6.发明内容

7.附图说明

8.具体实施方式

9.附图

这九个部分,其中部分3:权利要求书  是不需要我们写的,也就是你写好其余内容,专利中心处理专利的工作人员会根据你提交的内容帮你写好该篇专利需要保护的点。

下面一个一个部分的说书写时的模板要求

1,摘要。

    本发明涉及。。。领域,公开了一种。。。的方法、装置。然后用简洁的语言具体描述该专利的核心思想。[说明该专利的优点]

2.摘要附图

    用一张最能概括本专利核心的图

3.权利要求书

    如上,这一部分可以不写

4.技术领域

    (本发明涉及。。。领域)(本实用例属于。。。领域),[具体涉及。。。]

5.背景技术

     从以下三个步骤递进写这一部分:5.1介绍该专利涉及的背景。5.2如今现有的技术、实现方式。5.3如今现有技术、实现方式的不足、缺点,从而导出本专利

6.发明内容

     [第一段可以有  本发明的目的是。。。本发明优点]

      本发明的技术方案是:。。。ps该部分的内容需要层层递进,即可先总写。然后再起一段,对上一段进行展开说明,再起一段的格式如下:(上述)(所述)。。。具体指。。。例子:本发明的技术法案是一种。。。的装置,该装置包括。。、。。和。。,分别粗略介绍包括的内容。该段完毕!然后另起几段写所述。。。进行详细介绍

 

      [若专利分为技术和方法两部分,则有如下内容   本专利提供一种。。。的方法,具体步骤包括如下:。。。]

       本发明的优先是:1、2、3、4.。。ps该部分与现有的技术比较,尽量多例如优点

7.附图说明

       附图说明为对最后部分附图中的每一张图的描述,因为最后一部分的附图中每一张图都只表明了图1、图2、等,而没标明图的名字。

8.具体实施方式

       其实这部分的内容就是结合附图说明把第6部分:发明内容的东西重新叙述一遍。特备要注意一下几点:

      8.1该部分内容的叙述顺序应该严格与第6部分内容的叙述顺序对应。比如说先说读、再说写、最后说擦除。

      8.2该部分要结合附图,若附图中有流程图,则要在流程图中标明步骤标记,在具体实施方式部分中进行流程说明时要引用附图中流程图的标记。若类似于工业设计,则要在工业设计图中标注零件的,则要在具体实施方式部分中提及零件、部件名字时要引用图中的标记。

      8.3该部分最后要说明类似如下文字:“对于充分说明的本发明来说,还可具有多种变化及改型的实施方案,并不局限于上述实施方式的具体实施例。上述实施例仅仅作为本发明的说明,而不是对本发明的限制。总之,本发明的保护范围应包括哪些对本领域普通技术人员来说显而易见的边或或替代以及改型。”也就是扩大保护范围。

 

说到这里就分享完啦~~~希望对大家有帮助

Category: 未分类 | Tags:
3
13
2014
2

FIO测试总结

1.安装

方法一:直接用指令sudo apt-get install fio

方法二:如果方法一不可行则,在官网http://freshmeat.net/projects/fio/下载fio的安装包。安装方法很简单。解压缩后,进入目录输入./configure  make  make install。不同压缩格式的解压书指令不同,具体请参考如下eoiioe博客:

http://www.cnblogs.com/eoiioe/archive/2008/09/20/1294681.html

2.测试注意点

可以先把设备mount到文件加上,如

mkdir /mnt/sdb1-mount

mount /dev/sdb1 /mnt/sdb1-mount。

mount上之后可以进行如下测试(ps:你如果想看mount成功了没,直接mount后回车,可以看到mount的东西):

注意 fio测试指令需要在root权限下才能操作

fio -filename=/mnt/sdb1-mount/text -direct=1 -rw=read -bs=1m -size=5G -numjobs=4 -runtime=10 -group_reporting -name=test_read

第一个text是运行完后在/mnt/sdb1-mount目录下会生成一个5G的text文件。

第二个text_read是测试运行结果在屏幕上显示的都是以test_read:。。。

3.关于参数:

 -filename 后可以直接加设备名 如-filename /dev/sdb1 ;也可以加设备的挂载点的文件名,如上述例子。

  size 读写的总大小

  bs  blocksize 每次读写的大小

 -direct=1 测试绕过机器自带的buffer,测试结果更真实

 -rw的5中情况  1.-rw=read 2.-rw=randread 3.-rw=write 4.-rw=randwrite 5.-rw=randrw -rwmixread=70 //混合模式下读占百分之70

 numjobs=4 本次测试的线程数为4

 ioengine=sync io引擎的方式为同步。通常有同步和异步两种方式。同步的io一次只能发出一个io请求,等待内核完成才返回,这样对单线程来说iodepth总是小于1的,但多个线程并发可以使iodepth变大。异步方式就是一次提交一批请求,等待一批的完成,减少交互的次数

 -group_reporting 关于现实结果,汇总每个进程的信息

 

 

4注意:.若将设备挂载在虚拟硬盘上,即ram*,那么注意,-size的值不能过大,因为分配的ram大小是固定的,若-size的大小超过了系统分配你ram的大小,则会出现error。error信息如下:

这时相当于ram被弄崩了~此时,你需要1.umount;2.重新格式化ram*;3.重新挂载

5.关于测试脚本

[global]
direct=1	#use raw io instead of buffered io
numjobs=1	#number of clones of processes/threads for each job
ioengine=sync	#libaio is asynchronized io mode, sync is synchronized mode
iodepth=1	#if use libaio, iodepth means the ios can be submitted at the same time. It is important! (Can be thought as number of thread/process in sync io mode)
iodepth_batch_complete=0 #how often to check request completion for libaio.
#iodepth_low=4	#if io queue is full, wait completion until depth reach this. 
runtime=200	#in seconds for each job
thread		#use thread instead of process
filename=/home/test.bin        #the device/file name
size=10M
rw=randwrite

[BS:1K]
bs=1k

[BS:2K]
stonewall  #wait until the previous job is finished
bs=2k

[BS:4K]
stonewall  #wait until the previous job is finished
bs=4k

[BS:8K]
stonewall  #wait until the previous job is finished
bs=8k

[BS:16K]
stonewall  #wait until the previous job is finished
bs=16k

[BS:32K]
stonewall  #wait until the previous job is finished
bs=32k

[BS:64K]
stonewall  #wait until the previous job is finished
bs=64k

[BS:128K]
stonewall  #wait until the previous job is finished
bs=128k

[BS:256K]
stonewall  #wait until the previous job is finished
bs=256k

[BS:512K]
stonewall  #wait until the previous job is finished
bs=512k

其中globle为全局共享参数;[BS:1K]为运行打印出代码的名字

假设该文件保存名字为runfiotest.ini,则运行指令为

fio runfiotest.ini

6测试结果

下面给出一段测试结果

BS:1K: (groupid=0, jobs=1): err= 0: pid=2467: Wed May 21 15:52:27 2014
  read : io=10240KB, bw=13456KB/s, iops=13455, runt=   761msec
    clat (usec): min=0, max=2018, avg=66.88, stdev=28.71
     lat (usec): min=0, max=2018, avg=67.90, stdev=29.56
    clat percentiles (usec):
     |  1.00th=[    0],  5.00th=[   62], 10.00th=[   62], 20.00th=[   63],
     | 30.00th=[   63], 40.00th=[   66], 50.00th=[   66], 60.00th=[   67],
     | 70.00th=[   67], 80.00th=[   67], 90.00th=[   70], 95.00th=[   87],
     | 99.00th=[  131], 99.50th=[  143], 99.90th=[  278], 99.95th=[  314],
     | 99.99th=[  756]
    bw (KB  /s): min=13290, max=13290, per=98.77%, avg=13290.00, stdev= 0.00
    lat (usec) : 2=3.03%, 4=0.01%, 10=0.02%, 20=0.08%, 50=0.21%
    lat (usec) : 100=93.09%, 250=3.43%, 500=0.11%, 750=0.01%, 1000=0.01%
    lat (msec) : 4=0.01%
  cpu          : usr=18.95%, sys=80.53%, ctx=32, majf=0, minf=11
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=50.0%, 4=50.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued    : total=r=10240/w=0/d=0, short=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=1

blocksize,iops,bw的关系。块大小(bw)*每秒io次数(iops)= 带宽(bw)

 

注意read : io=10240KB, bw=13456KB/s, iops=13455, runt= 761msec这一行:

当配置文件设置的runtime小于761ms时,则read的io量达不到10240K,所以说一个测试正常结束有两个原因:1.io达到了配置文件的需要io操作的大小,即size值。2.运行达到了设置的时间。

故若你想保证运行时间足够长,可以不设置runtime的值。

其中

 read : io=10240KB, bw=13456KB/s, iops=13455, runt=   761msec

io表示本次请求的大小io=10240KB 可以看出我们上面设的size=10M相对应。当然也存在runtime时间用完了,而fio未运行完毕,这是io小于size值,而runt 等于设定的runtime

总体介绍如下

io=执行了多少Mio

bw=bandwith表示带宽。

iops表示每秒的io数量

slat 提交延时

clat 表示complete lantency 完成延时

lat 表示 响应延时

cpu 利用率

IO depth io队列

IO submit 单个IO提交的IO数

IO complet 单个IO完成的IO数??

IO issued 读、写下发的请求书。and how many of them were short

IO lantencies=IO完成的延时分布

 

IO=总共执行了多少size的IO

aggrb=group总带宽

minb=最小平均带宽

maxb=最大平均带宽

mint=group中线程最短运行时间

maxt=group中线程最长运行时间

 

ios=所有group总共执行的IO数

merge=总共噶生的IO合并数

ticks=Number of ticks we kept the disk busy

in_queue=在队列中花的时间

util=磁盘利用率

以上参数参考

http://blog.csdn.net/yuesichiu/article/details/8722417

若用ram模拟硬盘测试,会发现以上五项的值都为0。而在/home目录下做fio测试就不会为0了

 

 

6.关于格式化ram后的ext4测试 & 基于/home目录下(ext4文件系统)的fio测试。

虽然都是ext4文件系统,但是ram的内存模拟硬盘,而/home是直接在硬盘下跑,故ram的测试结果中bw iops 要比/home下大很多,运行时间小很多。

 

Category: 未分类 | Tags:
3
12
2014
23

blktrace 使用

1.安装

sudo apt-get install blktrace

若显示已经挂在则不必再挂载。否则执行如下指令进行挂载:

sudo mount -t debugfs debugfs /sys/kernel/debug

2.测试参数

安装好以后就是测试了。测试语法如下:

blktrace -d dev [-r debugfs_path] [-o output] [-k] [-w time] [-a action] [-A action_mask] ..

blktrace选项如下:

-r trace文件默认挂载地址为/sys/kernel/debug。-r参数能重新指定挂载地址

-a mask 缺省的为所有的事件都要trace,加入-a参数可以添加过滤器,即只观察想观察的事件

-b size 指定收集trace缓存的大小,收集debugfs files的大小,并非文件系统读写时的缓存

-n num 指定收集trace的缓存个数,同上-b 。

-o output 指定输出文件名字,假设你的名字为name 输出文件为name.blktrce.cpu。若你有两个cpu,则生成两个文件。-o的缺省名字为设备名。见下:

-w time 指令运行秒数。-w 5 运行5秒

-k kill 杀掉正在运行的进程,-k后不需要加参数

其中-a 滤镜后跟的参数如下

以下是别人的解释:
 
-A hex-mask			#设置过滤信息mask成十六进制mask
 -a mask			#添加mask到当前的过滤器
 -b size			#指定缓存大小for提取的结果,默认为512KB
 -d dev			#添加一个设备追踪
 -I file			#Adds the devices found in file as devices to trace
 -k			#杀掉正在运行的追踪
 -n num-sub			#指定缓冲池大小,默认为4个子缓冲区 
 -o file			#指定输出文件的名字
 -r rel-path			#指定的debugfs挂载点
 -V			#版本号 
 -w seconds			#设置运行的时间
 
3.测试实例
 
Usage: blktrace 2.0.0 -d <dev> [ -r debugfs path ] [ -o <output> ] [-k ] [ -w time ]
[ -a action ] [ -A action mask ] [ -I  <devs file> ] [ -v ]
 
实例1:

由上面这个例子,得出:

1.结束测试ctrl+c

2.生成blktrace文件的缺省名字是由"设备名字+blktrace+cpu号"组成

 

实例2:

blktrace -d /dev/sda -k

故若要kill掉sda的blktrace则命令为

 

实例3:

 blktrace -d /dev/sdb -w 10 -o blkt1

运行完毕后有两个输出文件分别是blkt1.blktrace.0和blkt1.blktrace.1。之所以有两个输出文件,这与运行系统cpu个数有关。这两个输出文件时二进制的,不能直接打开,需要如下指令转化为可读取文件

blkparse -i blkt1.blktrace.0 -o blkt1.txt 

该指令含义就是解析blkt1.blktrace.0,生成可读取blkt1.txt文件

若将两条指令合并,则为如下形式、

blktrace -d /dev/sda -o - |blkparse -i - -o blkparse.out

 

 

实例4:

blktrace -d /dev/sda -o - |blkparse -i - 

 

若检测结果希望直接显示在终端屏幕上,即以live形式检测。用上述指令

 

 

4 测试结果

通过blkparse解析文件如下:各个列的含义在第1,2,3行给出

倒数第三列为action,该列不同字母的具体含义如下:

C – complete A previously issued request has been completed. The output will detail the sector and size of that request, as well as the success or failure of it.
D – issued A request that previously resided on the block layer queue or in the io scheduler has been sent to the driver.
I – inserted A request is being sent to the io scheduler for addition to the internal queue and later service by the driver. The request is fully formed at this time.
Q – queued This notes intent to queue io at the given location. No real requests exists yet.
B – bounced The data pages attached to this bio are not reachable by the hardware and must be bounced to a lower memory location. This causes a big slowdown in io performance, since the data must be copied to/from kernel buffers. Usually this can be fixed with using better hardware -either a better io controller, or a platform with an IOMMU.
m – message Text message generated via kernel call to blk add trace msg.
M – back merge A previously inserted request exists that ends on the boundary of where this io begins, so the io scheduler can merge them together.
F – front merge Same as the back merge, except this io ends where a previously inserted requests starts.
G – get request To send any type of request to a block device, a struct request container must be allocated first.
S – sleep No available request structures were available, so the issuer has to wait for one to be freed.
P – plug When io is queued to a previously empty block device queue, Linux will plug the queue in anticipation of future ios being added before this data is needed.
U – unplug Some request data already queued in the device, start sending requests to the driver. This may happen automatically if a timeout period has passed (see next entry) or if a number of requests have been added to the queue.
T – unplug due to timer If nobody requests the io that was queued after plugging the queue, Linux will automatically unplug it after a defined period has passed.
X – split On raid or device mapper setups, an incoming io may straddle a device or internal zone and needs to be chopped up into smaller pieces for service. This may indicate a performance problem due to a bad setup of that raid/dm device, but may also just be part of normal boundary conditions. dm is notably bad at this and will clone lots of io.
A – remap For stacked devices, incoming io is remapped to device below it in the io stack. The remap action details what exactly is being remapped to what.
 
倒数第二列含义如下:
This is a small string containing at least one character (’R’ for read, ’W’ for write, or ’D’ for block discard operation), and optionally either a ’B’ (for barrier operations) or ’S’ (for synchronous operations).
即倒数第二列可以判断读、写or删除
另外B barrier operations
    S 同步操作

 

 

 
 
 
5.blktrace附录:
1.对应官方文档3.1.2 节
blktrace区分两种形式的块层的请求。file system和scsi commands。前者是文件系统的请求,后者使pc请求。file system的请求为读写请求,比如说在一个指定磁盘的指定位置读取一定大小的内容。这些请求一般由用户程序产生,但有时也会由vm把脏数据写到磁盘或者文件系统同步超级快或者日志块到disk而产生。pc请求为SCSI命令。blktrace 将命令数据块作为负载,这样blkparse可以解析它。
 
2.对应官方文档4.1节

 

blkparse还有其他参数可供选择,如下,我对此没做深入研究,故没给出解释:

以上参数部分解释:

-b 一次性处理的大小,即解析成结果时一次性解析的大小,缺省值为512

 

3.今天运行时碰到了一下问题

问题的原因是,我运行的目录错了。我在虚拟机上通过v-box,挂在了一个与windows共享的文件夹,即 mount -t vboxsf V-box /home/share 。在home/share路径下运行时,blktrace会出错。

Category: blktrace | Tags:
3
10
2014
2

Flashcache 元数据更新的优化(A New Metadata Update Method for Fast Recovery of SSD Cache)

本文章为A New Metadata Update Method for Fast Recovery of SSD Cache的解读

1.SSD做缓存时元数据更新传统方法

在对SSD进行元数据更新操作时,最为保险的做法是“标记-写入-更新”

“标记”的作用是标记SSD正在写入的位置,标记作用是为了防止意外断电等特殊情况。比如在发生意外断电时再开机后,SSD中元数据被标记的部分就表示该部分的数据是更新操作未完成的操作。故这部分数据无效。

“写入”操作就是进行数据写入操作。

“更新”操作时写完后进行元数据的更新,比如将clean置位dirty。

“标记-写入-更新”三部曲虽然保险,即在断电时可以判断到底哪些数据时无效数据,但是其存在一个致命的缺点,那就是写操作要进行三次写SSD。影响了写的性能

2.Flashcache中元数据更新方法

在flashcache的实现中,将传统保险的“标记-写入-更新”这三步操作简化为“写入-更新”两部。省略第一步可以加快写操作。但是带来了一个很严重的问题。即意外断电时,存在部分写入的数据未更新,则有一些标记为clean的数据可能是还未来得及进行ditry置位操作。则SSD元数据记录中的为标记为clean的元数据对应的块全都不能使用。则cache中有效的块只有dirty状态的块。这就导致cache中大量数据的浪费,降低了性能。

3.论文思想

那么怎么解决这个问题呢?

本论文就提出一种基于“标记-写入-更新”的改进方法,核心思想主要是将第三部更新操作不单独进行,也就是并非写入完成后就立马更新元数据,而是在对该页的其他块做“标记”时,顺便进行整个块的更新。

3.1piggybacking ACK

我们知道SSD的写入单元是页,每页有多个元数据项,假设某页第一个元数据项对应的数据要进行写操作,那么我首先要标记该元数据,表明我准备进行写操作,那么在标记这个元数据时要写整个页,所以,我可以把内存中显示“更新”完成的元数据页同步到SSD中。那么相当于“更新”和“标记”合并在一起完成,不必进行三次写入操作。由于SSD上的元数据的“更新”操作不是及时的,故论文里把这个方法叫做Lazy-Update Following an Update-Write。

为了实现上述思想,每个元数据项有个标记为,该位表示SSD数据正在被更新。下面以一个实际操作为例,说明该流程。现要对一个page进行写操作。

step1:进行RAM和SSD上元数据置1操作,表明元数据对应数据进行写操作,即图中1,2

step2:进行SSD数据的写操作,即图中3

step3:对RAM的元数据进行及时更新,即图中4,由1置位0,表明当前是有用数据

最后图中箭头的piggybacking是指更新SSD中的元数据,即由当SSD元数据所在的page要进行别的块的step1操作时,顺带更新。


3.1总结:

思想基于“标记-写-更新”这一元数据处理的策略,将同一page不同元数据的“更新”和“标记”在写元数据页时同时完成。通过这种方式将“标记-写-更新”的三次写SSD操作下降至两次。但与此同时,有了“正在更新”的标记,使得系统意外断电后重启时,SSD中clean标记位的数据就成了可用数据,在这点上与flashcache实现相比,很大程度上提高了意外断电时缓存数据的可用率

3.2滑动窗口思想

在SSD中最后一步的“更新”操作虽然是延后的,但是由于写操作具有局部性,所以说,元数据页被写的频率是很高的,也就是说基本能及时将“更新”标记从内存中同步。但是也要考虑极端情况,该情况如下:

假设SSD中每个元数据页存放了320个元数据项,在意外断电发生时,每个元数据页中都有1个元数据项没有及时地跟内存中的元数据同步,也就是还未进行最后一步的元数据“更新”操作,那么这些元数据对应的数据就为无效数据,若缓存SSD的总容量为320G,则重新启动时SSD缓存中就有1G的内容是无效的。为了进一步减少无效数据的大小,论文提出了另一种机制:滑动窗口

这个滑动窗口里记录了整个SSD中写操作的最后一步“更新”还未来得及与内存同步的元数据项,当窗口中元数据项的个数达到了窗口大小设定的阈值时,就回进行强制写回操作。

之所以叫做滑动窗口,是因为采取了类似于TCP的滑动窗口方法,这个窗口只有当最先一个元数据被确定做完了“更新”操作后,才会滑动。另外这个窗口在每次进行SSD元数据页的更新时都会写入到SSD,滑动窗口是带有时间戳标志的。


3.2总结

滑动窗口从全局上对SSD上未做更新的元数据进行了把控,在3.1的基础上进一步增大了意外断电重启的缓存中可用数据的量。

但关于这一部分我还没有很看懂,关于为什么要滑动窗口,为什么滑动窗口还要有时间戳都没有理解。欢迎大家进行讨论

该论文网址:

http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=06665346

 

Category: 书、论文阅读 | Tags:
2
28
2014
1

linux 常用指令总结

1.看ubuntu版本   cat /etc/issue

  查看cpu信息 cat /proc/cpuinfo

2.查看内核版本  uname -r

3.机器的位数 uname -a (a表示all,即所有信息,其中64为系统一般是X86-64,32位系统是i386,i686)

4.apt-get -f install (当软件安装不符合依赖关系时,通过-f 来修复依赖关系)

5.查找文件指令: find

  例子 find / -name *.py   全盘搜索以.py结尾的文件。因为/为根目录,且没规定深度。

       find -maxdepth 1 -name *.py 在本级目录下搜索*.py的文件

       find /usr -maxdepth 1 -name *.py 在/usr目录下搜索*.py的文件

       应用:想查看某个配置文件,但忘记目录位置,则可以在/底下:

       find / -name resolveconf

6.查看文件行数 wc -l /home/test.cvs 

7.远程拷贝,即从自己的系统拷贝东西到别的系统中 例子: scp /home/space/music/1.mp3 root@www.cumt.edu.cn:/home/root/others/music  

scp /home/space/music/1.mp3 root@192.144.2.21:/home/root/others/music      root@表示192.144.2.21的root身份 

8.关于看文件的行数、或一个目录下有多少个文件: wc -l /home/text.txt  看文件行数 ls | wc -l 看目录下文件个数。  上一行中|为管道,即前面的输出作为下一行的输入。类似你可以使用: ll | wc -|   你会发现该指令显示的文件个数比ls | wc -l 多三个,多出来的东西为 total ./ 和../

9 看某一个文件的头几行,或末尾几行  head -n /home/text.txt  tail -n /home/text.txt

10 将某个文件的1至100000行拷贝到另一个文件中awk 'NR>1&&NR<100000 {print } ' ./source.csv > ./result.csv

11 把一个disk挂载到某个路径下。

    mkfs.ext3 /dev/sdb

    mkdir ./data

     mount /dev/sdb ./data

这里注意的是:格式化文件系统是对分区的概念而言的。若你想把sdb1格式化为ext3文件系统,你应该先fdisk /dev/sdb 来对sdb进行分区,然后对分好的区sdb1进行格式化。而不是先mkfs.ext2 /dev/sdb ,再对sdb进行分区

12 grep -n 'main' ./ceshi.c 则会返回main所在的行号和这一行的内容:

    例返回 11:void main(void){

13 cut指令  -d 定界符 -f 输出的内容。另外使用管道grep -n 'main' ./ceshi.c | cut -d : -f 1

    则上述输出11。 若-f 2,则输出void main(void){

14sed指令  sed -n '2,10p' ./text.c   输出2到10行,同样可以用>重定位到文件,即sed -n '2,10p' ./text.c > ./cope.c 。这个实现的功能和第10点相同。注意  >  这个符号是用来重新定位输出到文件中,避免输出到屏幕上。 sed '1,10d' ./text.c > ./cope1.c 这个实现的是1至10行delete掉后将剩下的行数输出到cope1.c中。请注意 前一条指令有 -n ,而后一条指令没有参数 -n

14.lsmod 查看当然有哪些模块。rmmod 删除模块。在rmmod之前需要确定该模块没被使用。如

mkfs.pcmfs /dev/sdb1

insmod pcmfs.ko /*若lsmod时没有对应的模块,在此为pcmfs。则用该语句插入模块*/

mount /dev/sdb1 /mnt 

则pcmfs模块在被使用。直接使用rmmod会提示错误。需要

umount /dev/sdb1

rmmod pcmfs

15.hexdump指令。以16进制方式产看内容。关键参数

-s 设定开始查看的起始位置 如:-s 4k ; -s 4096 ;-s 0xb000

-C 方便查看

如:

以上echo ...| hexdump 查看...的二进制表示 

-C 以三列方式看文件的二进制表示,第一列为地址,16进制表示

-s 看实际设备的某个起始地址后的数据

 

16 卸载apt-get install的软件

   apt-get remove **

   apt-get remove --purge **

   apt-get autoremove **

 

17 将缓存内容写回磁盘 sync,在sync后,再使用查看脏数据所占内存大小指令为:grep Dirty /proc/meminfo

会发现输出sync后,再查看内存脏数据,大小为0kb

18.window和linux文件之间传递会存在tab键等不兼容的问题

方法1:

apt-get install dos2unix

dos2unix filename

方法2:

运行脚本时出现以下错误很可能也是unix  dos格式的错误

bash: ./filename: /bin/bash^M: bad interpreter: No such file or directory

解决如下

vi filename

然后通过指令 :set ff? 可以看到dos或者unix的字样,若是dos格式的,那么可以用set ff=unix把文件强制转化成unix格式

 

19.ls -i dir/  可以看该dir目录下文件的inode号,ls中的-i显示inode号

20.ls -s dir/ 可以显示dir目录下文件所占的块数目,默认的块是1k来计数,但是可以通过--block-size来指定block大小,我们查看时,block大小一般指定与格式化时的文件系统大小相同。附:查看格式化时block大小:dumpe2fs | grep 'Block size'

21.dd指令指定拷贝的大小

dd if=/dev/hda of=/dev/hdb count=1 bs=512

count=1指定仅拷贝一个块,bs=512指定块大小为512字节

另外,可以指定源文件为zero

dd  if=/dev/zero of=/dev/hdb count=1 bs=512

dd指令创建一个100M的空文件

dd  if=/dev/zero of=hello.txt bs=100M count=1

dd  if=/dev/zero of=hello.txt bs=100M count=1 iflag=direct #iflag为指定读的方式,即input

dd  if=/dev/zero of=hello.txt bs=100M count=1 oflag=direct #oflag为指定写的方式,即output

 

22.通过dmesg来查看内核中printk的信息,该信息在/var/log中

dmesg -c  查看后清除log中信息

dmesg | tail 查看最近一次的输出

 

23.查看文件的大小

du -h 1.txt 查看1.txt的大小

 

 

Category: Linux | Tags:
1
18
2014
2

python脚本

下面通过一个例子说明python脚本

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys

if len (sys.argv)!=5: 
	print"usage:./run.py *** *** *** ***,such as ./PCMSim system.ini.example ini/pcmsim-device.ini traces/k6_1.trc 1000 ..../"
	exit()
a=sys.argv[1]
b=sys.argv[2]
c=sys.argv[3]
d=sys.argv[4]

os.system("./PCMSim -s "+a+" -d "+b+" -t "+c+" -c "+d)

这个列子的脚本语言是将如下指令.

./PCMSim -s system.ini.example -d ini/pcmsim-device.ini -t traces/k6_1.trc -c 1000

简化成了./runpy system.ini.example ini/pcmsim-device.ini traces/k6_1.trc 1000(以上代码保存的文件名字为runpy)

a b c d 就是对应的第上一行的第1,2,3,4个参数,这个例子简化工作不明显。PCMSim后面跟的四个参数分为是系统配置、设备配置,trace,运行时钟周期。如果你在运行时,前三个参数是固定的,只需要测试不同的时钟周期的效果,则可以写成如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys

if len (sys.argv)!=2: 
	print"usage:./run.py ***,such as ./run.py 1000"
	exit()
a=sys.argv[1]

os.system("./PCMSim -s system.ini.example -d ini/pcmsim-device.ini -t traces/k6_1.trc -c "+a)

这样运行时直接./run.py 100就ok了.当然提醒一点在写完脚本后要记得做修改权限的操作即chmod 755 **。把文件改成可运行

 

下面看例二,在例二中,这个python的脚本就代替了八条命令的输入,你运行这个就直接输入./cpufreq.py 2395000就可以了,而不必坐在电脑前等上一条跑完在输入下一下。也就是说这一个脚本代替了八条语句的输入。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys

if len(sys.argv)!=2:
	print "usage:./cpufreq.py xxx,such as ./cpufreq.py 2395000 "
	exit()
a=sys.argv[1]

for x in ['0','1','2','3']:
	os.system('xenpm set-scaling-maxfreq'+' '+x+' '+a)
	os.system('xenpm set-scaling-minfreq'+' '+x+' '+a)
Category: 脚本语言 | Tags:
1
17
2014
1

关于脚本

run一个工程时,往往要输入多个参数文件,我以前都是自己傻傻的一个个输入,不过现在要提高自己的level,要学会用脚本。下面用一个脚本为例:

# Script writer: Youngjae Kim (youkim@cse.,psu.edu)

#!/bin/sh

echo "Running Pagemap FTL..."
../src/disksim pagemap.parv pagemap.outv ascii ./trace/test.file 0 
grep "IOdriver Response time average:" pagemap.outv
grep "IOdriver Response time std.dev." pagemap.outv

echo "Running DFTL..."
../src/disksim dftl.parv dftl.outv ascii ./trace/test.file 0
grep "IOdriver Response time average:" dftl.outv
grep "IOdriver Response time std.dev." dftl.outv

echo "Running FAST..."
../src/disksim fast.parv fast.outv ascii ./trace/test.file 0
grep "IOdriver Response time average:" fast.outv
grep "IOdriver Response time std.dev." fast.outv

第一行#表示注释,#!/bin/sh中#!用来告诉系统它后面的参数是用来执行该文件的程序,这个意思我也不是很懂。反正脚本开头要加上这个。

脚本文件里面的用于直接使用linux下的shell用语(即指令用语)

echo 是在屏幕上输出的意思,如下:

grep 是在对应文件中找文字,如

grep "IOdriver Response time average:" fast.outv  就是在fast.outv找IOdriver Response time average

下面贴上我自己写的一个脚本:这个脚本的最下面一行就是你运行该程序时在shell里面要输入的东西。有两点要注意:

1 在windows里面编辑再移进去往往会出现回车等符号的编码方式不一致而出现错误,最好在linux里建立文件,直接在linux中编辑

2.在写好脚本后要chmod 755 run  即改变脚本的权限,使其变为可执行

 

#!/bin/sh

path="/home/test"

cd $path

for i in 1 2 3 4

do

     filename=$i"LALA.trace.csv"

     /home/test/run $filename >> /home/test/result/result.csv

done

注释>>为输出重定向,若原来有此文件,则附加写


#!/bin/sh
path="/home/sourcetrace/trace/DisplayAdsDataServer/Traces0"
cd $path
for i in 1 2 3 4 
do
filename=$i"-testtrace.csv" #对i取值要加上$
echo $filename #打印filename到屏幕上
  sourcepath="/home/trace/"$filename  #存放trace的路径,加上trace名字
  echo $sourcepath
  num=`grep -n 'EndHeader' $sourcepath | cut -d : -f 1` #对num赋值,grep 返回“行数:内容”,利用管道作为cut的输入。
  echo $num
 sed "1,${num}d" /home/Traces/$filename > /home/Traces0/$filename #去掉原trace的首num行,将去掉后的结果输出到/home/Trace0下面
  /home/run $filename $i #取一个东西都要用到 $ 符号

done
 
 另外脚本中的>>作用是追加写,而 > 是清除写。若没有文件,都会创建文件。故在脚本中你想把输出到控制台屏幕上的数据导到文件中,可以使用 >> filename。这个result只是记录显示在屏幕上的printf,若代码中有fopen("/home/outcome","w+");不会影响,outcome照样输出。
例如:
 
#!/bin/sh
for i in 1 2 3
do
	/home/run $i >> result 	
done

 

下面给出接受终端参数输入的shell脚本

该脚本命名run.sh

#!/bin/sh
blktrace -w $1 -d /dev/sda1 -o -| blkparse -i - -o $2

$1为终端第一个参数,$2为终端第二个参数

运行时

./run.sh 5 output.txt

表示运行时间为5s,对应$1;输出文件名字为output.txt,对应$2

 

awk解析脚本,由于awk语句中本身符号"$"就有含义,$1表示读入文件的第一列。这里会与shell脚本语言表示的 $1 为终端输入第一个参数混淆,故书写时要注意:

#!/bin/sh
awk '{if($5=='$1')print}' 1.txt > $2

运行时

./awk.sh 1193 out.txt

表示若1.txt文件的第五列==1193,则把满足条件的行输出到out.txt中。注意有无''

Category: 脚本语言 | Tags:
1
15
2014
1

安装flashsim

安装flashsim网上有一个ppt做得相当详细,网址如下:

http://wenku.baidu.com/view/decc4bf904a1b0717fd5dd22.html

我照着这个做了,其中有几点ppt上要注意。

1.下载安装gcc2.95的五个包后,按照顺序依次装上,其实不一定gcc2.95就装上了,更改软链接后,(sudo ln -fs /usr/bin/gcc-2.95 /usr/bin/gcc).若使用gcc -v 没有看到版本,则其实你的gcc-2.95没装上。原因应该是你机子装的是64位系统,看网上说要在32位上安装。

2. 在安装完flex-old,和bison后查看版本,bison -V 和flex-old -V 。这里的V一定是大写的。

3.按照步骤打完补丁有如下

根据FAILED提示,syssim_driver.c的140补丁没打好。打开补丁文件,看该处的补丁要增加代码还是减少代码。手动完成。然后用手动改掉的文件替换之前的syssim_driver.c文件。

 

附录。关于怎么看补丁文件。下面以代码例子:

eulement dans src.release/: ~
Seulement dans src: ChangeLog
diff -crB src.release/dftl.c src/dftl.c
*** src.release/dftl.c 2009-06-15 07:05:37.000000000 +0200
--- src/dftl.c 2010-03-24 17:11:12.000000000 +0100
***************
*** 66,82 ****
    int i;
    int lpn = lsn/SECT_NUM_PER_PAGE; // logical page number
    int size_page = size/SECT_NUM_PER_PAGE; // size in page 
  
    sect_t s_lsn; // starting logical sector number
    sect_t s_psn; // starting physical sector number 
  
    ASSERT(lpn < opagemap_num);
    ASSERT(lpn + size_page <= opagemap_num);
  
-   sect_t lsns[SECT_NUM_PER_PAGE];
    memset (lsns, 0xFF, sizeof (lsns));
  
!   int sect_num = (size < SECT_NUM_PER_PAGE) ? size : SECT_NUM_PER_PAGE;
  
    if(mapdir_flag == 2){
      s_psn = mapdir[lpn].ppn * SECT_NUM_PER_PAGE;
--- 66,84 ----
    int i;
    int lpn = lsn/SECT_NUM_PER_PAGE; // logical page number
    int size_page = size/SECT_NUM_PER_PAGE; // size in page 
+   int sect_num;
  
    sect_t s_lsn; // starting logical sector number
    sect_t s_psn; // starting physical sector number 
  
+   sect_t lsns[SECT_NUM_PER_PAGE];
    ASSERT(lpn < opagemap_num);
    ASSERT(lpn + size_page <= opagemap_num);
  
    memset (lsns, 0xFF, sizeof (lsns));
  
!   sect_num = (size < SECT_NUM_PER_PAGE) ? size : SECT_NUM_PER_PAGE;
  
    if(mapdir_flag == 2){
      s_psn = mapdir[lpn].ppn * SECT_NUM_PER_PAGE;
 
黄色表示该段补丁是在dftl.c文件上打得
红色的**里面的行数是未达补丁前代码所在的行数,红色的--表示的是打补丁后对应的行数。
绿色+表示增加一行,绿色-表示减少一行
橙色!表示该变量原本没定义,打完补丁后才重新定义的
 
对了,若补丁没打好,会生成一个对应的.rej文件,这里syssim_driver生成的就是syssim_driver.c.rej,这个文件会有提示没有打好补丁的地方
Category: Linux | Tags:
1
6
2014
0

编译内核总结 及 修改开机启动项内核顺序

1.现在内核的压缩文件。把下载到的内核放到u盘里,把u盘插在linux系统上,把u盘mount上去

 mount -t vfat /dev/sdb4 /mnt/udisk 其中vfat是u盘文件系统格式,sdb4是u盘中带有*号的标号。用fdisk -l可以看到,u盘*号标号对应编号。

2.把u盘里的linux内核压缩文件放到linux的某个文件夹下

3.tar -xvzf linux-2.** -C /usr/src  解压缩到/usr/src这个文件夹下(一定要在linux下指令解压缩,window下解压缩后拖进去会出来问题,可能make menuconfig 不能执行)

4.cd /usr/src/linux-2.**

5.make menuconfig(若在这里提示了错误,缺少ncurses的library,则需要输入apt-get install libncurses5-dev)

6.make 也可以make -j 4哦 更快

7.make modules_install

8.make install

9reboot

 

注意如果你在reboot后没有进入不同系统的选项,而是直接进入了未编译的内核。则要修改以下文件

1.在root权限下vim /etc/default/grub

把里面的GRUB_TIMEOUT设置为GRUB_TIMEOUT=20

然后输入 update-grub

再reboot。

若reboot还没有选项,而是直接进入之前的内核,则

2.修改 vim /etc/grub.d/30_os_prober

把里面三个else   set timeout=0的地方 改为=20

然后在 update-grub

在reboot !

如果reboot后,还是没有进入如下界面,可以再reboot时按住shift键,进入到开机该内核选择界面。


按照如上操作还出现该问题:点击进入刚刚编译的内核后,提示root目录无法挂载(忘记截图了),解决方法:

step1:查看/boot目录下,发现没有刚刚编译的内核的启动项,如下,只有我原有内核版本initrd.img-2.6.32-38-generic的启动项。而没有我所需要的2.6.34.14版本的启动项。所以你需要做一个启动项。

step2:进入/lib/modules下与你编译的内核所对应的文件夹。运行update-initramfs -c -k 2.6.34.14 (该步骤我用mkinitramfs -o /boot/initrd.img-2.6.34.14指令后还是不能成功,建议用update-initramfs -c -k指令)。执行完此步骤后,就可以在/boot目录下,发现刚刚编译的内核的启动项了。如下图

step3: 输入update-grub。然后reboot,就ok了

现在应该大功告成啦!!啦啦啦

补充:

我今天又编译了一次内核,经过上面几次的总结,我觉得我已经肯定确定会了。。结果还是遇到了蛋疼的问题。。

编译内核的背景:

我在机房的服务器上编译的,这个服务器的环境本来就已经搭建好了,而且有不止一个内核。这几个内核装在不同的磁盘上,我运行其中一个版本的内核,并在此内核中编译我需要的内核,一切进展都很顺利,但是在最后开机重启时没有看到我需要的内核,但是在ls /boot 下已经有我需要的内核版本的启动项,即对应的initrd.img-...文件。重启开机的画面如下所示

我需要的内核版本是2.6.34.14.这里面没有。

 

解决:

其实这个内核版本已经有了,不过在previous linux version这个选项的子菜单中。隐藏得好深。哎。。。亏我当时想了各种原因,我还以为每个已经有的内核版本都需要重新编译一次2.6.34.14这个内核呢~~~~。。

 

如何把2.6.34.14内核变成系统启动屏幕上默认的启动的内核呢?

vi /boot/grub/grub.cfg

menuentry 'Ubuntu, with Linux 2.6.34.14' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        gfxmode $linux_gfx_mode
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos2)'
        search --no-floppy --fs-uuid --set=root 347d81cc-7111-45ea-b851-e53cc0fa1173
        linux   /boot/vmlinuz-2.6.34.14 root=UUID=347d81cc-7111-45ea-b851-e53cc0fa1173 ro   
        initrd  /boot/initrd.img-2.6.34.14
}
menuentry 'Ubuntu, with Linux 2.6.34.14 (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos2)'
        search --no-floppy --fs-uuid --set=root 347d81cc-7111-45ea-b851-e53cc0fa1173
        echo    'Loading Linux 2.6.34.14 ...'
        linux   /boot/vmlinuz-2.6.34.14 root=UUID=347d81cc-7111-45ea-b851-e53cc0fa1173 ro recovery nomodeset 
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initrd.img-2.6.34.14
}
menuentry 'Ubuntu, with Linux 2.6.34.14.old' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        gfxmode $linux_gfx_mode
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos2)'
        search --no-floppy --fs-uuid --set=root 347d81cc-7111-45ea-b851-e53cc0fa1173
        linux   /boot/vmlinuz-2.6.34.14.old root=UUID=347d81cc-7111-45ea-b851-e53cc0fa1173 ro   
        initrd  /boot/initrd.img-2.6.34.14
}
menuentry 'Ubuntu, with Linux 2.6.34.14.old (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos2)'
        search --no-floppy --fs-uuid --set=root 347d81cc-7111-45ea-b851-e53cc0fa1173
        echo    'Loading Linux 2.6.34.14.old ...'
        linux   /boot/vmlinuz-2.6.34.14.old root=UUID=347d81cc-7111-45ea-b851-e53cc0fa1173 ro recovery nomodeset 
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initrd.img-2.6.34.14
}

 

如上所示,该文件中,有许多顺序出现的menuentry启动项。这里的顺利也就是启动时屏幕出现的启动项的顺序。把你想默认开机的启动项复制粘贴到第一位,即可以达到设定默认开机启动项的顺序。

Category: Linux | Tags:
1
6
2014
2

再生龙使用

今天第一次使用再生龙。

再生龙这款软件可以进行整个硬盘的赋值,也就是说如果你要装很多台机子,那么你可以先把其中一台装好,补丁打好、内核神马的都编译好后,直接使用再生龙。这样就不用每台机子都进行复杂的配置了。以下是使用的step

step1:下载再生龙的镜像。一个iso文件,它就相当于linux ,windows的镜像一样,之后要用软件将这个再生龙镜像做成启动盘。

step2:利用做镜像的软件,将下载的再生龙镜像做到U盘中

step3:在只插母盘的状态下,利用做好的U盘,从U盘启动。目的在于记录母盘的编号。

step4:同时将母盘和要被复制的盘插到电脑上,从U盘启动,根据提示选相关选项。目的有一个步骤是选定一个母盘,则选择的是step3观察到的母盘的编号。选错了很惨的。这样会使得东西拷贝反了。

 

注意:

1母盘和被复制的盘貌似有要求,母盘大小貌似要与被复制的盘相等。

2用U盘做好再生龙镜像后,从U盘启动,若没有对应的再生龙界面,则是引导盘没做好。这可能是你做镜像软件的问题

3保证被复制的盘是一个可以用的好盘。可以按住DEL进入BIOS选项后,在boot的device那里看识别了几个device。。我今天就搞了半天,结果要被复制的盘是个坏盘,咿咿呀呀。。.

Category: 未分类 | Tags:

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com