Linux 在运行特定vdso时收到通知
我目前正在尝试实现我自己的VDSO。我用它解释了如何在2.6内核中实现这一点 我测试了它,我让它工作了。(我成功地创建了一个内核变量并从userland访问了它。) 当调用vdso时,内核中有没有一种方法可以知道?我假设这不能同步完成(因为vdso是在userland中处理的)。但是,内核是否有可能(甚至是肮脏的)知道函数是否被调用(可能是通过硬件断点或其他方式) 我想做的是类似于函数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(/* […] */)
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将代码编译到内核中。据我所知,这些共享变量是来自用户区的只读变量。因此,这段代码将被编译,但如果我取消注释递增,我就有一个segfaultnotrace 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)。你知道额外的调整是什么吗?