Chinaunix首页 | 论坛 | 博客
  • 博客访问: 554511
  • 博文数量: 104
  • 博客积分: 4131
  • 博客等级: 上校
  • 技术积分: 1137
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-31 15:05
文章分类

全部博文(104)

文章存档

2011年(13)

2010年(23)

2009年(68)

我的朋友

分类: LINUX

2009-08-26 17:00:04

  由于程序跑在内核态下,所以需要做内核模块中的程序运行时间测量(可以用于驱动程序)。这与用户态下的时间测量有点区别,其中内核中不能使用浮点运算,同时计时函数有区别。
用户态下时间测量函数 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) |
给主人留下些什么吧!~~