- 如果本文有任何错误之处,或您有任何建议或意见,万望不吝赐教,大家一起进步! :)
刚才忘了写一下需求了,目前的需求有:
1. 使用ssd扩展
2. 使用自定义的输入trace格式(其中一个字段包括IO内容的4k-md5值)
3. 重删/非重删模式下对性能的Impact:
i. 读写次数统计
ii. 擦除次数统计
iii. 响应时间
4. 读写流程。
D1:理解一下工程的Makefile
D1的任务就是理解下面这个Makefile,首先是一些琐碎的Makefile语法:
实际上,Makefile由一系列类似下面的组成
<target> : <prerequisites>
[tab] <command1>
[tab] <command2>
...
include <filename>
make 程序在处理指示符 include 时,将暂停对当前makefile 文件
的读取,而去读<filename>指示的文件(列表)。
<filename>将通过某种方式搜索得到。
$(shell xxx)
$(shell ...)将包含一条shell 命令,如下面所示的pwd
Makefile中的shell,每一行是一个进程,不同行之间变量值不能传递。
Makefile中的变量以$开头, 所以,为了避免和shell的变量冲突,shell的变量以$$开头
export var_name
这是用于在不同的makefile中共享变量的。
$(MAKE) -C <dir_name>
区别于
gcc -c xxx.c
,gcc的-c选项用于“把代码文件编译成中间代码.o文件”;
而make的-C选项是“切换到dir所在目录,然后执行make,之后再切换回原目录”
$@
其中一个自动变量,代表目前正在构建的目标。
其他的自动变量(如$<
等)在阮一峰的教程中详细说明。
-
.PHONY: xxx
(伪目标)
特殊声明,每次make xxx时都执行(而不去检查是否该目标为更新的)
//这是<disksim_dir>/makefile文件
TOP_BUILDDIR=$(shell pwd)
include .paths
SUBDIRS=libddbg libparam diskmodel memsmodel ssdmodel src
all:
$(MAKE) -C libddbg
$(MAKE) -C libparam
$(MAKE) -C diskmodel
$(MAKE) -C memsmodel
$(MAKE) -C ssdmodel
$(MAKE) -C src
$(MAKE) -C diskmodel/layout_g4_tools
# If dixtrac is included, build it with the distribution
if [ -d dixtrac ]; then $(MAKE) -C dixtrac ; fi
clean:
for d in $(SUBDIRS); do \
$(MAKE) -C $$d $@; \
done
distclean: clean
rm -f *~
for d in $(SUBDIRS); do \
$(MAKE) -C $$d $@; \
done
.PHONY: doc
doc:
$(MAKE) -C libddbg
$(MAKE) -C libparam
$(MAKE) -C src/modules
$(MAKE) -C diskmodel/modules
$(MAKE) -C memsmodel/modules
$(MAKE) -C ssdmodel/modules
doc-clean:
$(MAKE) -C memsmodel/modules distclean
$(MAKE) -C diskmodel/modules distclean
$(MAKE) -C ssdmodel/modules distclean
$(MAKE) -C src/modules distclean
$(MAKE) -C libparam distclean
$(MAKE) -C libddbg distclean
//这是\<disksim dir>\.paths文件
# libdisksim
export LIBDISKSIM_PREFIX=
export LIBDISKSIM_INCL=$(LIBDISKSIM_PREFIX)/include
export LIBDISKSIM_CFLAGS=-I$(LIBDISKSIM_INCL)
export LIBDISKSIM_LDPATH=$(LIBDISKSIM_PREFIX)/lib
export LIBDISKSIM_LDFLAGS=-L$(LIBDISKSIM_LDPATH) -ldisksim
# disksim internals (for memsmodel, etc)
export DISKSIM_PREFIX=src/
export DISKSIM_INCL=$(DISKSIM_PREFIX)/
export DISKSIM_CFLAGS=-I$(DISKSIM_INCL)
export DISKSIM_LDPATH=$(DISKSIM_PREFIX)/
export DISKSIM_LDFLAGS=-L$(DISKSIM_LDPATH) -ldisksim
# path to diskmodel
export DISKMODEL_PREFIX=diskmodel
export DISKMODEL_INCL=$(DISKMODEL_PREFIX)/include
export DISKMODEL_CFLAGS=-I$(DISKMODEL_INCL)
export DISKMODEL_LDPATH=$(DISKMODEL_PREFIX)/lib
export DISKMODEL_LDFLAGS=-L$(DISKMODEL_LDPATH) -ldiskmodel
# path to libparam
export LIBPARAM_PREFIX=libparam
export LIBPARAM_INCL=$(LIBPARAM_PREFIX)/include
export LIBPARAM_CFLAGS=-I$(LIBPARAM_INCL)
export LIBPARAM_LDPATH=$(LIBPARAM_PREFIX)/lib
export LIBPARAM_LDFLAGS=-L$(LIBPARAM_LDPATH) -lparam
# libtrace
export LIBDDBG_PREFIX=libddbg
export LIBDDBG_INCL=$(LIBDDBG_PREFIX)/include
export LIBDDBG_CFLAGS=-I$(LIBDDBG_INCL)
export LIBDDBG_LDPATH=$(LIBDDBG_PREFIX)/lib
export LIBDDBG_LDFLAGS=-L$(LIBDDBG_LDPATH) -lddbg
# path to memsmodel
export MEMSMODEL_PREFIX=memsmodel
export MEMSMODEL_INCL=$(MEMSMODEL_PREFIX)/include
export MEMSMODEL_CFLAGS=-I$(MEMSMODEL_INCL)
export MEMSMODEL_LDPATH=$(MEMSMODEL_PREFIX)/lib
export MEMSMODEL_LDFLAGS=-L$(MEMSMODEL_LDPATH) -lmemsmodel
# path to ssdmodel
export SSDMODEL_PREFIX=ssdmodel
export SSDMODEL_INCL=$(SSDMODEL_PREFIX)/include
export SSDMODEL_CFLAGS=-I$(SSDMODEL_INCL)
export SSDMODEL_LDPATH=$(SSDMODEL_PREFIX)/lib
export SSDMODEL_LDFLAGS=-L$(SSDMODEL_LDPATH) -lssdmodel
有了上面的知识,该Makefile简直简单,就是一个“总控Makefile”,它做了:
- include了一个文件.paths,export了一堆变量以供下一级的Makefile使用;
- 定义了几个目标,他们需要分别进入每个子目录进行make。
显然disksim整个工程中的所有东西不需要每个都去看,比较相关的有:<u>trace文件读入,请求的生成,ssd模块(MS版)的处理</u>等。
参考文献:
<a href=http://www.blogjava.net/jasmine214--love/archive/2012/01/10/368191.html>makefile中的shell语法</a>
<a href=http://blog.sina.com.cn/s/blog_6cc850810100r8fr.html>Makefile Include</a>
<a href=http://blog.csdn.net/shallnet/article/details/37358169>从头开始写makefile系列</a>
<a href=http://bbs.chinaunix.net/forum-viewthread-tid-1630480.html>ChinaUNiXmake的C选项问题讨论<a>
<a href=http://www.ruanyifeng.com/blog/2015/02/make.html>阮一峰的make教程</a>
<a href=https://gist.github.com/isaacs/62a2d1825d04437c6f08>issacs的make basic教程</a>
<a href=http://www.gnu.org/software/make/manual/make.html>GNU make官方文档<a>
<a href=http://www.cnblogs.com/hnrainll/archive/2011/04/12/2013377.html>Disksim的特殊规则.PHONY</a>