zoukankan      html  css  js  c++  java
  • linux 字符设备注册

    如我们提过的, 内核在内部使用类型 struct cdev 的结构来代表字符设备. 在内核调用你 的设备操作前, 你编写分配并注册一个或几个这些结构. [11] 11为此, 你的代码应当包含

    <linux/cdev.h>, 这个结构和它的关联帮助函数定义在这里.

    有 2 种方法来分配和初始化一个这些结构. 如果你想在运行时获得一个独立的 cdev 结构, 你可以为此使用这样的代码:

    struct cdev *my_cdev = cdev_alloc(); my_cdev->ops = &my_fops;

    但是, 偶尔你会想将 cdev 结构嵌入一个你自己的设备特定的结构; scull 这样做了. 在 这种情况下, 你应当初始化你已经分配的结构,

    有一个早些的机制以避免使用 cdev 结构(我们在"老方法"一节中讨论).但是, 新代码应当使用新技术.

    void cdev_init(struct cdev *cdev, struct file_operations *fops);

    任一方法, 有一个其他的 struct cdev 成员你需要初始化. 象 file_operations 结构, struct cdev 有一个拥有者成员, 应当设置为 THIS_MODULE. 一旦 cdev 结构建立, 最后 的步骤是把它告诉内核, 调用:

    int cdev_add(struct cdev *dev, dev_t num, unsigned int count);

    这里, dev 是 cdev 结构, num 是这个设备响应的第一个设备号, count 是应当关联到设 备的设备号的数目. 常常 count 是 1, 但是有多个设备号对应于一个特定的设备的情形. 例如, 设想 SCSI 磁带驱动, 它允许用户空间来选择操作模式(例如密度), 通过安排多个 次编号给每一个物理设备.

    在使用 cdev_add 是有几个重要事情要记住. 第一个是这个调用可能失败. 如果它返回一 个负的错误码, 你的设备没有增加到系统中. 它几乎会一直成功, 但是, 并且带起了其他 的点: cdev_add 一返回, 你的设备就是"活的"并且内核可以调用它的操作. 除非你的驱动 完全准备好处理设备上的操作, 你不应当调用 cdev_add.

    为从系统去除一个字符设备, 调用: void cdev_del(struct cdev *dev);

    显然, 你不应当在传递给 cdev_del 后存取 cdev 结构.

  • 相关阅读:
    tshark的命令使用
    svn log查看自己提交的记录
    账号安全 syyh
    Trivy 容器镜像扫描工具学习 syyh
    《关键对话》脑图整理 syyh
    Grafana 任意文件读取漏洞 (CVE202143798)学习 syyh
    容器安全管理 syyh
    【Sass/SCSS】我花4小时整理了的Sass的函数
    【JavaScript使用技巧】三个截取字符串中的子串,你用的哪个
    【SVG】为了前端页面的美丽,我选择学习SVG
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11138629.html
Copyright © 2011-2022 走看看