我正在做一些Linux内核时序,特别是在中断处理路径中.我一直在使用RDTSC进行计时,但是我最近了解到它并不一定准确,因为指令可能无序发生.
然后我尝试了:
RDTSC + CPUID(在这里以相反的顺序)刷新管道,由于超级调用和诸如此类的原因,在虚拟机(我的工作环境)上产生高达60倍的开销(!).无论是否启用了HW Virtualization,都可以使用此功能.
最近我遇到了RDTSCP*指令,它看起来像RDTSC + CPUID那样做,但更高效,因为它是一个较新的指令 - 相对而言只有1.5x-2x的开销.
我的问题:RDTSCP作为一个测量点是否真的准确,它是做出时机的"正确"方法吗?
另外要明确一点,我的时间基本上就是这样,内部:
如何使用ftrace()(或其他任何东西)跟踪Linux内核中特定的用户定义函数?我正在尝试创建和运行一些微基准测试,所以我希望有时间运行某些功能.我已经阅读了(至少尽可能多的)文档,但朝着正确方向迈出的一步将是非常棒的.
我倾向于ftrace(),但在Ubuntu 14.04上有问题.
代码是
int f(int x, int y, int z) {
if (/* missing code here */)
return z;
else
return -z;
}
Run Code Online (Sandbox Code Playgroud)
组装是
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
cmpl 12(%ebp), %eax
jge .L2
movl 16(%ebp), %eax
jmp .L3
.L2:
movl 16(%ebp), %eax
negl %eax
.L3:
popl %ebp
ret
Run Code Online (Sandbox Code Playgroud)
这个问题要求我找出缺少的测试表达式必须产生给出的汇编代码.好的,够容易的.有一个明显的比较之间正在进行的x和y.如果jge操作员要将跳跃预先形成循环体12(%ebp) > %eax.
可能的选择是
x<=y
x>=y
x>y
x<y
我的回答是x<=y,因为它12(%ebp)是一个参考y,它是目的地.但这个答案是错误的,我不知道如何.任何提示?非常感谢.
我在这里阅读了答案:触发内核中断处理程序:如何?这是一个很好的,但不完全是我需要的。
我正在对处理中断方面的 RNG 函数进行微基准测试,因此我需要一种好方法来人为且可重复地生成中断。例如,我可以将某些内容重定向到生成 300 个中断或类似内容的 Procfs 接口。
就像在内核中运行某种生成中断的函数一样简单吗?
是否有某种中断实际上并不执行“任何操作”,但仍然经过整个中断处理程序路径?我意识到我可以只输入按键或类似的东西,但这对于研究目的来说并不是真正可重复和可编写脚本的。
我正在使用 x86 架构。
目前,我正在通过一个 server.js 文件运行两个(很快将是三个)node.js websocket 应用程序。我正在使用 Express 来服务我的整个页面,以及我编写的粒子物理“游戏”。我还将创建一个聊天室,只是为了了解更多有关这些事情的信息。
我的问题(或缺乏?)是所有这些都是通过一个 server.js 文件运行的。Heroku 似乎需要这个,所以我不确定是否还有其他选择。我用 Heroku 来托管它。
我的问题是,这是不好的做法吗?还有其他我应该做而我错过的事情吗?我所有的“应用程序”的流量都非常低,所以我认为这不是一个大问题。我只是想从一开始就学习最佳实践,这样我就不会犯愚蠢的错误。谢谢。
编辑:如何使用 procfile 设置在 Heroku 中专门拆分应用程序?