訂正
精査のログについては別途エントリ投入します。
って書きましたが loadavg 関連は違う意味で気合が必要そげなので別途で。
とりあえず
実習課題をナニしてみます。ちなみにテキストは_実習 Linux カーネル_です。2.2 系がターゲットなので微妙。
まずモジュールが以下なカンジ。
#include <linux/module.h> // required by all modules #include <linux/kernel.h> // required by printk() #include <linux/seq_file.h> // required by struct seq_operations #include <linux/fs.h> // required by struct file_operations #include <linux/proc_fs.h> // required by {create, remove}_proc_entry #include <linux/time.h> // required by xtime #include <linux/init.h> MODULE_LICENSE("GPL"); static int proc_read_yamanetoshi(char *page, char **start, off_t off, int count, int *eof, void *data) { int len; len = sprintf(page, "%ld %ld\n", xtime.tv_sec, xtime.tv_nsec); return len; } // Start/Init function static int yamanetoshi_init(void) { struct proc_dir_entry *entry; entry = create_proc_entry("yamanetoshi", 0, NULL); if (entry) { entry->read_proc = proc_read_yamanetoshi; } return 0; } // End/Cleanup function static void yamanetoshi_exit(void) { remove_proc_entry("yamanetoshi", NULL); } module_init(yamanetoshi_init); module_exit(yamanetoshi_exit);
これを insmod して cat したら出てくるのが以下
# insmod yamanetoshi.ko # cat /proc/yamanetoshi 1217753840 342576526 #
で、gettimeofday な API の出力と比較せえ、とある。試験なソレが以下
#include <stdio.h> #include <stdlib.h> #include <sys/time.h> #define N 16 #define LENGTH 255 void procClockTimes_init(char **p) { int i; for(i = 0; i < N; i++) { if (NULL == (p[i] = malloc(LENGTH))) { fprintf(stderr, "cannot malloc\n"); exit(1); } } } int main(void) { struct timeval gtodTimes[N]; char *procClockTimes[N]; int i; procClockTimes_init(procClockTimes); for(i = 0; i < N; i++) { FILE *my_clock = NULL; if(NULL == (my_clock = fopen("/proc/yamanetoshi", "r"))) { fprintf(stderr, "/proc/yamanetoshi cannot open\n"); exit(1); } gettimeofday(>odTimes[i], NULL); fgets(procClockTimes[i], LENGTH, my_clock); fclose(my_clock); } for(i = 0; i < N; i++) { printf("%d\n", i); printf("%ld %ld\n", gtodTimes[i].tv_sec, gtodTimes[i].tv_usec); printf("%s\n", procClockTimes[i]); } /* free ... */ return 0; }
free してませんがご勘弁下さひ。これを実行したら gettimeofday のナニは変化があるのですが、16 回程度のループでは /proc/yamanetoshi な数値は変化が無い。
N を 1000 くらいにしておいて i の数値を見てみたんですが規則性の無いタイミングではありますが数値が変化しているのを一応確認できとります。テキストによればソース嫁、との事。kernel/time.c とか arch/i386/kernel/time.c とか、との事。
腹へり杉で微妙なので一旦休憩。