针对IA64体系结构

在Linux操作系统中,特别是针对SMP或者NUMA架构的多CPU系统的时候,描述每个CPU的私有数据的时候,Linux操作系统提供了per_cpu机制。

per_cpu机制就是让每个CPU都有自己的私有数据段,便于保护与访问。

通过宏DEFINE_PER_CPU,定义这种私有数据,只不过这种私有数据放在特定的数据段中。 
#define DEFINE_PER_CPU(type, name)     \ 
__attribute__((__section__(".data.percpu")))   \ 
PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name  
在GCC中__typeof__相当于typeof(检查数据类型),用__typeof__为了兼容性。

例如1:在Linux操作系统中,用于描述每个IA64CPU信息的数据结构的定义: 
DEFINE_PER_CPU(struct cpuinfo_ia64, cpu_info);

例如2:描述每个CPU的状态的变量的定义:* 
* State for each CPU 
*/  
DEFINE_PER_CPU(int, cpu_state);

系统如何为每个CPU保留这些私有数据的? 
在start_kernel函数中调用执行函数setup_per_cpu_areas( ),setup_per_cpu_areas( )定义如下: 
static void __init setup_per_cpu_areas(void) 

unsigned long size, i; 
char *ptr; 
unsigned long nr_possible_cpus = num_possible_cpus(); 
/* Copy section for each CPU (we discard the original) */ 
size = ALIGN(PERCPU_ENOUGH_ROOM, PAGE_SIZE); 
ptr = alloc_bootmem_pages(size * nr_possible_cpus); 
for_each_possible_cpu(i) { 
   __per_cpu_offset = ptr - __per_cpu_start; 
   memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); 
   ptr += size; 
         } 

setup_per_cpu_areas( )的功能就是将.data.percpu中的数据拷贝到每个CPU的数据段中,每个CPU一份。 
其中CPU n 对应的专有数据区的首地址为__per_cpu_offset[n]。

在Linux操作系统中,在系统启动的时候会生成以__per_cpu_start标识开头和__per_cpu_end标识结尾的数据段,在执行完函数setup_per_cpu_areas( )后,将.data.percpu中的数据拷贝到每个CPU数据段后,这个数据段就会释放(free)掉。 
.data.percpu定义如下(在arch/ia64/kernel/vmlinux.lds.S): 

   __per_cpu_start = .; 
   *(.data.percpu) 
   *(.data.percpu.shared_aligned) 
   __per_cpu_end = .; 
}

如何存取每个CPU的这些私有数据呢? 
第一种方法:取制定cpu的制定变量 
/* 
* A percpu variable may point to a discarded regions. The following are 
* established ways to produce a usable pointer from the percpu variable 
* offset. 
*/ 
#define per_cpu(var, cpu) \ 
(*SHIFT_PERCPU_PTR(&per_cpu_var(var), per_cpu_offset(cpu))) 


#define SHIFT_PERCPU_PTR(__p, __offset) RELOC_HIDE((__p), (__offset)) 
                                                                        | 
                                                                         | 
                                                                       #define RELOC_HIDE(ptr, off)     \ 
   ({ unsigned long __ptr;     \ 
     __asm__ ("" : "=r"(__ptr) : "0"(ptr));   \ 
     (typeof(ptr)) (__ptr + (off)); }) 
第二种方法:取当前CPU的制定变量 
#define __get_cpu_var(var) \ 
(*SHIFT_PERCPU_PTR(&per_cpu_var(var), my_cpu_offset)) 
第三种方法:读后写的方式读取当前CPU的制定变量 
#define __raw_get_cpu_var(var) \ 
(*SHIFT_PERCPU_PTR(&per_cpu_var(var), __my_cpu_offset))

per_cpu机制的详解相关推荐

  1. Linux per_cpu机制的详解

    Linux per_cpu机制的详解 针对IA64体系结构 在Linux操作系统中,特别是针对SMP或者NUMA架构的多CPU系统的时候,描述每个CPU的私有数据的时候,Linux操作系统提供了per ...

  2. mysql select 缓存_mysql select缓存机制使用详解

    mysql Query Cache 默认为打开.从某种程度可以提高查询的效果,但是未必是最优的解决方案,如果有的大量的修改和查询时,由于修改造成的cache失效,会给服务器造成很大的开销,可以通过qu ...

  3. java 委托机制_通过反射实现Java下的委托机制代码详解

    简述 一直对Java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块API public Class Delegater()//空参构造,该类管理委托实例并 ...

  4. java委托机制教程_通过反射实现Java下的委托机制代码详解

    简述 一直对java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块api public class delegater()//空参构造,该类管理委托实例并 ...

  5. python做插件应用_Python插件机制实现详解

    插件机制是代码/功能反向依赖注入到主体程序的一种方法,编译型语言通过动态加载动态库实现插件.对于Python这样的脚本语言,实现插件机制更简单. 机制 Python的__import__方法可以动态地 ...

  6. python插件使用教程_Python插件机制实现详解

    插件机制是代码/功能反向依赖注入到主体程序的一种方法,编译型语言通过动态加载动态库实现插件.对于Python这样的脚本语言,实现插件机制更简单. 机制 Python的__import__方法可以动态地 ...

  7. java反射机制深入详解_Java反射机制深入详解

    原标题:Java反射机制深入详解 一.概念 反射就是把Java的各种成分映射成相应的Java类. Class类的构造方法是private,由JVM创建. 反射是java语言的一个特性,它允程序在运行时 ...

  8. python加载机制_Python插件机制实现详解

    插件机制是代码/功能反向依赖注入到主体程序的一种方法,编译型语言通过动态加载动态库实现插件.对于Python这样的脚本语言,实现插件机制更简单. 机制 Python的__import__方法可以动态地 ...

  9. 我的世界做计算机原理,我的世界计分板运算机制原理详解

    我的世界里面计分板的制作对新手玩家来说可能比较困难,特别是各种运算机制需要对电子电路比较了解,下面是计分板的计算机制和原理详解,看明白的话不妨自己试着制作计分板. 计分板运算机制原理详解 输入12 加 ...

  10. 注意力机制Attention详解

    注意力机制Attention详解 一.前言 2018年谷歌提出的NLP语言模型Bert一提出,便在NLP领域引起热议,之所以Bert模型能够火出圈,是由于Bert模型在NLP的多项任务中取得了之前所有 ...

最新文章

  1. C语言如何编写游戏界面,「分享」C语言如何编写图形界面
  2. 推荐一个比吴恩达还优质的机器学习课程
  3. 脑机头条 第20期| 世界机器人大会-脑控打字创纪录
  4. java oop_Java实现OOP(面向对象编程)
  5. seci-log1.02日志分析软件版本升级了
  6. 计算机社团嘉年华的游戏,社团嘉年华,游戏大乱斗!
  7. iPhone X 刘海打理指北
  8. s1机试补考补习 9206
  9. Ubuntu16.04 下SU画图,批量和单个
  10. Spring MVC 常用注解之 Controller 篇
  11. Leetcode每日一题:904.fruit-into-baskets(水果成篮)
  12. 压测 broken pipe 之类
  13. unix域套接字UDP网络编程
  14. [转] 各大著名公司音效小评(DNSe/BBE/SRS/PlayFX/杜比/Full Sound…)
  15. Laravel文档梳理10、请求生命的周期
  16. Golang深拷贝浅拷贝
  17. Collections、Set、Map、斗地主排序
  18. ETL VS ELT
  19. 【BUGKU之ez_java_serialize】
  20. @技术文章为什么要写得简练

热门文章

  1. bnu 29064, 期望 水题
  2. asp:树型select菜单
  3. html 下拉框错层,关于html下拉框中optGroup标签的一个bug修复
  4. 开启本地git权限_git的使用,有这篇文章就够了
  5. 非template/render模式下使用iview组件时标签需要转化
  6. 19.12添加自定义监控项目19.13/19.14 配置邮件告警19.15 测试告警19.16 不发邮件的问题处理...
  7. 将 iOS 软件移植到 Windows 10 的桥梁将很快打通
  8. 将u盘的文件复制到虚拟机上的linux系统上面—》文件挂载(转)
  9. 没有月亮的中秋,有CCNP伴我度过!
  10. js中的~~、Object.entires用法(转)