我为radare2调试器编写了一个Linux系统调用映射.这意味着为系统调用名称名称及其所需的参数数量提供一个巨大的静态数组映射系统调用号.这对于OpenBSD来说很容易,因为系统调用号在sys/syscall.h中定义,并且在上面的注释中每个都是args的数量.只需要编写一个脚本来解析它并丢弃数组的C代码.
然而,在Linux上,我们没有这种奢侈品.很容易从内核头文件中获取系统调用号,但是如何获取args的数量呢?我唯一的想法是:
1)手动输入.对于每个拱门(它们在linux中的拱门之间变化).所有300多件该死的东西.没门!
2)解析手册页.
3)编写一个脚本,尝试用0,1,2 ... args调用每个系统调用,直到程序构建.不适用于varargs,但系统调用是否支持?
一定有更好的方法.请帮忙!
一位同事和我一直在讨论如何通过FFI bool从<stdbool.h>(又名_Bool)返回Rust.
我们想要在Rust中使用我们的C99代码:
bool
myfunc(void) {
...
}
Run Code Online (Sandbox Code Playgroud)
我们让Rust了解myfunc使用extern C块:
extern "C" {
fn myfunc() -> T;
}
Run Code Online (Sandbox Code Playgroud)
具体类型应该T是什么?
锈没有c_bool在libc箱子的,如果你在网上搜索,你会发现各种GitHub的问题和RFC中,人们讨论这个问题,但真的不来,什么是正确和便携式任何共识:
据我所知:
这一评论表明,如果一个C99 bool被传递给函数的参数或出功能的返回值,并在bool比C的情况下int则提升到相同大小作为int.在这种情况下,我们可以告诉Rust T是u32.
好吧,但如果(由于某种原因)C99 bool是64位宽怎么办?是否u32还安全吗?也许在这种情况下,我们会截断4个最重要的字节,这很好,因为4个最低有效字节足以表示true和false.
我的推理是否正确?在Rust得到之前libc::c_bool,你将使用什么? …
期望的行为:在已经隔离的一组核上运行多线程Linux程序isolcpus.
这是一个我们可以用作多线程程序示例的小程序:
#include <stdio.h>
#include <pthread.h>
#include <err.h>
#include <unistd.h>
#include <stdlib.h>
#define NTHR 16
#define TIME 60 * 5
void *
do_stuff(void *arg)
{
int i = 0;
(void) arg;
while (1) {
i += i;
usleep(10000); /* dont dominate CPU */
}
}
int
main(void)
{
pthread_t threads[NTHR];
int rv, i;
for (i = 0; i < NTHR; i++) {
rv = pthread_create(&threads[i], NULL, do_stuff, NULL);
if (rv) {
perror("pthread_create");
return (EXIT_FAILURE);
}
}
sleep(TIME);
exit(EXIT_SUCCESS); …Run Code Online (Sandbox Code Playgroud) 我一直试图了解Rust的借款和所有权模式.
假设我们有以下代码:
fn main() {
let a = String::from("short");
{
let b = String::from("a long long long string");
println!("{}", min(&a, &b));
}
}
fn min<'a>(a: &'a str, b: &'a str) -> &'a str {
if a.len() < b.len() {
return a;
} else {
return b;
}
}
Run Code Online (Sandbox Code Playgroud)
min()只返回对两个引用字符串中较短者的引用.main()传递两个字符串引用,其引用在不同的范围内定义.我已经使用过,String::from()因此引用没有静态生命周期.程序正确打印short.以下是Rust Playground中的示例.
如果我们引用Rustonomicon(我欣赏它是一个正在进行的工作文档),我们被告知函数签名的含义如下:
fn as_str<'a>(data: &'a u32) -> &'a str
Run Code Online (Sandbox Code Playgroud)
意味着功能:
引用一个
u32有生命周期的东西,并承诺它可以产生一个str可以存活一段时间的引用.
现在让我们转向 …
我注意到当我开始这一天并打开vim,然后使用:Exp,我得到"按ENTER或键入命令继续"提示.通常在执行外部命令时显示.我不记得了:Exp过去做过这个(?).此外,提示仅在首次使用netrw时显示?!
虽然微不足道,但我觉得这很烦人.有谁知道为什么netrw这样做?我一直在删除.vimrc中的各种东西,看它们是否有任何变化,但我可能在这里待了很长时间......
重现步骤:
我的问题很简单:我expect()可以使用pexpect在stderr上查看某些输出吗?它似乎pexpect.spawn()只能用于期望stdout上的输出.
乌托邦的例子:
import pexpect
child = pexpect.spawn(...)
child.expect("hi", fd=pexpect.STDERR)
或者在散文中,"期待stderr上的字符串'hi'".
我没有在文档中找到任何提及这样的工具,但我注意到该child实例有一个stderr属性......
一个半实现我想要的黑客是将stderr重定向到spawn参数中的stdout,然后我们可以使用常规expect().肯定有更好的办法?
干杯
我正在研究使用x86 CPU中的时间戳寄存器(TSR)来测量基准性能.它是一个有用的寄存器,因为它以单调时间单位测量,不受时钟速度变化的影响.很酷.
这是一份英特尔文档,显示了使用TSR进行可靠基准测试的asm片段,包括使用cpuid进行管道同步.见第16页:
要读取开始时间,它说(我注释了一下):
__asm volatile (
"cpuid\n\t" // writes e[abcd]x
"rdtsc\n\t" // writes edx, eax
"mov %%edx, %0\n\t"
"mov %%eax, %1\n\t"
//
:"=r" (cycles_high), "=r" (cycles_low) // outputs
: // inputs
:"%rax", "%rbx", "%rcx", "%rdx"); // clobber
Run Code Online (Sandbox Code Playgroud)
我不知道为什么暂存寄存器用来取的价值观edx
和eax.为什么不删除MOVS和读取TSR值右出的edx
和eax?像这样:
__asm volatile(
"cpuid\n\t"
"rdtsc\n\t"
//
: "=d" (cycles_high), "=a" (cycles_low) // outputs
: // inputs
: "%rbx", "%rcx"); // clobber
Run Code Online (Sandbox Code Playgroud)
通过这样做,您可以保存两个寄存器,从而降低C编译器需要溢出的可能性.
我对吗?或者那些MOV在某种程度上是战略性的?
(我同意你确实需要临时寄存器来读取停止时间,因为在那种情况下指令的顺序是相反的:你有rdtscp,...,cpuid.cpuid指令破坏了rdtscp的结果).
谢谢
我正在使用 pydoc 模块输出我使用 C API 定义的某些类型的文档。在解释器嵌入到我的 C 程序中之前,我想要记录的类型并不存在,因此我无法使用 pydoc 命令。
我让我的 C 代码调用一个函数,该函数执行如下操作:
d = pydoc.HTMLDoc()
content = d.docmodule(sys.modules["mymodule"])
Run Code Online (Sandbox Code Playgroud)
这可行,但会生成带有硬编码“file:/”链接目标的 HTML 页面。有没有办法使用链接的相对路径?
(额外积分是为了更好地记录 C API 中定义的类型)
我正在运行一些基准测试,我想知道使用"无滴答"(又称CONFIG_NO_HZ_FULL_ALL)Linux内核是否对基准测试有用或有害.
我运行的基准测试每次都会使用一个新进程重复多次.我想控制尽可能多的变异来源.
我在互联网上做了一些阅读:
从这些来源我了解到:
在默认配置(CONFIG_NO_HZ=y)中,只有非空闲CPU接收滴答.因此,在这种模式下,我的基准测试总会得到滴答声.
在"无空闲"模式(CONFIG_NO_HZ_FULL_ALL)中,除了一个(启动处理器)之外的所有CPU都处于"自适应滴答"模式.当CPU处于自适应滴答模式时,仅当CPU的调度队列中有多个作业时才会收到滴答.这个想法是,如果队列中有唯一的进程,则不能进行上下文切换,因此不需要发送tick.
一方面,没有基准测试接收滴答声似乎是一个好主意,因为我们排除了滴答程序作为变异的来源(我们不知道滴答程序需要多长时间).另一方面,我认为无滴答模式可能会引入基准时序的变化.
考虑我在无滴答内核上运行的基准测试场景.假设我们重复两次基准测试.
假设第一次运行是幸运的,并被安排到先前空闲的自适应滴答CPU上.因此,该基准不会被刻度中断.
当基准测试第二次运行时,也许它不是那么幸运,并且被放置在已经安排了一些进程的CPU上.此运行将定期中断刻度,以确定是否应切换其中一个其他进程.
我们知道滴答声会影响性能(上下文切换加上运行例程所花费的时间).因此,第一次基准测试具有不公平的优势,并且似乎运行得更快.
另请注意,最初具有自适应滴答CPU的基准测试可能会发现中间基准测试将另一个进程投入到同一个CPU中.在这种情况下,基准测试最初不接收滴答,然后开始接收它们.这意味着基准性能可能会随时间而变化.
所以我认为无滴答模式(至少在我的基准测试场景下)会引入时序变化.我的推理是否正确?
一种解决方案是使用隔离的自适应滴答CPU进行基准测试(isolcpus+ taskset),但是我们已经排除了隔离的CPU,因为这会在我们的多线程基准测试中引入人工减速.
谢谢
我正在尝试确定一个时间序列(如一个浮点数列表)是否与自身相关.我已经acf在statsmodels中使用了这个函数(http://statsmodels.sourceforge.net/devel/generated/statsmodels.tsa.stattools.acf.html),现在我正在研究Durbin-Watson统计数据有任何价值.
看起来这种事情应该有效:
from statsmodels.regression.linear_model import OLS
import numpy as np
data = np.arange(100) # this should be highly correlated
ols_res = OLS(data)
dw_res = np.sum(np.diff(ols_res.resid.values))
Run Code Online (Sandbox Code Playgroud)
如果你要运行它,你会得到:
Traceback (most recent call last):
...
File "/usr/lib/pymodules/python2.7/statsmodels/regression/linear_model.py", line 165, in initialize
self.nobs = float(self.wexog.shape[0])
AttributeError: 'NoneType' object has no attribute 'shape'
Run Code Online (Sandbox Code Playgroud)
似乎D/W通常用于比较两个时间序列(例如http://connor-johnson.com/2014/02/18/linear-regression-with-python/)的相关性,所以我认为问题是因为我没有通过另一个时间序列来比较.也许这应该在exog参数中传递给OLS?
exog : array-like
A nobs x k array where nobs is the number of observations and k is
the …Run Code Online (Sandbox Code Playgroud) python ×3
benchmarking ×2
c ×2
linux ×2
rust ×2
affinity ×1
assembly ×1
boolean ×1
correlation ×1
ffi ×1
html ×1
kernel ×1
lifetime ×1
netrw ×1
numpy ×1
performance ×1
pexpect ×1
pydoc ×1
rdtsc ×1
scheduler ×1
scheduling ×1
statistics ×1
statsmodels ×1
system-calls ×1
vim ×1