jit.c
上传用户:wudi5211
上传日期:2010-01-21
资源大小:607k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

C/C++

  1. /*
  2.  * jit.c -- the just-in-time module
  3.  *
  4.  * Tested with 2.0 on the x86, Sparc
  5.  */
  6. /* BUGS: this module is not reentrant: only one file can be read at a time
  7.  *       the module usage count is not used: you could remove the module
  8.  *           while reading it, thus asking for troubles
  9.  */
  10.  
  11. #ifndef __KERNEL__
  12. #  define __KERNEL__
  13. #endif
  14. #ifndef MODULE
  15. #  define MODULE
  16. #endif
  17. #include <linux/module.h>
  18. #define VERSION_CODE(vers,rel,seq) ( ((vers)<<16) | ((rel)<<8) | (seq) )
  19. #if LINUX_VERSION_CODE < VERSION_CODE(1,99,4)
  20. #  error "This module needs Linux 1.99.4 or newer"
  21. #else
  22. #include <linux/sched.h>
  23. #include <linux/kernel.h> /* printk() */
  24. #include <linux/fs.h>     /* everything... */
  25. #include <linux/proc_fs.h>
  26. #include <linux/errno.h>  /* error codes */
  27. #include <linux/types.h>  /* size_t */
  28. /*
  29.  * This module is a silly one: it only embeds short code fragments
  30.  * that show how time delays can be handled in the kernel.
  31.  */
  32. int jit_delay = 1; /* the default delay in read() */
  33. char jit_spoke[] = "This is a meaningless string, fiftysix characters long.n";
  34. #define LIMIT (PAGE_SIZE-128) /* don't print any more after this size */
  35. static int jit_print(char *buf)
  36. {
  37.     int len = 0;
  38.     while(len < LIMIT)
  39.         len += sprintf(buf+len,"%s",jit_spoke);
  40.     return len;
  41. }
  42. int jit_read_busy(char *buf, char **start, off_t offset,
  43.                    int len, int unused)
  44. {
  45.     /* delay one second (or the chosen value), before printing */
  46.     unsigned long j= jiffies + jit_delay * HZ;
  47.     while (jiffies < j)
  48. /* nothing */;
  49.     return jit_print(buf);
  50. }
  51. int jit_read_sched(char *buf, char **start, off_t offset,
  52.                    int len, int unused)
  53. {
  54.     /* delay one second (or the chosen value), before printing */
  55.     unsigned long j= jiffies + jit_delay * HZ;
  56.     while (jiffies < j)
  57. schedule();
  58.     return jit_print(buf);
  59. }
  60. int jit_read_queue(char *buf, char **start, off_t offset,
  61.                    int len, int unused)
  62. {
  63.     /* delay one second (or the chosen value), before printing */
  64.     unsigned long j= jiffies + jit_delay * HZ;
  65.     
  66.     struct wait_queue *wait = NULL;
  67.     current->timeout = j;
  68.     interruptible_sleep_on(&wait);
  69.     return jit_print(buf);
  70. }
  71. int jit_read_self(char *buf, char **start, off_t offset,
  72.                    int len, int unused)
  73. {
  74.     /* delay one second (or the chosen value), before printing */
  75.     unsigned long j= jiffies + jit_delay * HZ;
  76.     current->timeout = j;
  77.     current->state = TASK_INTERRUPTIBLE;
  78.     schedule();
  79.     current->timeout = 0; /* reset the timeout */
  80.     return jit_print(buf);
  81. }
  82. struct proc_dir_entry jit_proc_busy = {
  83.         0,                 /* low_ino: the inode -- dynamic */
  84.         7, "jitbusy",      /* len of name and name */
  85.         S_IFREG | S_IRUGO, /* mode */
  86.         1, 0, 0,           /* nlinks, owner, group */
  87.         0, NULL,           /* size - unused; operations -- use default */
  88.         &jit_read_busy,    /* function used to read data */
  89.         /* nothing more */
  90.     };
  91. struct proc_dir_entry jit_proc_sched = {
  92.         0,                 /* low_ino: the inode -- dynamic */
  93.         8, "jitsched",     /* len of name and name */
  94.         S_IFREG | S_IRUGO, /* mode */
  95.         1, 0, 0,           /* nlinks, owner, group */
  96.         0, NULL,           /* size - unused; operations -- use default */
  97.         &jit_read_sched,   /* function used to read data */
  98.         /* nothing more */
  99.     };
  100. struct proc_dir_entry jit_proc_queue = {
  101.         0,                 /* low_ino: the inode -- dynamic */
  102.         8, "jitqueue",     /* len of name and name */
  103.         S_IFREG | S_IRUGO, /* mode */
  104.         1, 0, 0,           /* nlinks, owner, group */
  105.         0, NULL,           /* size - unused; operations -- use default */
  106.         &jit_read_queue,    /* function used to read data */
  107.         /* nothing more */
  108.     };
  109. struct proc_dir_entry jit_proc_self = {
  110.         0,                 /* low_ino: the inode -- dynamic */
  111.         7, "jitself",      /* len of name and name */
  112.         S_IFREG | S_IRUGO, /* mode */
  113.         1, 0, 0,           /* nlinks, owner, group */
  114.         0, NULL,           /* size - unused; operations -- use default */
  115.         &jit_read_self,    /* function used to read data */
  116.         /* nothing more */
  117.     };
  118. /*
  119.  * There is also a silly file returning the current time.
  120.  */
  121. int jit_read_current(char *buf, char **start, off_t offset,
  122.                    int len, int unused)
  123. {
  124.     struct timeval tv1, tv2;
  125.     unsigned long flags;
  126.     do_gettimeofday(&tv1);
  127.     save_flags(flags);
  128.     cli();
  129.     tv2 = xtime;
  130.     restore_flags(flags);
  131.     len=0;
  132.     len += sprintf(buf,"gettime: %9i.%06inxtime:   %9i.%06injiffies: %lin",
  133.                    tv1.tv_sec, tv1.tv_usec,
  134.                    tv2.tv_sec, tv2.tv_usec, jiffies);
  135.     return len;
  136. }
  137. struct proc_dir_entry jit_proc_current = {
  138.         0,                 /* low_ino: the inode -- dynamic */
  139.         10, "currentime",  /* len of name and name */
  140.         S_IFREG | S_IRUGO, /* mode */
  141.         1, 0, 0,           /* nlinks, owner, group */
  142.         0, NULL,           /* size - unused; operations -- use default */
  143.         &jit_read_current, /* function used to read data */
  144.         /* nothing more */
  145.     };
  146. int init_module(void)
  147. {
  148.     proc_register_dynamic(&proc_root, &jit_proc_busy);
  149.     proc_register_dynamic(&proc_root, &jit_proc_sched);
  150.     proc_register_dynamic(&proc_root, &jit_proc_queue);
  151.     proc_register_dynamic(&proc_root, &jit_proc_self);
  152.     proc_register_dynamic(&proc_root, &jit_proc_current);
  153. #ifndef JIT_DEBUG
  154.     register_symtab(NULL); /* hide symbols */
  155. #endif
  156.     return 0; /* succeed */
  157. }
  158. void cleanup_module(void)
  159. {
  160.     proc_unregister(&proc_root, jit_proc_busy.low_ino);
  161.     proc_unregister(&proc_root, jit_proc_sched.low_ino);
  162.     proc_unregister(&proc_root, jit_proc_queue.low_ino);
  163.     proc_unregister(&proc_root, jit_proc_self.low_ino);
  164.     proc_unregister(&proc_root, jit_proc_current.low_ino);
  165. }
  166. #endif /* version 1.99.4 or newer */