免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3026 | 回复: 10
打印 上一主题 下一主题

求帮助,如何通过sys文件系统保存对应cpu的寄存器 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-24 19:05 |只看该作者 |倒序浏览
在项目中想实现这样一种功能,通过读写 /sys/devices/system/cpu/cpuX/save_reg接口(自己通过sysfs create出来的),来保存对应cpu的寄存器到一块memory中,目前接口已经完成了,但是有一个问题,如何保证save的是对应cpu的?

举个例子里说明一下:

Exmaple:
       echo 1 > /sys/devices/system/cpu/cpu1/save_reg ,想实现的就是cpu1会save自己的register,

因为我们不能假设这个动作就会发生在cpu1上,所以就很困惑,盼望高人帮助!!感激

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
2 [报告]
发表于 2012-03-24 22:48 |只看该作者
回复 1# cuibixiong_cu

如果你的读写程序只是读写本地CPU, 这里就是对应的本地cpu.
想保险的话能不能用per-cpu data area?
   

论坛徽章:
0
3 [报告]
发表于 2012-03-26 11:24 |只看该作者
没有明白楼上的意思,我的意思是如何保证/sys/devices/system/cpu/cpu1/下对应的就是cpu1的操作,我们不能做这种假设,说对cpu1目录下的读写就一定会发生在cpu1上,linux也不会做这种假设的,这违反了一般性原则,必定需要我们实现一种机制,来保障对cpu1目录下文件的读写就发生在cpu1上。

论坛徽章:
0
4 [报告]
发表于 2012-03-26 13:10 |只看该作者
楼主对每个cpu registers的读取采用了什么方式?换句话说你如何确定你现在读取的是cpu0而不是cpu1的寄存器呢?

论坛徽章:
0
5 [报告]
发表于 2012-03-26 13:40 |只看该作者
我现在是这么考虑的,因为cpu_idle是每个cpu都要走的代码,那么我可以在这个做一个判断,判断我自己设定的一下bitmask,比如cpu_save_reg_mask(类似于cpu_online_mask), 然后再执行sysfs读写的时候只是简单的设定一下这些mask,最后从cpu_idle进入我自己的save_reg handler,不知道这样可不可以,这样就可以保证读写的是对应cpu的寄存器了

论坛徽章:
0
6 [报告]
发表于 2012-03-26 15:05 |只看该作者
回复 4# MagicBoy2010


Hi M兄,刚才我try了一下,我所说的通过cpu_idle来控制是可以实现的,告知您一声,谢谢

评分

参与人数 1可用积分 +2 收起 理由
Godbach + 2 感谢分享

查看全部评分

论坛徽章:
0
7 [报告]
发表于 2012-03-26 19:30 |只看该作者
cuibixiong_cu 发表于 2012-03-26 15:05
回复 4# MagicBoy2010


其实我好奇的是4楼中的问题,不过没看到你的回答。。。
在内核中这种问题用per-CPU变量是最常规的解决方法。

论坛徽章:
0
8 [报告]
发表于 2012-03-26 20:42 |只看该作者
回复 7# MagicBoy2010


    其实per-cpu是为每个cpu分配的一段内存空间,用来保存每个cpu的特殊内容。其实在这里寄存器保存到哪儿不会是什么问题,无论是保存在per-cpu结构中还是保存在另外的地方,最后我只要能引用到了就可以了。问题是我怎么保证在我执行echo 1 > /sys/devices/sytem/cpu/cpu1/save_reg时,所要保存的就是cpu1的寄存器。这个我想才是最主要的问题。


目前所采用的解决方法就是:
1. echo 1 > /sys/devices/system/cpu/cpu1/save_reg时,只是设定的相应的bitmask位,表明我要保存这个cpu的寄存器。
2. cpu_idle是每个cpu都要run的,所以在cpu_idle中做了一个判断(save_regs_mask中相应的bit位其实就是我在echo的handler中设定的)
           
           if (test_bit(cpu_mask_check(smp_processor_id()), cpu_mask_bits(save_regs_mask)))
                                       
                                      .....
                                      save_regs(smp_processor_id())
                           .....


这样就可以保证我运行save_regs这个段程序所对应的cpu就是我想保存寄存器的cpu了


不知道这样可不可以回答magicboy兄的问题?


论坛徽章:
0
9 [报告]
发表于 2012-03-26 21:39 |只看该作者
其实per-cpu是为每个cpu分配的一段内存空间,用来保存每个cpu的特殊内容。其实在这里寄存器保存到哪儿不会是什么问题,无论是保存在per-cpu结构中还是保存在另外的地方,最后我只要能引用到了就可以了。问题是我怎么保证在我执行echo 1 > /sys/devices/sytem/cpu/cpu1/save_reg时,所要保存的就是cpu1的寄存器。这个我想才是最主要的问题。

===================================
我总感觉你用cpu_idle的方法并不好,因为cpu_idle只有在没有其他进程可被调度运行时才会进入,如果从系统启动到你用echo 1来读cpu1的寄存器,cpu1上一直都有可被调度的进程,那么岂不是会有问题?没有更好的办法吗?

而且你echo 1时只是做个标记,cpu寄存器中的数值一直在变化,即便之后cpu1进入到cpu_idle,它保存的是你echo 1时所希望看到的值吗?

论坛徽章:
0
10 [报告]
发表于 2012-03-26 23:19 |只看该作者
其实也是想借论坛来看看大家有什么更好的办法没有,如果maigcboy兄有什么好的思路也希望不吝赐教啊,多谢多谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP