Chinaunix

标题: 求帮助,如何通过sys文件系统保存对应cpu的寄存器 [打印本页]

作者: cuibixiong_cu    时间: 2012-03-24 19:05
标题: 求帮助,如何通过sys文件系统保存对应cpu的寄存器
在项目中想实现这样一种功能,通过读写 /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上,所以就很困惑,盼望高人帮助!!感激
作者: linuxfellow    时间: 2012-03-24 22:48
回复 1# cuibixiong_cu

如果你的读写程序只是读写本地CPU, 这里就是对应的本地cpu.
想保险的话能不能用per-cpu data area?
   
作者: cuibixiong_cu    时间: 2012-03-26 11:24
没有明白楼上的意思,我的意思是如何保证/sys/devices/system/cpu/cpu1/下对应的就是cpu1的操作,我们不能做这种假设,说对cpu1目录下的读写就一定会发生在cpu1上,linux也不会做这种假设的,这违反了一般性原则,必定需要我们实现一种机制,来保障对cpu1目录下文件的读写就发生在cpu1上。
作者: MagicBoy2010    时间: 2012-03-26 13:10
楼主对每个cpu registers的读取采用了什么方式?换句话说你如何确定你现在读取的是cpu0而不是cpu1的寄存器呢?
作者: cuibixiong_cu    时间: 2012-03-26 13:40
我现在是这么考虑的,因为cpu_idle是每个cpu都要走的代码,那么我可以在这个做一个判断,判断我自己设定的一下bitmask,比如cpu_save_reg_mask(类似于cpu_online_mask), 然后再执行sysfs读写的时候只是简单的设定一下这些mask,最后从cpu_idle进入我自己的save_reg handler,不知道这样可不可以,这样就可以保证读写的是对应cpu的寄存器了
作者: cuibixiong_cu    时间: 2012-03-26 15:05
回复 4# MagicBoy2010


Hi M兄,刚才我try了一下,我所说的通过cpu_idle来控制是可以实现的,告知您一声,谢谢
作者: MagicBoy2010    时间: 2012-03-26 19:30
cuibixiong_cu 发表于 2012-03-26 15:05
回复 4# MagicBoy2010


其实我好奇的是4楼中的问题,不过没看到你的回答。。。
在内核中这种问题用per-CPU变量是最常规的解决方法。
作者: cuibixiong_cu    时间: 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兄的问题?



作者: MagicBoy2010    时间: 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时所希望看到的值吗?


作者: cuibixiong_cu    时间: 2012-03-26 23:19
其实也是想借论坛来看看大家有什么更好的办法没有,如果maigcboy兄有什么好的思路也希望不吝赐教啊,多谢多谢
作者: MagicBoy2010    时间: 2012-03-26 23:30
cuibixiong_cu 发表于 2012-03-26 23:19
其实也是想借论坛来看看大家有什么更好的办法没有,如果maigcboy兄有什么好的思路也希望不吝赐教啊,多谢多 ...


我本来是想问你的,呵呵




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2