percpu变量初始化要点记录
来源:互联网 发布:java 节假日api 编辑:程序博客网 时间:2024/06/03 07:16
pcpu_page_first_chunk函数先分配一块bootmem区间p,作为一级指针,然后为每个cpu分配n个页,依次把指针存放在p中。
p[0]..p[n-1]属于cpu0,p[n]-p[2n-1]属于cpu2,依次类推。
最后计算偏移:
再来看这个pcpu_unit_offsets[cpu]是什么:
const unsigned long *pcpu_unit_offsets __read_mostly;
还是在函数pcpu_setup_first_chunk
第unit个单元,每个单元有unit_size这么大,即最终偏移为:
gi->base_offset = unit * ai->unit_size;
p[0]..p[n-1]属于cpu0,p[n]-p[2n-1]属于cpu2,依次类推。
接着建立一个长度为n×NR_CPUS的虚拟空间(vmalloc_early),
并把虚拟空间对应的物理页框设置为p数组指向的pages。
然后把每cpu变量__per_cpu_load拷贝至这个虚拟空间。最后计算偏移:
#define per_cpu(var, cpu) \(*SHIFT_PERCPU_PTR(&(var), per_cpu_offset(cpu)))unsigned long __per_cpu_offset[NR_CPUS] __read_mostly;for_each_possible_cpu(cpu)__per_cpu_offset[cpu] = delta + pcpu_unit_offsets[cpu];delta = (unsigned long)pcpu_base_addr - (unsigned long)__per_cpu_start;其中pcpu_base_addr = base_addr; 这个base_addr就是之前分配的vm虚拟空间地址。
再来看这个pcpu_unit_offsets[cpu]是什么:
const unsigned long *pcpu_unit_offsets __read_mostly;
还是在函数pcpu_setup_first_chunk
pcpu_unit_offsets = unit_off;unit_off = alloc_bootmem(nr_cpu_ids * sizeof(unit_off[0]));unit_off[cpu] = gi->base_offset + i * ai->unit_size;这个是分组的概念,不看也罢
第unit个单元,每个单元有unit_size这么大,即最终偏移为:
gi->base_offset = unit * ai->unit_size;
- percpu变量初始化要点记录
- percpu 变量总结
- Linux 内核基本概念(一)----PerCPU变量
- 多CPU支持下的 percpu 变量分析
- 多CPU支持下的 percpu 变量分析
- 随笔记录-模板类成员变量初始化
- about percpu
- 初始化的顺序-要点
- 静态实例初始化要点
- 变量初始化
- 变量初始化
- 变量初始化
- 变量初始化
- 变量初始化
- 变量初始化
- 变量初始化
- 变量初始化
- 变量初始化
- MyEclipse提示键配置、提示快捷键、提示背景色、关键字颜色、代码显示、编辑框背景色等
- 二维码中间加入图片
- 如何避免多人并发时办理同一条数据
- 虚拟网卡 TUN/TAP 驱动程序设计原理
- Axis,axis2,Xfire以及cxf对比
- percpu变量初始化要点记录
- CodeRush使用教程九:Click Identifier
- Java中static与final如何使用
- Firefox无法加载12306自家证书
- ubuntu卸载mysql
- 死锁产生的原因及四个必要条件
- Android_抓取Kernel Log
- CodeRush使用教程十:快速文件导航(Quick File Navigation)
- 在某一个范围内不重复地随机成N个数字