lengfeng281 发表于 2006-7-15 21:59:01

2.4核驱动程序的问题

是针对8255驱动程序的,建立设备文件的疑问,初始化是这样写的。
static int __init s_init_module(void)
{
int ret;



//注册模块;
if ((ret=devfs_register_chrdev(major,s_name,&Tmint_fops_ADDR)) < 0)
   {
   printk("\r\n<1>82C55 Register Fail!\r\n");
   return ret;
   }

//动态分配主设备号;
if(major == 0)
   major = ret;

//建立设备文件;
devfs_handle = devfs_register(NULL, "8255",DEVFS_FL_DEFAULT,
   major, 0, S_IFCHR | S_IRUSR | S_IWUSR,&Tmint_fops_ADDR, NULL);

ADDR_mem();
//printk("init IO_ADDR module is ok!\n");
return 0;
}
我将驱动模块动态添加进内核,insmod /lib/modules/8255.o



lsmod 查看到了8255
我查看了/proc/devices 里面显示了8255
又看了一下/dev/中,也存在8255 ,这里的8255应该是insmod命令建立的
问题是在/proc/devices中的8255,一般是通过devfs_mk_dir()建立,但我在驱动程序中并没有找到这样的函数,而且添加模块的时候也没有用到mknod命令,那这里的8255是从哪里来的?是devfs_register 建立的吗?但devfs_handle_t devfs_register函数是个空函数啊?
static inline devfs_handle_t devfs_register (devfs_handle_t dir,
          const char *name,
          unsigned int flags,
          unsigned int major,
          unsigned int minor,
          umode_t mode,
          void *ops, void *info)
{
    return NULL;
}



然后我用rmmod 8255命令删除模块的时候,lsmod发现8255没有了,/proc/devices中也没有了8255,而/dev中的8255仍然存在,会不会影响到下次的加载使用?



static void __exit s_cleanup_module(void)
{
   int retv;

   //注销模块;
retv=devfs_unregister_chrdev(major,s_name);

   //取消内存区域映射;
iounmap(IO_Addr);

//释放申请的内存区域;
release_mem_region(ADDR_sys_offset,ADDR_Size);
if(retv<0)
   {
      printk("<1>IO_ADDR UnRegister Fail!\n");
      return ;
   }
printk("<1>IO_ADDR:Good Bye!\n");
}


我rmmod 8255后再次加载的时候,出现了can not find parent, error 17的错误提示
页: [1]
查看完整版本: 2.4核驱动程序的问题