免费注册 查看新帖 |

Chinaunix

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

悲剧了...卸载模块之后/proc/devices下创建的入口还存在... [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-20 17:14 |只看该作者 |倒序浏览
小弟正在学习设备驱动程序...  不料... 把加载模块和卸载模块的部分写了一下.. 然后编译成模块... 想试试写的是否正确.. 然后在逐渐添加方法...结果...
   insmod module.ko之后在/proc/module下能发现加载的模块. 在/proc/devices下也能发现device name。这表示正确的加载并且初始化了...
   可是rmmod能够把模块卸载... 但是/proc/devices/device_name仍然存在...  不晓得为什么... 求解...

  1. #include <linux/module.h>
  2. #include <linux/moduleparam.h>
  3. #include <linux/init.h>
  4. #include <linux/fcntl.h>
  5. #include <linux/types.h>
  6. #include <linux/fs.h>
  7. #include <linux/blkdev.h>
  8. #include <linux/spinlock.h>
  9. #include <linux/kernel.h>
  10. #include <linux/slab.h>
  11. #include <linux/vmalloc.h>
  12. #include <linux/errno.h>

  13. struct ram_device {
  14.         unsigned long size;
  15.         char *data;
  16.         short usage;
  17.         short midea_changed;
  18.         spinlock_t lock;
  19.         struct request_queue *queue;
  20.         struct gendisk *disk;
  21. };

  22. #define DEF_RAM_SIZE 4096000UL
  23. #define DEF_RAM_MAJOR 0
  24. #define DEF_RAM_MINOR 4
  25. #define DEF_RAM_HARDSECTOR 512UL
  26. #define KERNEL_HARDSECTOR 512UL
  27. #define DEVICE_NAME "ram_block_device"

  28. static unsigned long ram_size = DEF_RAM_SIZE;
  29. static int ram_major = DEF_RAM_MAJOR;
  30. static int ram_minor = DEF_RAM_MINOR;
  31. static unsigned long ram_hardsector = DEF_RAM_HARDSECTOR;
  32. //module_param(ram_size, unsigned long, DEF_RAM_SIZE);
  33. //module_param(ram_major, int, DEF_RAM_MAJOR);
  34. //module_param(ram_minor, int, DEF_RAM_MINOR);
  35. //module_param(ram_hardsector, unsigned long, DEF_RAM_HARDSECTOR);
  36. static struct ram_device *ram_dev;

  37. static void ram_trans(struct ram_device *dev, unsigned long start_sector, unsigned long nr_sector, char *buffer, int rw)
  38. {
  39.         unsigned long offset = start_sector * KERNEL_HARDSECTOR;
  40.         unsigned long nbytes = nr_sector * KERNEL_HARDSECTOR;
  41.         char *start = dev->data + offset;
  42.         if((offset + nbytes) > dev->size) {
  43.                 printk(KERN_NOTICE "over bound : offset %ld, nbytes %ld\n", offset, nbytes);
  44.                 return;
  45.         }
  46.         if(rw)
  47.                 memcpy(start, buffer, nbytes);
  48.         else
  49.                 memcpy(buffer, start, nbytes);
  50. }

  51. static void ram_request(request_queue_t *q)
  52. {
  53.         struct request *req;
  54.         while(!(req = elv_next_request(q))) {
  55.                 struct ram_device *dev = req->rq_disk->private_data;
  56.                 if(!blk_fs_request(req)) {
  57.                         end_request(req, 0);
  58.                         continue;
  59.                 }
  60.                 ram_trans(dev, req->sector, req->current_nr_sectors, req->buffer, rq_data_dir(req));
  61.                 end_request(req, 1);
  62.         }
  63. }


  64. static int ram_device_init(void)
  65. {
  66.         int retval = -EBUSY;
  67.         ram_major = register_blkdev(ram_major, DEVICE_NAME);
  68.         if(ram_major < 0)
  69.                 goto out;
  70.         retval = -ENOMEM;
  71.         ram_dev = kmalloc(sizeof(struct ram_device), GFP_KERNEL);
  72.         if(!ram_dev)
  73.                 goto unregister;
  74.         memset(ram_dev, 0, sizeof(struct ram_device));
  75.         ram_dev->size = ram_size;
  76.         ram_size &= (~4095);
  77.         if(!ram_size)
  78.                 goto unregister;
  79.         ram_dev->data = vmalloc(ram_size);
  80.         if(!ram_dev->data)
  81.                 goto unregister;
  82.         spin_lock_init(&ram_dev->lock);
  83.        
  84. /* initialize request queue and bind request function */
  85.         ram_dev->queue = blk_init_queue(ram_request, &ram_dev->lock);
  86.         if(!ram_dev->queue)
  87.                 goto free;
  88.         ram_dev->queue->queuedata = ram_dev;
  89.         blk_queue_hardsect_size(ram_dev->queue, ram_hardsector);
  90. /* allocate a gendisk struct and initialize some fields that we're interested in */
  91.         ram_dev->disk = alloc_disk(ram_minor);
  92.         if(!ram_dev->disk)
  93.                 goto free;
  94.         ram_dev->disk->major = ram_major;
  95.         ram_dev->disk->first_minor = 0;
  96. //        ram_dev->disk->fops = &ram_ops;
  97.         ram_dev->disk->queue = ram_dev->queue;
  98.         ram_dev->disk->private_data = ram_dev;
  99.         sprintf(ram_dev->disk->disk_name, DEVICE_NAME);
  100.         set_capacity(ram_dev->disk, (ram_size / KERNEL_HARDSECTOR));
  101. /* register it*/
  102.         add_disk(ram_dev->disk);
  103.         return 0;
  104. free:
  105.                 vfree(ram_dev->data);
  106. unregister:
  107.         unregister_blkdev(ram_major, DEVICE_NAME);
  108. out:
  109.         return retval;
  110. }

  111. static void ram_device_exit(void)
  112. {
  113.         if(ram_dev && ram_dev->disk) {
  114.                 del_gendisk(ram_dev->disk);
  115.                 put_disk(ram_dev->disk);
  116.         }
  117.         if(ram_dev->queue)
  118.                 blk_cleanup_queue(ram_dev->queue);
  119.         if(ram_dev->data)
  120.                 vfree(ram_dev->data);
  121.         kfree(ram_dev);
  122.         unregister_blkdev(ram_major, DEVICE_NAME);
  123. }

  124. module_init(ram_device_init);
  125. module_exit(ram_device_exit);

  126. MODULE_AUTHOR("liangtao");
  127. MODULE_LICENSE("Dual BSD/GPL");

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP