导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发表看法:[gzxyd]Linux字符设备驱动程序工作机理分析



No.110090
作者:gzxyd
邮件:2966383766@qq.com
ID:132941
登陆:4次
文章数:14篇
最后登陆IP:119.130.98.213
最后登陆:2015/10/4 17:55:29
注册:2015/7/9 14:32:34
财富:176
发帖时间:2015/7/16 11:18:31
发贴者IP:119.130.97.223
标题:gzxyd:Linux字符设备驱动程序工作机理分析
摘要:No.110090Linux字符设备驱动程序工作机理分析 Linux字符设备驱动程序工作机理分析
1 本文主题
    本文主要分析Linux字符设备驱动程序的工作机理。主要内容以及代码片段来源于《LDD3》,俺只是从另外一个角度来讲述。
    见过很多关于驱动程序的书,基本上都是告诉你怎么做,然后你STEP BY STEP,然后运行完后结果就出来了,可是其背后到底是如何工作的呢?虽说《LDD3》也讲了很多原理性的东西,但是我觉得这个问题其描述得并不明确。

2 关于scull
    scull是《LDD3》的一个字符设备驱动程序,其加载之后会在文件系统下生成/dev/scull文件,在shell下可以对其进行一系列的操作,例如可以使用cp、dd或者输入输出重定向等命令来访问这个文件,也就是访问这个字符设备。

3 /dev/scull是如何生成的
    该文件是在驱动程序模块加载时生成的,具体实现是在scull_load(可以,或者《LDD3_中文》的P51)这个脚本里。
    在shell下insmod了scull.ko之后,系统会在/proc/devices文件里生成设备名以及与之对应的主设备号信息,scull_load脚本根据该信息mknod了/dev/scull文件节点。
    注意下mknod时给的参数信息,其中注明了主设备号以及次设备号信息。

4 shell下操作/dev/scull是如何关联到我们自己编写的scull模块的
    这个问题一直困扰了我很久,不过现在我基本上算是弄明白了。

4.1 先回顾下scull模块程序的初始化操作里做了什么事情。
    
    搞驱动的都知道,初始化的时候需要进行设备注册,核心代码如下:
    static void scull_setup_cdev(struct scull_dev *dev, int index)
    {
        int err, devno = MKDEV(scull_major, scull_minor + index);

        cdev_init(&dev->  cdev, &scull_fops);
        dev->  cdev.owner = THIS_MODULE;
        dev->  cdev.ops = &scull_fops;
        err = cdev_add(&dev->  cdev, devno, 1);
        ...
    }
    
    scull_fops是一个数组,其中保存了我们的scull实际的操作:
    struct file_operation scull_fops = {
        ...
        .open = scull_open,
        .read = scull_read,
        .write = scull_write,
        .release = scull_release,
        ...
    }
    
    cdev是struct cdev类型(该类型由系统定义)的变量,其嵌入在struct scull_dev(该类型由scull模块定义)中:
    struct scull_dev{
        ...
        struct cdev cdev;
        ...
    }
    
    从这句代码
    cdev_add(&dev->  cdev, devno, 1);
    我们可以发现,设备号devno已经和内核内部结构cdev关联起来了。

4.2 /dev/scull设备的打开操作

    /dev/scull是文件系统中的一个设备文件,其在内核中由sturct inode结构表示。
    
    一般说来,inode结构下由两个元素和驱动程序有关:
    dev_t i_rdev;                 这个是设备号
    struct c ......

>>返回讨论的主题



  发表回复
用户名   *您没有注册?
密码   *
验证码   * .
标题   *
心情
随便说说    我回答你    最新发现    得意的笑   
气死我了    真是没劲    坚决同意    表示反对   
大家过来    好奇怪哟    懒得理它    大家小心   
文件上传
内容


字体:      字体大小:    颜色:
粗体 斜体 下划线 居中 超级连接 Email连接 图片 Flash图片 Shockwave文件 realplay视频文件 Media Player视频文件 QuickTime视频文件 引用 飞行字 移动字 发光字 阴影字 查看更多的心情图标 背景音乐
点击加入表情
                         
选项
有回复时用短消息通知您?

   




老古网执行:31毫秒 最大:12203毫秒 查询8次