字符设备驱动(第一篇)

字符设备驱动:

应用程序APP的open、write等函数通过c库来实现,c库通过swi val 来触发中断,通过val值来判断是读?是写?来调用sys_open、sys_write等,至于说是调用哪个底层的驱动。
写好一个驱动device_open、device_write,通过file_operations来告诉内核有此驱动。所以,也可以简单的理解为写驱动就是填充file_operations的结构体,然后把此结构体告诉内核,此事是通过register_cdev来注册。文字说明很枯燥,用下面的例子来说明:
static int first_drv_open(struct inode *inode,struct file *file)
{
return 0;
}


static ssize_t first_drv_write(struct file *file,const char __user *buf,size_t count,loff_t *ppos)
{
return 0;
}
static struct file_operations first_drv_fops={
.owner = THIS_MODULE,
.open = first_drv_open,
.write = first_drv_write,
}
int first_drv_init(void)
{
register_chrdev (major,"first_dev",&first_drv_fops);
return 0;
}
void first_drv_exit()
{
unregister_chrdev(major,"first_drv")
}
 module_init(first_drv_init)
 module_exit(first_drv_exit)
 
 可以理解成在内核里有一个数组大小为256(主设备号的范围是0~255),注册就是把file_operation的内容填充到相应的数组中。
 当应用程序调用时,可以根据设备号去调用相应file_operation的内容。
 卸载就是把注册的设备号从数组中拖出。


你可能感兴趣的:(c,struct,File,Module,user)