Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1286044
  • 博文数量: 168
  • 博客积分: 3483
  • 博客等级: 中校
  • 技术积分: 1696
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-06 13:17
文章分类

全部博文(168)

文章存档

2015年(6)

2014年(9)

2013年(47)

2012年(11)

2011年(13)

2010年(18)

2009年(11)

2008年(42)

2007年(11)

分类: LINUX

2008-03-30 21:46:59

[转]内核的用户态驱动程序议论

目前,kenrel maillist在讨论一个user space driver的patch .这个patch的目的是减少写驱动程序时候的内核代码,在用户态实现驱动的功能代码。但是,该机制并没有使驱动程序的内核代码完全消息。一个驱动程序还是需要在内核注册一个小的module来进行,pci注册, irq handler注册。

struct uio_info {
    char *name;
    char *version;
    struct uio_mem mem[MAX_UIO_MAPS];
    long irq;
    unsigned long irq_flags;
    void *priv;
    irqreturn_t (*handler)(int irq, struct uio_info *dev_info);
    int (*mmap)(struct uio_info *info, struct vm_area_struct *vma);
    int (*open)(struct uio_info *info, struct inode *inode);
    int (*release)(struct uio_info *info, struct inode *inode);
    /* Internal stuff omitted */
};

name: 设备名称
version: 驱动版本
irq 中断号
irq_flags 中断一些标志信息
open , release分别为文件的对应操作函数
handler 为终端操作函数

struct uio_mem {
    unsigned long addr;
    unsigned long size;
    int memtype;
    void __iomem *internal_addr;
    /* ...... */
};

uio_info 的mmap函数将uio_mem 对应的内核,或者设备的内存信息映射到用户态内存空间。这样,内核和用户态就能够进行数据交互。

以上结构是一个驱动程序的信息, 使用者需要使用如下函数注册/注销。(如果是pci设备,还需要自行注册pci设备).
int uio_register_device(struct device *parent, struct uio_info *info);
void uio_unregister_device(struct uio_info *info);

目前这个patch还处于讨论阶段,并且这种设备只是一个字符设备,还不能作为块设备,网络设备的驱动程序。但是Andrew Morton提到把驱动程序放到用户态这个方法对gpl来说并不是一个非常好的办法,应该鼓励内核的开源代码,而不是用户态的闭源代码。目前,该方案还处于讨论中。

阅读(1134) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~