IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> Arm 64 Linux per_cpu 变量读取 -> 正文阅读

[嵌入式]Arm 64 Linux per_cpu 变量读取

比如我们读取或者写入一个per cpu变量

cnten_val = per_cpu(cntenset_val, cpu);
其实就是求这个per cpu 变量的地址

#define per_cpu(var, cpu)?? ?(*per_cpu_ptr(&(var), cpu))

#define per_cpu_ptr(ptr, cpu)?? ??? ??? ??? ??? ??? ?\
({?? ??? ??? ??? ??? ??? ??? ??? ??? ?\
?? ?__verify_pcpu_ptr(ptr);?? ??? ??? ??? ??? ??? ?\
?? ?SHIFT_PERCPU_PTR((ptr), per_cpu_offset((cpu)));?? ??? ??? ?\
})

per_cpu_offset(cpu)这里由cpu number 转换成 cpu offset


#define SHIFT_PERCPU_PTR(__p, __offset)?? ??? ??? ??? ??? ?\
?? ?RELOC_HIDE((typeof(*(__p)) __kernel __force *)(__p), (__offset))

#define RELOC_HIDE(ptr, off)?? ??? ??? ??? ??? ?\
? ({ unsigned long __ptr;?? ??? ??? ??? ??? ?\
? ? ?__ptr = (unsigned long) (ptr);?? ??? ??? ??? ?\
? ? (typeof(ptr)) (__ptr + (off)); })
?

弄了半天,就是基地址+offset?

? ? (typeof(ptr)) (__ptr + (off)); })
?

我们来看看这个offset 如何得到

per_cpu_offset(cpu)

#define per_cpu_offset(x) (__per_cpu_offset[x])

extern unsigned long __per_cpu_offset[NR_CPUS];

静态设置,只有知道cpu number 就可以得到cpu offser

我们看看如何得到cpu id

# define smp_processor_id() raw_smp_processor_id()

#define raw_smp_processor_id() (*raw_cpu_ptr(&cpu_number))

DECLARE_PER_CPU_READ_MOSTLY(int, cpu_number);

#define raw_cpu_ptr(ptr)?? ??? ??? ??? ??? ??? ?\
({?? ??? ??? ??? ??? ??? ??? ??? ??? ?\
?? ?__verify_pcpu_ptr(ptr);?? ??? ??? ??? ??? ??? ?\
?? ?arch_raw_cpu_ptr(ptr);?? ??? ??? ??? ??? ??? ?\
})

#define arch_raw_cpu_ptr(ptr) SHIFT_PERCPU_PTR(ptr, __my_cpu_offset)
?

static inline unsigned long __my_cpu_offset(void)
{
?? ?unsigned long off;

?? ?/*
?? ? * We want to allow caching the value, so avoid using volatile and
?? ? * instead use a fake stack read to hazard against barrier().
?? ? */
?? ?asm("mrs %0, tpidr_el1" : "=r" (off) :
?? ??? ?"Q" (*(const unsigned long *)current_stack_pointer));

?? ?return off;
}
最后读取了 本cpu 的?tpidr_el1 将采取

看看arm 怎么定义的:

? 其实就是cpu提供一个寄存器,可以写入一下信息。

? 是由下面函数,在core 启动时间写入的

static inline void set_my_cpu_offset(unsigned long off)

{

asm volatile("msr tpidr_el1, %0" :: "r" (off) : "memory");

}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-31 16:48:39  更:2021-07-31 16:49:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:54:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码