キャラクタデバイスドライバのreadについての実験
これまで、キャラクタデバイスドライバのwrite(デバイスファイルに対して書き込みを行うタイプのもの)しか試していませんでした。
今更ですが、readについて、デバイスファイルを読み出すと「Hello」を返すものを作成しました。「copy_to_user()」の使い方の備忘録などの為にメモしておきます。
作成したファイル
chardevtest.c
#include <linux/init.h> #include <linux/module.h> #include <linux/ioport.h> #include <linux/io.h> #include <linux/uaccess.h> #include <linux/fs.h> #include <linux/cdev.h> #define CHARDEVTEST_MAJOR 244 #define CHARDEVTEST_MINORS 1 #define CHARDEVTEST_NAME "shminchardevtest" static struct cdev chardevtestdev; static int chardevtest_open(struct inode *inode, struct file *file) { return 0; } static int chardevtest_release(struct inode *inode, struct file *file) { return 0; } static ssize_t chardevtest_read(struct file *file, char *buf, size_t count, loff_t *offset) { copy_to_user(buf, "Hello", 6); *offset += 6; return 6; } struct file_operations chardevtest_fops = { .owner = THIS_MODULE, .open = chardevtest_open, .read = chardevtest_read, .release = chardevtest_release, }; static int __init chardevtest_init(void) { dev_t dev = MKDEV(CHARDEVTEST_MAJOR, 0); int ret; cdev_init(&chardevtestdev, &chardevtest_fops); ret = cdev_add(&chardevtestdev, dev, CHARDEVTEST_MINORS); if (ret){ printk(KERN_WARNING "shminchardevtest: device add faichardevtest.\n"); goto err0; } return 0; err0: unregister_chrdev_region(dev, CHARDEVTEST_MINORS); return ret; } static void __exit chardevtest_exit(void) { dev_t dev = MKDEV(CHARDEVTEST_MAJOR, 0); cdev_del(&chardevtestdev); unregister_chrdev_region(dev, CHARDEVTEST_MINORS); } module_init(chardevtest_init); module_exit(chardevtest_exit); MODULE_LICENSE("GPL");
Makefile
KERNELDIR ?= ../linux-2.6.39.4 PWD := $(shell pwd) obj-m := chardevtest.o all: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: $(MAKE) -C $(KERNELDIR) M=$(PWD) clean