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 とかの値も見てみたい。