kfifo 試す (9)
ええと、直前エントリなソレを試験する、というナニはデバイスドライバにせずに module_init なソレで試験なコードと printk で、という解を思いつく。
で、こんなカンジからスタート
#include <linux/module.h> // required by all modules #include <linux/kernel.h> // required by printk() #include <linux/init.h> #include <linux/fs.h> #include <linux/sched.h> #include <asm/uaccess.h> // required by copy_{to_user, from_user} #include <linux/errno.h> #include <linux/kfifo.h> // fifo MODULE_LICENSE("GPL"); #define BUFSIZ 256 static struct kfifo *fifo_ptr; static spinlock_t fifo_lock; static void kfifo_test(void) { return; } static int yamanetoshi_init(void) { int ret; printk("initialize the fifo device\n"); spin_lock_init(&fifo_lock); fifo_ptr = kfifo_alloc(BUFSIZ, GFP_KERNEL, &fifo_lock); if(IS_ERR(fifo_ptr)) return -ENOMEM; kfifo_test(); return 0; } static void yamanetoshi_exit(void) { printk("cleanup the fifo device\n"); kfifo_free(fifo_ptr); return; } module_init(yamanetoshi_init); module_exit(yamanetoshi_exit);
kfifo_test な関数に動作確認なコードを書いていく方向ッス。
とりあえず
な試験を書いてみました。関係するトコのみ。
static void kfifo_test(void) { printk("buffer is not NULL : %p\n", fifo_ptr->buffer); printk("size is not zero : %d\n", fifo_ptr->size); printk("in is zero : %d\n", fifo_ptr->in); printk("out is zero : %d\n", fifo_ptr->out); return; } static int yamanetoshi_init(void) { printk("initialize the fifo device\n"); spin_lock_init(&fifo_lock); fifo_ptr = kfifo_alloc(BUFSIZ, GFP_KERNEL, &fifo_lock); if(IS_ERR(fifo_ptr)) return -ENOMEM; kfifo_test(); return 0; }
どう書くか、は悩ましい。出力が以下です。
initialize the fifo device buffer is not NULL : cf79b180 size is not zero : 256 in is zero : 0 out is zero : 0 cleanup the fifo device
これ、リダイレクトとかできないのが微妙ですな。って messages に出てるのか。
現状な試験
って溢れた場合のナニがどーゆー挙動か、が見れれば良いのかな。先端と末端に跨ってる時の in とか out とかの値も見てみたい。