内核数据结构之映射

原创 2012年03月30日 23:56:40

映射也称之为关联数组,它是一组唯一键的集合,每个键与特定的值相关。一般支持至少三个操作:

  • Add(key,value)

  • Remove(key)

  • value=Lookup(key)

Linux提供了一个简单而有效的映射数据结构,它不是通用目的的映射,而是为特殊用例设计的:将UID(唯一标识号)映射到一个指针。除了提供三个主要的映射操作,还基于add操作的基础上提供了一个allocate操作。allocate操作不仅将添加一个UID/值对到映射中,还产生了一个UID

idr数据结构用于映射用户空间的UID,例如inotify监视描述符到它们相关的内核数据结构中,如inotify_watch

初始化idr

先静态定义或动态定义一个idr结构,然后调用idr_init():

void idr_init(struct idr *idp);

如:

struct idr id_huh; /* statically define idr structure */

idr_init(&id_huh);/* initialize provided idr structure */


分配一个新的UID

分两步进行,第一步告诉idr需要分配一个新的UID,使得它能在必要时重置后备树的大小,对应的函数为:

int idr_pre_get(struct idr *idp, gfp_t gfp_mask);

第二步,请求新的UID,相应的函数为:

int idr_get_new(struct idr *idp, void *ptr, int *id);


例子如下:

intid;

do{

if(!idr_pre_get(&idr_huh, GFP_KERNEL))

return-ENOSPC;

ret= idr_get_new(&idr_huh, ptr, &id);

}while (ret == -EAGAIN);

int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int*id);

该函数的工作方式与idr_get_new()一样,不过它保证了新的UID大于或等于starting_id。它确保某个UID不被重用,并且保证了分析的UID在系统运行期间都是唯一的。

intid;

do{

if(!idr_pre_get(&idr_huh, GFP_KERNEL))

return-ENOSPC;

ret= idr_get_new_above(&idr_huh, ptr, next_id, &id);

}while (ret == -EAGAIN);

if(!ret)

next_id = id + 1;

查找一个UID

void*idr_find(struct idr *idp, int id);

structmy_struct *ptr = idr_find(&idr_huh, id);

if(!ptr)

return-EINVAL; /* error */


删除一个UID

void idr_remove(struct idr *idp, int id);


销毁一个udr

void idr_destroy(struct idr *idp);

如果想强制删除所有的UID,使用如下函数:

void idr_remove_all(struct idr *idp);

不过在调用idr_destroy()之前,要先在该idr上调用idr_remove_all(),确保所有的idr内存被释放。



《Linux内核设计与实现》——内部数据结构

一、链表  1、链表
  • Explorer_day
  • Explorer_day
  • 2014年11月10日 15:59
  • 929

linux内核中常用的数据结构和操作详解

目前在学习研究linux系统,作为一名初学者,感觉很吃力,通过网友指点和自己琢磨,总结出,首先理解linux关键数据结构,对理解linux系统大有裨益,故总结下文——详述相关关键数据结构。   ...
  • u010245383
  • u010245383
  • 2014年06月06日 20:56
  • 1060

Linux内核常用数据结构要点

简单总结一下Linux Kernel常用数据结构和选取原则
  • ace_an
  • ace_an
  • 2016年12月22日 13:56
  • 1032

Linux内核数据结构分析

上一篇在分析Linux虚拟文件系统的过程中,我注意到了一个反复出现的数据结构——struct list_head,通过名称就可以确定这是一种链表数据结构,今天我们就以此为切入点,对内核数据结构的特点做...
  • u012927281
  • u012927281
  • 2016年07月06日 23:18
  • 548

Linux内核地址映射模型

Linux内核地址映射模型 x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。 段页式机制如下图。 ...
  • moe26
  • moe26
  • 2013年08月26日 10:05
  • 994

linux 内核常用数据结构及算法——container_of

container_of是linux内核中常用的一个宏函数,其用途是通过结构体一个yu
  • vah101
  • vah101
  • 2014年11月15日 19:29
  • 1633

Linux内核之数据结构--映射

前言Linux内核实现了一下常用的内建数据结构,主要有:   链表   队列   映射   二叉树 映射也称为关联数组,就是每个唯一的id对应一个自定义的数据结构指针。感觉关于映射的知识比较...
  • lyc_stronger
  • lyc_stronger
  • 2016年07月29日 10:46
  • 229

Linux用户空间与内核空间内存映射

inux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据...
  • Fybon
  • Fybon
  • 2014年01月09日 16:30
  • 3117

内核映射 - 持久内核映射

持久内核映射 permanent kernel mappings 内核提供了其他函数用于把Highmem内存映射到内核地址空间:持久内核映射和临时内核映射。而这些函数和vmalloc无关。因此网络上...
  • kickxxx
  • kickxxx
  • 2013年07月14日 17:32
  • 1995

linux 高端内存页框管理:永久内核映射、临时内核映射以及非连续内存分配

摘要:高端内存页框的内核映射分为三种情况:永久内核映射、临时内核映射和非连续内存映射。那么这三者有什么区别和联系呢?临时内核映射如何保证不会被阻塞呢?本文主要为你解答这些疑问,并详细探讨高端内存映射的...
  • trochiluses
  • trochiluses
  • 2013年10月25日 10:41
  • 3801
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内核数据结构之映射
举报原因:
原因补充:

(最多只允许输入30个字)