Linux 设备驱动 ====> 字符驱动
Linux 设备驱动 ====> 字符驱动
开始从头学起linux 设备驱动,当然是先从字符驱动看起。
相关阅读:Linux 设备驱动 ====> 并发控制 --- 原子操作
下面仿照着书上的例子,写了一个misc 字符驱动。
- root@www.bkjia.com:/home/jay/globalmem# tree globalmem/
- globalmem/
- ├── globalmem.c
- └── Makefile
- KVERS = $(shell uname -r)
- obj-m += globalmem.o
- build: kernel_modules
- kernel_modules:
- make -C /lib/modules/$(KVERS)/build/ M=$(CURDIR) modules
- clean:
- make -C /lib/modules/$(KVERS)/build/ M=$(CURDIR) clean
- int globalmem_init(void)
- {
- int result;
- globalmem_devp = kmalloc(sizeof(struct globalmem_dev) ,GFP_KERNEL);
- if(!globalmem_devp) {
- result = -ENOMEM;
- goto fail_malloc;
- }
- memset(globalmem_devp, 0, sizeof(struct globalmem_dev));
- globalmem_devp->mdev = mdev_struct;
- result = misc_register(&(globalmem_devp->mdev));
- if(result<0)
- return result;
- else
- return 0;
- fail_malloc:
- return result;
- }
- globalmem_devp = kmalloc(sizeof(struct globalmem_dev) ,GFP_KERNEL);
- if(!globalmem_devp) {
- result = -ENOMEM;
- goto fail_malloc;
- }
- memset(globalmem_devp, 0, sizeof(struct globalmem_dev));
- struct globalmem_dev {
- struct miscdevice mdev;
- unsigned char mem[GLOBALMEM_SIZE];
- };
- struct globalmem_dev *globalmem_devp;
- struct miscdevice {
- int minor;
- const char *name;
- const struct file_operations *fops;
- struct list_head list;
- struct device *parent;
- struct device *this_device;
- };
内存分配结束之后是调用misc_register来注册我们的misc驱动,使用misc字符驱动相对于标准的字符驱动写起来简单。
然后是exit函数,跟init相反:
- void globalmem_exit(void)
- {
- misc_deregister(&(globalmem_devp->mdev));
- if(globalmem_devp)
- kfree(globalmem_devp);
- }
- module_init(globalmem_init);
- module_exit(globalmem_exit);
然后使我们的miscdevice和fops结构体
- static const struct file_operations globalmem_fops = {
- .owner = THIS_MODULE,
- .open = globalmem_open,
- .release = globalmem_release,
- .unlocked_ioctl = globalmem_ioctl,
- .read = globalmem_read,
- .write = globalmem_write,
- };
- static struct miscdevice mdev_struct = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = "globalmem",
- .fops = &globalmem_fops,
- };
|
评论暂时关闭