由于程序跑在内核态下,所以需要做内核模块中的程序运行时间测量(可以用于驱动程序)。这与用户态下的时间测量有点区别,其中内核中不能使用浮点运算,同时计时函数有区别。
用户态下时间测量函数 int gettimeofday(struct timeval *tv,struct timezone *tz);
而内核态中函数 void do_gettimeofday(struct timeval *tv);
以下是自己所写的内核模块(baotime.c):
#include
#include
#include
#include
MODULE_LICENSE("GPL");
int init_module(void){
struct timeval tpstart,tpend;
unsigned long timeuses=0;
unsigned long timeuseu=0;
int i=0;
do_gettimeofday(&tpstart);
for(i=0;i<1000000000;i++);
do_gettimeofday(&tpend);
printk("%ld ",tpend.tv_sec);
printk("%ld ",tpstart.tv_sec);
timeuses=(tpend.tv_sec-tpstart.tv_sec)*1000000+tpend.tv_usec-tpstart.tv_usec;
timeuseu=timeuses/1000000;
timeuses=timeuses-timeuseu*1000000;
printk("processor time is %ld s,%ld us",timeuseu,timeuses);
return 0;
}
void cleanup_module(void){
printk("<1>Goodbye cruel word\n");
}
开始加载模块是出现了编译版本不一致问题,编译使用的2.4.20,而内核版本为2.4.20-8。
解决方法:找到/usr/include/linux/version.h
把#define UTS_RELEASE "2.4.20"改为#define UTS_RELEASE "2.4.20-8"即可
以下是makefile文件:
CC=gcc
MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux-2.4/include
baotime.o :baotime.c
$(CC) $(MODCFLAGS) -c baotime.c
echo insmod baotime.o to turn it on
echo rmmod baotime to turn it off
echo
加载之后,程序运行时间测试为processor time is 3 s,713806 us。
阅读(1706) | 评论(0) | 转发(0) |