| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 字符设备的注册(cdev_int()与cdev_add()) -> 正文阅读 |
|
[数据结构与算法]字符设备的注册(cdev_int()与cdev_add()) |
1.cdev_init()。初始化cdev对象的一些成员
首先把传进来的cdev对象所占的内存清零 然后初始化cdev->list_head链表 接着把cdev->kobj也初始化,调用的kobject_init注释如下:
其中的ktype_cdev_default就是kobject_init函数的第二个参数,ktype_cdev_default的定义如下:
kobj_type类型中的release()是在kobject释放时调用的,但是看了cdev_default_release的实现,发现并没有释放这个kobject,因为cdev不是动态创建的,注意看cdev_alloc,它在调用kobject_init的时候,kobj_type成员就变成了ktype_cdev_dynamic,它里面的release函数就释放了这个cdev对象。 接下来看cdev_default_release做了什么:
首先获得了该kobj所在的cdev对象,然后获得了这个kobj的父对象。接着调用cdev_purge(p),这个cdev_purge()做了什么呢?
首先是上锁,然后一个while循环,循环的条件是cdev里面的list_head链表非空,循环体内,首先获得链表的下一个成员所在的inode对象,然后利用inode->i_devices(struct list_head类型),将该节点从所在的链表删除,最后把该inode的i_cdev赋空。这个while循环是将挂载在cdev的list_head链表的所有成员删除。 回到cdev_default_release,接下来调用了kobject_put(parent),这一操作是将该kobj的父对象的kref减一,如果kref==0,调用parent的kobj_type成员中的release函数将parent删除。 2.cdev_add() ?????? cdev_add函数主要是将cdev加入到cdev_map中,然后将cdev的kobject成员的parent对象的kref成员加1(有点绕),具体函数实现如下:
该函数首先用设备号dev和count给p的成员赋值,接着调用kobj_map,函数实现如下:
首先是kobj_map成员,内核定义了一个kobj_map类型的对象cdev_map。kobj_map的定义如下:
probes也是一个哈希表,实现原理和设备号的哈希表chrdevs几乎完全一样。下面看具体实现。 ?????? 首先计算主设备号个数,和register_chrdev_region中一样,防止range过大,分配的主设备号不止一个。然后定义一个index等于主设备号,申明一个struct probe类型的指针,调用kmalloc_array为p分配内存,如果p还为空,返回错误代码,接下来用传入的参数为p的成员初始化。接着调用cdev_map中的互斥锁上锁,接下来把p插入哈希表probes中,插入规则还是range小的在前。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 17:49:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |