动态PCPU变量
来源:互联网 发布:淘宝客优惠券链接地址 编辑:程序博客网 时间:2024/04/30 13:12
看完了静态的PCPU变量,现在来看看动态的pcpu变量。
使用场景
虽然在内核的核心代码中也可以使用动态PCPU变量,但是主要还是给内核模块使用的。既然是模块,那就有可能在任何时候启动使用,也可能会卸载。动态PCPU变量就是为了满足这个需要而产生的。
用到的API
既然和内存相关,那必然就有分配和释放了。对应的api很直观
- alloc_percpu()
- free_percpu()
背后的原理
网上略为搜索了一下,貌似还没有人讲过动态PCPU变量的实现原理,我这也算是头一个吧~
估计也是因为这个东西讲起来略为有点绕,恐怕很难给大家讲解清楚。在这里我尝试一下,如果有什么不清楚的,可以留言询问。
chunk
chunk可以理解为系统给pcpu变量申请空间的管理结构,在这个结构体中保存了动态PCPU的一些信息。
从上面一文中可以看到,实际上访问静态的PCPU变量只需要一些全局的变量就可以了。但是当有了动态的PCPU变量后,就需要额外的数据来跟踪分配情况了。
比如:
- 有哪些空间被分配了
- 有哪些空间被映射了
你看,一加上动态的要求,数据结构就变得复杂了不少。好了,那我们来看看这部分是怎么实现的。
这个数据结构中分成了几个部分,其中最重要的就是最下面的两个部分。
- map/map_alloc 对应的就是空间使用情况
- populated 对应的就是页表映射的情况
每次需要分配新的变量,内核就会搜索map数组。
这个map数组比较神奇,尽然没有任何资料,我就在这里讲解一下:
- 每个元素保存的是一个偏移,即在pcpu unit内部的偏移
- 这个元素的值,如果最低一位是1,表示从这个偏移到下一个元素的偏移的空间,被使用
比如,如果数组内容如下
0|1, 0x100, 0x200|1
就表示,(0x100, 0x200) 这段空间是可用的,其余则被分配。
所以分配的过程就是遍历这个map数组,当遇到一个最低位没有被置位的元素,且这个元素和下一个元素的间隔能够满足要求的大小,则表示找到了一个空缺。再经过一些检验和计算,最终返回这个偏移。
这个过程在pcpu_alloc_area()函数中实现,有兴趣的可以自行前往仔细研究。
0 0
- 动态PCPU变量
- 静态PCPU变量
- Linux的JCPU与PCPU
- Linux的JCPU与PCPU
- 动态变量
- 静态变量-动态变量
- Linux的JCPU与PCPU区别
- [PHP]可变变量||动态变量
- 静态变量、动态变量、寄存器变量、…
- 动态和静态变量
- php动态变量
- AWK 变量动态查找
- 动态变量名
- C#动态定义变量
- windows系统动态变量
- PHP 动态变量
- Python 动态变量
- LISP 6.3 动态变量
- java面试题集
- “ 鸡尾酒会问题”(cocktail party problem)
- LeetCode-130. Surrounded Regions (JAVA)(环绕区域)
- css强制html不换行 css强制英文单词断行
- delphi中exit,abort,break,continue 的区别
- 动态PCPU变量
- 初识iOS layout(一)
- 4.17
- maven 引入qrcode.jar
- Mysql支持的数据类型(总结)
- Swift 3学习笔记第二篇(基础语法元祖,可选值?和!等)
- send和recv函数解析(转)
- 交叉连接,内连接,外连接
- Phython