免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3517 | 回复: 4
打印 上一主题 下一主题

[内核模块] mknod后无法打开设备文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-02-12 21:32 |只看该作者 |倒序浏览
写了一个简单的字符设备驱动,和app测试,insmod没问题,mknod后执行app的程序打开设备文件报错
open:No such device or address

代码如下
驱动模块代码:
  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/cdev.h>
  4. #include <linux/fs.h>
  5. #include <linux/kernel.h>

  6. int major = 60;
  7. int minor = 3;
  8. int cnt = 6;
  9. dev_t        devnum;
  10. char name[] = "mill_li";
  11. struct cdev        mdev;

  12. static int mill_open(struct inode *inodp, struct file *flip)
  13. {
  14.         printk("Kernel: %s:%d\n", __func__, __LINE__);
  15.         printk("inode ********* major: %d ***********\n", imajor(inodp));
  16.         printk("inode ********* minor: %d ***********\n", iminor(inodp));

  17.         return 0;
  18. }

  19. struct file_operations fops = {
  20.         .owner = THIS_MODULE,
  21.         .open = mill_open,
  22. };

  23. static int __init hello_entry(void)
  24. {
  25.         int ret;

  26.         printk(KERN_ALERT "Hello, world\n");

  27.         if(major){
  28.                 devnum = MKDEV(major, minor);
  29.                 ret = register_chrdev_region(devnum, cnt, name);
  30.         }
  31.         else{
  32.                 ret = alloc_chrdev_region(&devnum, minor, cnt, name);
  33.                 major = MAJOR(devnum);
  34.         }

  35.         if(ret < 0)
  36.                 return ret;

  37.         cdev_init(&mdev, &fops);
  38.         mdev.owner = THIS_MODULE;

  39.         cdev_add(&mdev, devnum, cnt);

  40.         return 0;
  41. }

  42. static void __exit hello_exit(void)
  43. {
  44.         printk(KERN_ALERT "Goodbye, cruel world\n");

  45.         unregister_chrdev_region(devnum, cnt);
  46.         cdev_del(&mdev);
  47. }

  48. module_init(hello_entry);
  49. module_exit(hello_exit);

  50. MODULE_LICENSE("GPL");
复制代码
app代码:
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <errno.h>

  6. int main(int argc, char *argv[])
  7. {
  8.         int fd;

  9.         printf("In app\n");

  10.         if(argc != 2){
  11.                 fprintf(stderr, "Usage: %s devfile\n", argv[0]);
  12.                 return -1;
  13.         }

  14.         fd = open(argv[1], O_RDONLY | O_NONBLOCK);
  15.         //if(fd < 0){
  16.         //        perror("open");
  17.         //        return errno;
  18.         //}

  19.         if(close(fd) < 0){
  20.                 perror("close");
  21.                 return errno;
  22.         }

  23.         return 0;
  24. }
复制代码
求大神解答是什么原因?

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
2 [报告]
发表于 2015-02-13 09:05 |只看该作者
回复 1# mill_li


   cat /proc/devices 出来看看。

论坛徽章:
0
3 [报告]
发表于 2015-02-13 09:20 |只看该作者
本帖最后由 mill_li 于 2015-02-13 09:21 编辑

回复 2# Tinnal

现在在公司,但是之前cat是注册成功的,设备号也对应的是60,我mknod是  mknod milltest c 60 1 这样对不?


   

论坛徽章:
2
天蝎座
日期:2014-07-23 21:17:122015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2015-02-13 09:53 |只看该作者
本帖最后由 polejo 于 2015-02-13 09:55 编辑

mknod milltest c 60 1
mknod的man,第四个参数应该是minor。你既然已经在内核设死了MAJOR 和 MINOR,这里也要对上吧

不过这个参数我没用过,都是不管minor的,直接0

论坛徽章:
0
5 [报告]
发表于 2015-02-13 10:08 |只看该作者
回复 4# polejo

额额额,我把cnt和minor给搞反了,以为6个里面随便一个都行,谢啦


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP