2011-11-26 39 views
4

我正在使用ptrace(2)监视其他进程系统调用的软件。不幸的是,大多数现代操作系统都实现了一些在Linux中被称为vsyscalls的快速用户模式系统调用。禁用Linux中的vsyscalls

有没有什么办法可以禁止单个进程使用vsyscalls/vDSO,或者如果这是不可能的话,对于整个操作系统呢?

+0

你是否暗示'ptrace'不能捕获所有vsyscall-ed系统调用? –

回答

5

尝试echo 0 > /proc/sys/kernel/vsyscall64

如果你想上的ptrace的gettimeofday电话,他们都没有显示出来,什么时间源使用(pmtimer,ACPI,TSC,HPET等)的系统。我想知道你是否试图强迫你的计时器像pmtimer这样的老东西幽默我。即使在vsyscall设置为零的情况下,许多gtod定时器特定优化中的一个可能会导致您的ptrace调用被避免。

+1

试过了,似乎没有工作,我仍然没有看到time/gettimeofday系统调用。我也尝试过'vdso = 0'启动选项,但没有成功。 – Michael

+0

@Michael你看看gettimeofday的来源,看看它是否尊重vsyscall标志?今晚我会自己研究一下。 –

+0

好吧,我*可以*看到'gettimeofday'系统调用与vsyscall64 = 0,但我仍然没有看到'时间'系统调用。 – Michael

0

对于较新的系统echo 0 > /proc/sys/kernel/vsyscall64可能无法正常工作。在Ubuntu 16.04中,通过在参数GRUB_CMDLINE_LINUX_DEFAULT下添加/etc/default/grub中的内核参数vdso=0,可以禁用系统范围内的vDSO。

重要说明:参数GRUB_CMDLINE_LINUX_DEFAULT可能会被/etc/default/grub.d/...中的其他配置文件覆盖,因此请仔细检查何时添加自定义配置。