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结构体包含一个指针数组(指针是struct probe的指针)。数组长度为255 。 数组的每个元素是链表头。
kobj_map_init()初始化哈希表。
给每个链表设置一个节点,也就是一个probe结构体。设备号全都为1,range为0xffffffff。
还保存了get函数,工后续lookup时加载module使用。
kobj_map()函数的输入为设备号、range和客户数据指针。
首先计算“range”占用几个主设备号,然后给每个主设备号申请1个probe结构体(实际上一般不会有跨越多个主设备号的情况,但kobj_map支持那样做)。
将主设备号 %255 计算之后找到哈希链表。按range升序插入节点。
(为什么按升序排序,或者说为什么排序,我没有裂解)
probe结构体中包含了设备号和range。
kobj_lookup()函数的输入是设备号。
从设备号提取主设备号,%255计算之后就找到了哈希链表。根据输入的设备号结合probe结构体中保存的设备号和range找到匹配的probe结构体,从中提取“客户数据指针”、“lock函数”、“get函数”。
返回的是get函数得到的kobj。
输入的是设备号和range。 设备号和range必须完全一致。
遍历哈希表删掉map时添加的节点,释放内存。