Linux kernel 使用EACCES注册Linux内核硬件断点失败

Linux kernel 使用EACCES注册Linux内核硬件断点失败,linux-kernel,x86,hardware,breakpoints,drivers,Linux Kernel,X86,Hardware,Breakpoints,Drivers,我正在我的驱动程序中使用下面的代码,但是寄存器范围的断点返回一个EACESS错误 hw_breakpoint_init(&attr); attr.bp_addr = kallsyms_lookup_name(ksym_name); attr.bp_len = HW_BREAKPOINT_LEN_4; attr.bp_type = HW_BREAKPOINT_W | HW_BREAKPOINT_R; sample

我正在我的驱动程序中使用下面的代码,但是
寄存器范围的断点
返回一个
EACESS
错误

      hw_breakpoint_init(&attr);
        attr.bp_addr = kallsyms_lookup_name(ksym_name);
        attr.bp_len = HW_BREAKPOINT_LEN_4;
        attr.bp_type = HW_BREAKPOINT_W | HW_BREAKPOINT_R;

        sample_hbp = register_wide_hw_breakpoint(&attr, sample_hbp_handler, NULL);
                if (IS_ERR((void __force *)sample_hbp)) {
                        ret = PTR_ERR((void __force *)sample_hbp);
                        printk(KERN_INFO "Breakpoint registration failed:%d\n",ret);
                }
可能的原因是什么?我是否缺少将授予对硬件寄存器访问权限的
CONFIG
选项

附加信息:我的平台是X86_64,Linux


请提供帮助。

请指定您正在使用的Linux发行版和内核版本。顺便问一下,您是否检查了kallsyms_lookup_name()是否成功找到了所需的符号?还有一个问题:调用驱动程序的任务是否以root权限运行(或者确切地说,它是否具有CAP_SYS_ADMIN功能)?如果没有,则可能是-EACCES的原因。@Eugene kallsyms_lookup_name()返回正常。@Eugene,我添加了调试日志,发现perf_event_alloc回调失败。CAP\u SYS\u ADMIN check位于find\u get\u上下文回调中,该回调在perf\u event\u alloc之后调用。其他信息:register\u wide\u hw\u断点调用perf\u event\u create\u kernel\u计数器,该计数器进一步调用perf\u event\u alloc,然后查找\u get\u上下文。