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时添加的节点,释放内存。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值