Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在运行特定vdso时收到通知_Linux_Kernel_Linux Kernel_System Calls - Fatal编程技术网

Linux 在运行特定vdso时收到通知

Linux 在运行特定vdso时收到通知,linux,kernel,linux-kernel,system-calls,Linux,Kernel,Linux Kernel,System Calls,我目前正在尝试实现我自己的VDSO。我用它解释了如何在2.6内核中实现这一点 我测试了它,我让它工作了。(我成功地创建了一个内核变量并从userland访问了它。) 当调用vdso时,内核中有没有一种方法可以知道?我假设这不能同步完成(因为vdso是在userland中处理的)。但是,内核是否有可能(甚至是肮脏的)知道函数是否被调用(可能是通过硬件断点或其他方式) 我想做的是类似于函数my\u vdso\u在这段代码中被调用(): void update_vsyscall(/* […] */)

我目前正在尝试实现我自己的VDSO。我用它解释了如何在2.6内核中实现这一点

我测试了它,我让它工作了。(我成功地创建了一个内核变量并从userland访问了它。)

当调用vdso时,内核中有没有一种方法可以知道?我假设这不能同步完成(因为vdso是在userland中处理的)。但是,内核是否有可能(甚至是肮脏的)知道函数是否被调用(可能是通过硬件断点或其他方式)

我想做的是类似于函数
my\u vdso\u在这段代码中被调用()

void update_vsyscall(/* […] */) {
    // […]
    if(my_vdso_has_been_called())
        do_something();
}

注意:函数
update\u vsyscall
可以在
arch/x86/kernel/vsyscall\u 64.c

中找到,因为您知道如何声明共享变量并从内核和vDSO访问它,所以可以使用该函数:声明新变量,无论何时调用它,它都会从vDSO中递增。

SystemTap
这样的东西能对调用
\uu vDSO\u myvdso
做出反应吗?如果我理解得很好,SystemTap只是从内核外部调用的工具。因此,除非在kernelmode中运行一个等效的工具,否则我不这么认为。但是,如果我错了,请纠正我。SystemTap将代码编译到内核中。据我所知,这些共享变量是来自用户区的只读变量。因此,这段代码将被编译,但如果我取消注释递增,我就有一个segfault
notrace int_uuvdso_umyvdso(void){
/+++*vmyvar;/*如果我取消注释此*/
`return*vmyvar;`
},程序将崩溃。
我做错了吗?还有其他变量可以修改吗?或者我可以禁用此只读保护吗?对不起,你说得对,
VVAR
only提供从vDSO的只读访问。我正在尝试禁用此只读保护。你知道我怎么做吗?我从
vma.c
添加了
VM\u WRITE
标志到
arch\u setup\u附加页面中的
install\u special\u mapping
(…)
,但这还不够(当我增加变量时,我仍然会得到一个segfault)。你知道额外的调整是什么吗?