zoukankan      html  css  js  c++  java
  • Linux字符设备驱动框架

    ++++++++++++++++++++++++++++++++++++++++++

    本文系本站原创,欢迎转载! 转载请注明出处:

    http://blog.csdn.net/mr_raptor/article/details/6269507

    ++++++++++++++++++++++++++++++++++++++++++

     

    一、设备注册(fs/char_dev.c

    register_chrdev_region   ->  

    __register_chrdev_region  ->  

    主要任务:

    struct char_device_struct类型的全局变量chrdevs[255]中倒着找到第一个可用的char_device_struct结构,将设备号和设备名等相关信息填充进去。 

     

    二、设备结构分配(fs/char_dev.c

    cdev_alloc  ->  通过struct cdev *p = kzalloc() 实现cdev结构的分配

     

    cdev_init   ->  cdev->ops = fops;

     

    cdev_add   ->

    cdev_add里,调用了kobj_map()这个设备模块映射函数,将dev_t设备号加入到了kobj_map结构体里。其实就是将设备号(最大为255)放入到了一个排好序的数组里,如下代码中的

    三、设备驱动的打开

    当字符设备文件通过open系统调用打开时,VFS会调用chrdev_open

    int chrdev_open(struct inode * inode, struct file * filp)

    chrdev_open主要完成以下工作:

    1.         利用传递过来的inode结构里的i_rdev设备号,通过kobj_lookup找到当前设备对应的kobj对象

    drivers/base/map.c

    2.         通过container_of找到kobj所在的cdev结构(注册字符设备时分配上面第二步)

    3.         cdev结构中的ops(操作函数指针)赋值给file结构(传递回去让用户空间访问)。

    4.         调用ops中的open(注册字符驱动时的open操作函数),实现对驱动的open访问。

     

            

    ++++++++++++++++++++++++++++++++++++++++++

    本文系本站原创,欢迎转载! 转载请注明出处:

    http://blog.csdn.net/mr_raptor/article/details/6269507

    ++++++++++++++++++++++++++++++++++++++++++

  • 相关阅读:
    用C语言编写生成小学四则运算程序
    每周学习报告
    读现代软件工程有感和自我介绍
    第七天
    第五天
    第六天
    作业九:课程总结
    作业四:结对编程项目--四则运算
    psp记录个人项目花费时间
    作业三:代码规范,代码复查
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2458073.html
Copyright © 2011-2022 走看看