|
是针对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的错误提示 |
|