Linux教程

linux kernel源码之kobj_map

本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!