标签:内核
本文由xhz1234(徐洪志)编写,转载请注明出处。
http://blog.csdn.net/xhz1234/article/details/38750091
上一篇博文中,创建了一个字符设备驱动,如何用户程序要使用该驱动提供的功能,必须要手动创建一个字符设备文件节点。那有没有办法在insmod设备驱动模块时,自动创建对应的设备文件节点呢?答案是肯定的,其中一种方法是使用一种特殊的字符设备--杂项设备。
原理:杂项设备的misc_init函数中,创建了一个misc class,同时注册了一个字符设备驱动,该字符设备的主设备号为10,在调用misc_register函数去注册一个杂项设备时,最终会创建一个设备节点,如果杂项设备的minor为MISC_DYNAMIC_MINOR,表示由系统分配一个次设备号。所以杂项设备最终还是主设备号为10的一个字符设备驱动。
好了,我们看看示例代码:
杂项设备驱动程序:misc_dev.c
#include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/miscdevice.h> #define DEVICE_NAME "my_misc_dev" static int misc_open(struct inode *nd, struct file *filp) { int major = MAJOR(nd->i_rdev); int minor = MINOR(nd->i_rdev); printk("misc_open,major=%d,minor=%d\n",major,minor); return 0; } static ssize_t misc_read(struct file *f, char __user *u, size_t sz, loff_t *off) { printk("In the misc_read() function!\n"); return 0; } struct file_operations misc_ops = { .owner = THIS_MODULE, .open = misc_open, .read = misc_read, }; struct miscdevice misc = { .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &misc_ops, }; static int demo_init(void) { int ret; ret = misc_register(&misc); printk(DEVICE_NAME "\t initialized %s!\n", (0==ret)?"successed":"failed"); return ret; } static void demo_exit(void) { misc_deregister(&misc); printk("Removing misc_dev...!\n"); } module_init(demo_init); module_exit(demo_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Huoxin"); MODULE_DESCRIPTION("An misc device driver as an example");
#include <stdio.h> #include <fcntl.h> #include <unistd.h> #define MISC_DEV_NAME "/dev/my_misc_dev" int main(void) { int ret; char buf[32]; int fd = open(MISC_DEV_NAME, O_RDONLY|O_NDELAY); if(fd < 0) { printf("open file %s failed\n", MISC_DEV_NAME); return -1; } read(fd, buf, 32); close(fd); return 0; }
执行用户态程序对应的bin程序,dmesg得到如下打印:
Aug 22 08:00:27 xhz-Rev-1-0 kernel: [ 2286.814994] misc_open,major=10,minor=55
Aug 22 08:00:27 xhz-Rev-1-0 kernel: [ 2286.815002] In the misc_read() function!
程序源代码下载地址: http://huoxin.github.io/miscdevice
标签:内核
原文地址:http://blog.csdn.net/xhz1234/article/details/38750091