Linux per_cpu机制的详解

针对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))

Linux per_cpu机制的详解相关推荐

  1. Linux LVM 的使用详解

    Linux LVM 的使用详解 2011-12-20 14:41 摘要: Linux用户安装Linux操作系统时遇到的一个最常见的难以决定的问题就是如何正确地给评估各分区大小,以分配合适的硬盘空间.而 ...

  2. linux下scp命令详解

    http://www.cnblogs.com/xuxm2007/archive/2010/08/04/1792179.html linux下scp命令详解 http://www.9usb.net/20 ...

  3. linux语言的说明顺序有哪些,(linux常用头文件详解.doc

    (linux常用头文件详解 linux常用头文件详解 POSIX标准定义的头文件??????? 目录项 ???????? 文件控制 ??? 文件名匹配类型 ??? 路径名模式匹配类型 ??????? ...

  4. linux 驱动器发送信号,Linux设备驱动并发控制详解(自旋锁,信号量)

    转发:Linux设备驱动并发控制详解(自旋锁,信号量) 作者:jinhaijun 提交日期:2008-3-12 14:08:00 | 分类: | 访问量:144 link:http://www.emb ...

  5. 《Linux 设备驱动开发详解(第2版)》——1.4 Linux设备驱动

    本节书摘来自异步社区<Linux 设备驱动开发详解(第2版)>一书中的第1章,第1.1节,作者:宋宝华著,更多章节内容可以访问云栖社区"异步社区"公众号查看 1.4 L ...

  6. Linux设备驱动开发详解 第3版 (即 Linux设备驱动开发详解 基于最新的Linux 4 0内核 )前言

    Linux从未停歇脚步.Linus Torvalds,世界上最伟大的程序员之一,Linux内核的创始人,Git的缔造者,仍然在没日没夜的合并补丁,升级内核.做技术,从来没有终南捷径,拼的就是坐冷板凳的 ...

  7. linux远程date命令,linux之date命令详解

    date命令的用处 1.用于显示特殊的时间格式,可以用于对日志文件的命名 2.用于设置时间 ,不过这方面用的比较少,因为一般的服务器都设置的有自动同步网络时间 用法: date [OPTION]... ...

  8. linux 设备驱动 ppt,linux设备驱动开发详解讲座ppt

    PPT内容 这是linux设备驱动开发详解讲座ppt下载,主要介绍了设备驱动简介:建立和运行模块:字符驱动:调试技术:并发和竞争:分配内存:硬件通讯:中断处理:块设备驱动,欢迎点击下载. 嵌入式Lin ...

  9. 《Linux设备驱动开发详解(第2版)》隆重出版

    Linux设备驱动开发详解(第2版)(前一版狂销3万册,畅销书最新升级) [新品] 点击看大图     基本信息 * 作者: 宋宝华       * 出版社:人民邮电出版社     * ISBN:97 ...

最新文章

  1. 如何进入npm_如何用docsify在Github搭建自己的知识文档?
  2. Mac怎么不能拷贝文件到U盘
  3. 通过adb巧用monkey获取android设备中所有应用的主activity
  4. 31号2场直播预告丨下一代分布式数据库设计思考、Greenplum 7新特性和进展
  5. 设备描述符请求失败_如果用户发出过多请求 苹果将取消Apple ID帐户恢复
  6. tp交换机管理页面_二层网管交换机的管理方法
  7. python解释器在语法上不支持什么编程_python解释器和编辑器的区别 - CSDN
  8. 理解 CSS 布局和块级格式上下文 1
  9. C++基础巩固getchar 和 getch区别
  10. 【零基础入门】 css学习笔记(5) 浮动
  11. 通达OA破解版下载|通达OA2015破解版 可用|通达oa2015破解补丁
  12. Qt:windows下Qt安装教程
  13. Linux中文显示乱码问题
  14. Python-贪心算法 田忌赛马
  15. 可以写一个表白代码吗
  16. python读取微博文本数据,对微博文本进行分句(分句主要以特定的标点符号为主)。...
  17. 仿造虎扑步行街首页。
  18. 自动锁定计算机软件,教你电脑锁屏怎么设置,让电脑自动锁屏
  19. MYSQL 存储过程(创建和调用,in、out和inout模式)
  20. 柯桥日语培训:语法 | 「あまり 」知识解析

热门文章

  1. 操作系统实验(1)—— Linux命令解释程序设计与实现
  2. 写给程序员的Flutter详细教程,实战解析
  3. ScalersTalk 机器学习小组第 21 周学习笔记(深度学习-10)
  4. 网上订餐系统 mysql 数据库设计_网上订餐系统的设计与实现
  5. WinGate 6.0 build 984
  6. 解决Caused by: java.lang.NoClassDefFoundError: com/aliyun/oss/internal/OSSUdfOperation
  7. swift开发之pop动画
  8. php 没有jstl,jstl,java-ee_JSTL test 为什么没起作用,jstl,java-ee - phpStudy
  9. 原数据库和现有数据库不同
  10. C#写的基于http协议的QQ聊天机器人