终南音乐厅-文艺晚会

前天去学校后边的农家乐钓鱼了,昨晚观看了学校的十佳歌手决赛,今晚(4.29)又去了趟师大,在终南音乐厅欣赏了一场晚会,主题是助学政策、助我成长。下午只是出去逛逛,没想到正好碰上了,比较可惜的是我们(高辉、肖纯)都没带眼镜,当然就比较朦胧了。总共有十个节目,包括民乐合奏、舞蹈、诗朗诵、男女独唱、舞台剧、大合唱。总之比较专业,服装色彩很漂亮,感受最深的应该是几个舞蹈吧。

小组五一还有外出活动,下来还准备和高中同学去爬华山,还有和好几个人说好去K歌了。

没办法,大四后期就准备这样过了。再不玩真的没机会了。

毕设,现在把网卡源代码分析的基本到位了,硬件部分由于有手册可查也变得能理解。从前天开始从零把8139的网卡驱动写出来,当然大量代码是参照/COPY原来的文件,但这样个组装过程也能掌握好多细节东西。

英文直译翻唱经典主题曲

红楼梦(Dream of red chamber)

http://www.tudou.com/v/6MfFoS6Ah8Y

The one is a god’s flower in the court
The one is a perfect jade
If say no adventure
This life unlikily met he
If say have adventure
How the worry finally becomes virtual
III
The one is complainting in vain
The one is worrying for nothing
The one is the moon in water
The one is the flower in mirror
Think in eyes can hold how many tears
How can support autuwn goes to winter
Spring goes to summer
III

西游记

http://www.tudou.com/v/V0M6-gxs1A4

You carry burden
I pull horse
receive sunrise
say good-bye to sunset
overcome troubles
walking on avenue
finish fighting sufferings
geting going again
geting going again
come come come
a series of changes of seasons
you taste bitterness and happiness
dare to ask where is road
the road under foot
come come come
a series of changes of seasons
you taste bitterness and happiness
dare to ask where is road
the road under foot
the road under foot

个人观点,不能用“玷污经典”来完全否定这些“作品”,换一种表现形式,又有另一凡风味。

致凤中2005级10班,长安校区同胞一份信(updating)

亲爱的同志们:

大学即将结束,很快就要离开这座象牙塔,我们或许天南海北,或许隔洋跨海,或许… 是否有些恋恋不舍?是否有些惆怅不安?是否有一丝身心的疲惫?是否有些对未来的期待?

五一将至,面对如此好的一个机会,你难道没有一丝的心动?没有任何的外出计划?那很好!
现在我提议:五一外出,可以去华山、农家乐吃烤鱼等等,也希望大家多出好点子。其实去那不重要,重要的是我们能在一起,能在一起度过美好的时光。

不要告诉我,你要回家!记着以后工作了,多回家看看就行,你能做到吗?亲爱的同志们。

吴静、我目前ok,其他人我会依次发送“邀请函”,有什么特殊情况,请给回复!默认情况是同意呀。最终上报组织,由领导审批。呵呵

4月27日钓鱼照片:  http://picasaweb.google.com/kongjianjun/427#

网页Email地址抓取脚本

今天帮你同学写了个shell脚本,抓取指定url地址的网页中的email地址。 这里字符编码转换还有点问题,只是考虑了gb2312一种情况。最好是从html源码截取字符编码,进行转换。

#!/bin/bash
# test page: http://zhidao.baidu.com/question/21631338.html

f=".tmp.txt"
f2=".tmp2.txt"

wget $1 -O $f2 >/dev/null 2>/dev/null
iconv -f gb2312 -t utf-8 $f2 > $f 2>/dev/null

sed -i -e 's/]*>//g;/<!--/d' $f
sed -i -e 's/ //g;s/°C//g;s/^s*//g;/^$/d' $f

sed -e "s/[^-.+_a-zA-Z0-9@]/n/g" $f |grep @|grep ^[a-zA-Z0-9]|grep [a-zA-Z0-9]$ |sort -u | tee
rm -rf $f $f2

运行效果:

kongove@ubuntu:~$ ./a.sh http://zhidao.baidu.com/question/21631338.html
aizi66742112@hainan.net
alading512@sina.com
bingbing43@163.com
caoyingtj@163.com
chenq@chinabyte.com
dnzb@pub2.qz
duanxiaosong@ah163.com
gxlworld@163.com
halfmay2691@sina.com
hbx@wxjt.com.cn

成功编译网卡驱动

我的毕设终于有眉目了 🙂
我的网卡驱动文件是: driver/net/forcedeth.c
最近在读代码过程中,做了一下代码汉字注释,还有一些笔记。就是编译总出现格式不可用。今天在helight的帮助下,终于把经过自己稍微修改的网卡驱动,编译、安装好,现在使用的就是“自己的网卡驱动了”。

1. Install the kernel header files
$ sudo apt-get install linux-headers-2.6.27-13-generic

2. Get the source code of forcedeth.c, and modify it
kongove@ubuntu:~/code/kernel/force$ ls
forcedeth.c  Makefile

3. Write the Makefile
$ cat Makefile
obj-m := forcedeth.o

KERNELDIR=/lib/modules/`uname -r`/build
#KERNELDIR := /usr/src/linux-headers-2.6.22-14
modules:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
        rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

4. Compile the module
$ make

5. Remove the module
$ sudo rmmod forcedeth

6. Install your module
$ sudo insmod ./forcedeth.ko

7. Check if it works
$ ifconfig
$ ping www.baidu.com

ICC编译Linux内核

听说使用ICC编译Linux内核,性能可以提升40%,我的第一感觉是,应该有提升,也没这么夸张吧,应该是有人估计夸大,玩数字游戏。 从4月1日起,开始尝试编译。从Intel官网下载ICC 10.0.022,在虚拟机的Fedora10上安装(安装需要licence)。然后从LinuxDNA.com下载2.6.22内核代码,下载最新的封装脚本(http://linuxdna.com/wrapper.html),使用POE提供给我的一个补丁(针对2.6.18),下载linuxdna配置文件(http://www.linuxdna.com/configdna)放到内核根目录 手工对内核代码进行了修改,按照LinuxDNA网页的简单说明编译内核。 刚刚把内核安装成功,发现启动速度比原来(2.6.22)快了一半,我都怀疑是不是有其他问题,但目前的使用都正常,特别是响应速度明显提升,也不知道是不是心理作用。下面需要一些具体的测试,才能说明问题。 不过进入系统发现lsmod的结果为空,没有加载任何驱动,网络也不能用,这可能是快的原因吧,到底性能有没有提升,还是得测试。 备注:LinuxDNA是一个使用ICC编译Linux内核的项目,旨在提高内核性能。

1. First get icc from Intel.com and install it.
2. Download the source code of kernel. You may need to fix a patch. Or change the source code refer to some patch. You can find them on the LinuxDNA’s GoogleGroup.
3. Get the config file from (http://www.linuxdna.com/configdna) and copy it to the root directory of kernel source code.
4. Next get the shell script file from (http://linuxdna.com/wrapper.html) and copy it to /usr/bin, set the filename as intelwrapper.
5. Next run make menuconfig / oldconfig to configure your kernel again
6. Compile kernel with “make HOSTCC=intelwrapper CC=intelwrapper Ar=xiar LD=xild”

(note:This is the patch for 2.6.22. My icc version is 10.0.022, So please change the icc version number in this patch when you use it )

diff -ur linux-2.6.22.old/arch/i386/boot/compressed/relocs.c linux-2.6.22/arch/i386/boot/compressed/relocs.c
--- linux-2.6.22.old/arch/i386/boot/compressed/relocs.c	2009-04-06 19:04:22.000000000 +0800
+++ linux-2.6.22/arch/i386/boot/compressed/relocs.c	2009-04-06 19:10:28.000000000 +0800
@@ -10,7 +10,7 @@
#define USE_BSD
#include

-#define MAX_SHDRS 100
+#define MAX_SHDRS 1000
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
static Elf32_Ehdr ehdr;
static Elf32_Shdr shdr[MAX_SHDRS];
diff -ur linux-2.6.22.old/Makefile linux-2.6.22/Makefile
--- linux-2.6.22.old/Makefile	2009-04-06 19:04:03.000000000 +0800
+++ linux-2.6.22/Makefile	2009-04-06 19:11:51.000000000 +0800
@@ -610,7 +610,7 @@
quiet_cmd_vmlinux__ ?= LD      $@
cmd_vmlinux__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) -o $@ 
-T $(vmlinux-lds) $(vmlinux-init)                          
-      --start-group $(vmlinux-main) /opt/intel/cc/10.1.018/lib/libirc_s.a --end-group                  
+      --start-group $(vmlinux-main) /opt/intel/cc/10.1.022/lib/libirc_s.a --end-group                  
$(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) FORCE ,$^)

# Generate new vmlinux version
diff -ur linux-2.6.22.old/mm/slab.c linux-2.6.22/mm/slab.c
--- linux-2.6.22.old/mm/slab.c	2009-04-06 19:04:03.000000000 +0800
+++ linux-2.6.22/mm/slab.c	2009-04-06 19:12:04.000000000 +0800
@@ -326,7 +326,7 @@
{
extern void __bad_size(void);

-	if (__builtin_constant_p(size)) {
+//	if (__builtin_constant_p(size)) {
int i = 0;

#define CACHE(x) 
@@ -336,9 +336,9 @@
i++;
#include "linux/kmalloc_sizes.h"
#undef CACHE
-		__bad_size();
-	} else
-		__bad_size();
+//		__bad_size();
+//	} else
+//		__bad_size();
return 0;
}

diff -ur linux-2.6.22.old/scripts/Makefile.build linux-2.6.22/scripts/Makefile.build
--- linux-2.6.22.old/scripts/Makefile.build	2009-04-06 19:04:02.000000000 +0800
+++ linux-2.6.22/scripts/Makefile.build	2009-04-06 19:12:58.000000000 +0800
@@ -299,7 +299,7 @@
cmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps)

quiet_cmd_link_multi-m = LD [M]  $@
-cmd_link_multi-m = $(LD) $(ld_flags) $(LDFLAGS_MODULE) -o $@ $(link_multi_deps)
+cmd_link_multi-m = $(LD) $(ld_flags) $(LDFLAGS_MODULE) -o $@ $(link_multi_deps) /opt/intel/cc/10.1.022/lib/libirc_s.a

# We would rather have a list of rules like
# 	foo.o: $(foo-objs)
diff -ur linux-2.6.22.old/scripts/Makefile.modpost linux-2.6.22/scripts/Makefile.modpost
--- linux-2.6.22.old/scripts/Makefile.modpost	2009-04-06 19:04:02.000000000 +0800
+++ linux-2.6.22/scripts/Makefile.modpost	2009-04-06 19:13:10.000000000 +0800
@@ -98,7 +98,7 @@
# Step 6), final link of the modules
quiet_cmd_ld_ko_o = LD [M]  $@
cmd_ld_ko_o = $(LD) $(LDFLAGS) $(LDFLAGS_MODULE) -o $@		
-			  $(filter-out FORCE,$^)
+			  $(filter-out FORCE,$^) /opt/intel/cc/10.1.022/lib/libirc_s.a

$(modules): %.ko :%.o %.mod.o FORCE
$(call if_changed,ld_ko_o)

About DMA(Direct Memory Access)

在PC上都有一个DMAC(直接内存访问控制器),用于控制RMA和I/O设备之间的数据传送。DMAC需要被CPU激活,才能自行传送数据,数据传送完,DMAC发出一个中请求。一个名为存储器仲裁器的硬件电路用于解决CPU和DMAC并发访问同一存储单元时的冲突。

DMAC常使用在磁盘驱动器等一次传送大量数据的慢速设备。DMAC的设置时间长,少量数据使用CPU效率较高。

除CPU之外的硬件设备驱动数据总线所用的存储器地址,称作总线地址(bus address)。在PC体系结构中,总线地址和物理地址相同,但在Sun的SPARC和HP的Alpha体系结构中,两者不同。内核提供virt_to_bus和bus_to_virt宏转换线性地址和总线地址。

DMA操作中,I/O设备和DMAC直接驱动数据总线,需要把涉及的存储去缓冲区总线地址写入DMAC相应I/O端口,或I/O设备相应端口。

打开设备文件时,就会分配一条IRQ线准备发送DMA传送结束的信号。为了启动DMA操作,设备驱动程序只是在硬件设备的I/O端口写入DMA缓冲区的总线地址、传输方向和传输数据大小;然后驱动程序挂起当前进程。当DMA结束时,硬件设备产生一个中断唤醒设备驱动程序。当设备文件对象被最后一个进程关闭时,其release方法中释放IRQ线。

关于Linux内核性能测试

参考上篇文章,我把自己最近碰到的内核测试方法总结了一下,希望大家指错 🙂

一、概述:
一般意义上的内核测试可能更多的偏重于功能测试,但在内核开发中,内核退化是很严重的问题,特别是在添加新特性的时候,性能测试显得尤为重要。
内核性能的方法是针对Linux内核五大子系统(进程调度子系统、内存管理子系统、虚拟文件子系统、进程通信子系统和网络子系统)的自身特点,测量出Linux内核完成工作量负载的响应时间、CPU时间和CPU利用率等参数,作为衡量标准。

二、内核性能测试开源项目:
http://www.linuxdna.com/
http://kernel-perf.sourceforge.net/

三、Linux内核测试法:

1.Linux测试项目(LTP)
LTP(Linux test project)套件涵盖了内核的大多数接口,如系统调用、内存、IPC、I/O、文件系统和网络。这个项目收集了各种 Linux内核测试工具和相关资料,当前包括了超过 2900个测试用例。

2.可扩展性测试平台(STP)
开放源代码开发实验室 (Open Source Development Labs, OSDL)创建了可扩展测试平台(Scalable Test Platform,STP)系统。STP 是一个自动化的测试平台, STP可以构建内核、设置测试、运行测试,并收集结果,然后进行深入地比较。

3.代码覆盖分析
代码覆盖分析在一个给定的测试运行时,分析出内核中哪些代码行被执行,提示内核的哪些部分还没有被测试到,并指出需要再编写哪些新测试来测试内核的相应部分,以使可以得到更完备的测试。

4.内核回归测试
对Linux内核执行持续多日的回归测试,创建实时的、集中的档案库,以随时获得 Linux内核的快照,内核发生改变,测试人员就可进行测试。

这些方法包括:使用专门的硬件测试设备、软件测试、往内核插入测试代码等
测试一般分三个层次:
1)系统层:包括处理器、内存、硬盘和网络等;
2)应用层:包括锁、线程、堆和API等;
3)微结构层:包括数据队列、循环结构和cache优化。

四、常用测试软件:
1、kernbench (测试CPU吞吐量)
http://freshmeat.net/projects/kernbench/

2、hackbench (测试开销、调度程序的可伸缩性)
http://devresources.linux-foundation.org/craiger/hackbench/

3、tbench (TCP测试)

4、Netbench (网络性能测试,是一个工业标准,用于Samba和WindowsNT这样的文件服务器的压力测试)

5、dbench (测磁盘吞吐量)

6、unixbench (虚拟处理器-VPS性能测试)
下载:http://www.tux.org/pub/tux/benchmarks/System/unixbench/

五、网络性能测试方面:(协议栈测试)
rfc2544规定了网络互联设备测试基准方法(如:吞吐量、延时、丢包率等)
注意:
1、一般要求百兆/千兆的线速
2、采用专门的硬件测试设备 (如:smartbits),软件测试效果不是很好
3、发包的设备必须远强与你现有的设备
4、根据产品的特性要求(市场的要求),平衡吞吐量/延时
5、性能的优化,也可以对协议栈本身进行改进
案例:网卡中断发生频率非常高,有人实践将中断处理模式改为轮询模式,这样大大的提高性能,当然这是在他们专用的应用环境下

六、干扰因素:
1、硬件设备性能
2、测试软件本身消耗
3、系统服务消耗等
4、测试覆盖率问题
5、其他随机因素

七、服务器内核测试:
1、偏重网络、存储两大块
2、多核、集群、大容量存储等具体环境
3、结合具体业务

八、其他
1、测试结果的图形化友好显示,如图表、动态图等
2、性能评定标准,从正确性、可靠性、工作性能三方面进行,相关参数如:响应速度、CPU时间、CPU利用率等,可靠性测试包括NFS 压力测试、内存管理压力测试、文件系统压力测试、多线程压力测试、硬盘I/O 测试、IPC测试、系统调用功能的验证测试、网络压力测试等。
3、综合评定常用的就是打分制

Linux系统内核性能评测

Linux以其开放和自由的特性,日益受到人们的关注,并被广泛应用于科学计算、电子商务、并行运算、辅助教学、大型服务器嵌入式应用和桌面办公等不同的领域,为我国软件产业的发展带来了契机。研究Linux内核的评测方法、评价工具和评测标准,颇具意义和实用价值,有助于 Linux国产化发展,同时也是国家电子基金项目的重要组成部分。

Linux内核是Linux操作系统最核心的部分,其性能直接决定了操作系统的性能。测试内核性能的方法是针对Linux内核五大子系统(进程调度子系统、内存管理子系统、虚拟文件子系统、进程通信子系统和网络子系统)的自身特点,测量出Linux内核完成工作量负载的响应时间、CPU时间和CPU利用率等参数,作为衡量标准。

Linux内核测试

1.Linux测试项目(LTP)

LTP(Linux test project)套件涵盖了内核的大多数接口,如系统调用、内存、IPC、I/O、文件系统和网络。这个项目收集了各种 Linux内核测试工具和相关资料,当前包括了超过 2900个测试用例。

2.可扩展性测试平台(STP)

开放源代码开发实验室 (Open Source Development Labs, OSDL)创建了可扩展测试平台(Scalable Test Platform,STP)系统。STP 是一个自动化的测试平台, STP可以构建内核、设置测试、运行测试,并收集结果,然后进行深入地比较。

3.代码覆盖分析

代码覆盖分析在一个给定的测试运行时,分析出内核中哪些代码行被执行,提示内核的哪些部分还没有被测试到,并指出需要再编写哪些新测试来测试内核的相应部分,以使可以得到更完备的测试。

4.内核回归测试

对Linux内核执行持续多日的回归测试,创建实时的、集中的档案库,以随时获得 Linux内核的快照,内核发生改变,测试人员就可进行测试。

Linux内核架构

Linux内核主要由五大子系统组成:进程调度子系统(Process Scheduler)、内存管理子系统(Memory Manager)、虚拟文件子系统(Virtual File System)、进程通信子系统(Inter-Process Communication)和网络子系统(Network Interface),其中进程调度子系统是 Linux操作系统的核心。这五大子系统彼此紧密协作,共同对用户程序提供服务,其系统架构如下图所示。

图1. Linux内核结构 Continue reading “Linux系统内核性能评测”