【问题标题】:Be informed when a specific vdso is run运行特定 vdso 时收到通知
【发布时间】:2018-11-21 17:15:28
【问题描述】:

我目前正在尝试实现我自己的 VDSO。我使用了this tutorial,它解释了如何为 2.6 内核执行此操作。

我测试了它,我得到了这个工作。 (我成功地创建了一个内核变量并从用户态访问它。)

有没有办法在内核中知道何时调用了 vdso?我认为这不能同步完成(因为 vdso 是在用户空间中处理的)。但是内核是否有任何可能性(甚至是肮脏的)知道该函数是否已被调用(可能带有硬件断点或其他东西)?

我想做的是类似于此代码中的函数my_vdso_has_been_called()):

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

注意:函数update_vsyscall可以在arch/x86/kernel/vsyscall_64.c中找到

【问题讨论】:

  • SystemTap 之类的东西可以对您的 __vdso_myvdso 被调用做出反应吗?
  • 如果我理解得很好,SystemTap 是一个只能从内核外部调用的工具。所以除非有在内核模式下运行的等效工具,否则我不这么认为。但如果我错了,请纠正我。
  • SystemTap 将代码编译到内核中。

标签: linux kernel linux-kernel system-calls


【解决方案1】:

由于您知道如何声明共享变量并从内核和 vDSO 访问它,因此您可以使用它:声明一个新变量,并在调用它时从 vDSO 递增它。

【讨论】:

  • 据我了解,这些共享变量在用户态是只读的。因此,这段代码可以编译,但如果我取消注释增量,我就会遇到段错误。 notrace int __vdso_myvdso(void) {// ++*vmyvar; /* The program will crash if I uncomment this*/`return *vmyvar;`}我做错了吗?我可以修改其他变量吗?或者我可以禁用这个只读保护吗?
  • 抱歉,您是对的,VVAR 仅提供来自 vDSO 的只读访问权限。
  • 我正在尝试禁用此只读保护。你知道我该怎么做吗?我从vma.cVM_WRITE 标志添加到arch_setup_additional_pages(…) 中的install_special_mapping 但这还不够(当我增加变量时,我仍然会遇到段错误)。你知道额外的改编是什么吗?
猜你喜欢
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
相关资源
最近更新 更多