linux kernel源码之kobj_map
2021/9/22 7:13:21
本文主要是介绍linux kernel源码之kobj_map,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
源码
include/linux/kobj_map.h
drivers/base/map.c
主要提供了4个函数
1 kobj_map_init
2 kobj_map
3 kobj_lookup
4 kobj_unmap
chr_dev 、 block_dev 使用kobj_map 管理字符设备和块设备。
kobj_map的数据结构
kobj_map的基础数据结构是哈希表。
kobj_map结构体包含一个指针数组(指针是struct probe的指针)。数组长度为255 。 数组的每个元素是链表头。
初始化
kobj_map_init()初始化哈希表。
给每个链表设置一个节点,也就是一个probe结构体。设备号全都为1,range为0xffffffff。
还保存了get函数,工后续lookup时加载module使用。
map
kobj_map()函数的输入为设备号、range和客户数据指针。
首先计算“range”占用几个主设备号,然后给每个主设备号申请1个probe结构体(实际上一般不会有跨越多个主设备号的情况,但kobj_map支持那样做)。
将主设备号 %255 计算之后找到哈希链表。按range升序插入节点。
(为什么按升序排序,或者说为什么排序,我没有裂解)
probe结构体中包含了设备号和range。
lookup
kobj_lookup()函数的输入是设备号。
从设备号提取主设备号,%255计算之后就找到了哈希链表。根据输入的设备号结合probe结构体中保存的设备号和range找到匹配的probe结构体,从中提取“客户数据指针”、“lock函数”、“get函数”。
返回的是get函数得到的kobj。
unmap
输入的是设备号和range。 设备号和range必须完全一致。
遍历哈希表删掉map时添加的节点,释放内存。
这篇关于linux kernel源码之kobj_map的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-18git仓库有更新,jenkins 自动触发拉代码怎么配置的?-icode9专业技术文章分享
- 2024-12-18Jenkins webhook 方式怎么配置指定的分支?-icode9专业技术文章分享
- 2024-12-13Linux C++项目实战入门教程
- 2024-12-13Linux C++编程项目实战入门教程
- 2024-12-11Linux部署Scrapy教程:新手入门指南
- 2024-12-11怎么将在本地创建的 Maven 仓库迁移到 Linux 服务器上?-icode9专业技术文章分享
- 2024-12-10Linux常用命令
- 2024-12-06谁看谁服! Linux 创始人对于进程和线程的理解是…
- 2024-12-04操作系统教程:新手入门及初级技巧详解
- 2024-12-04操作系统入门:新手必学指南