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-06-0600-macOS和Linux安装和管理多个Python版本
- 2024-03-30[译]漫画SELinux概念
- 2024-03-29linux 移动文件
- 2024-03-28linux .so file
- 2024-03-28Linux 磁盘管理
- 2024-03-28Linux学习笔记(十三)磁盘管理(一):磁盘分区
- 2024-03-26linux 创建 文件
- 2024-03-25使用SecureCRT对Linux vim进行颜色设置
- 2024-03-202019-2020-12 20199317 《Linux内核原理与分析》 第十二周作业
- 2024-03-20Linux运维的第二周总结