eBPF 获取内核结构体属性
由于eBPF 内核中内存读取的限制,默认情况是不能直接访问内核指针属性的。
需要使用bpf_core_read , bpf_core_read_str等读取出来才能继续操作
比如下面检查特定进程的例子
#define TASK_COMM_LEN 16 const volatile char target_comm[TASK_COMM_LEN ]; const volatile bool target_sub_process = true; /// /// \brief process_check /// \return 1 not match process with target_comm /// 0 match this process /// static __always_inline int process_check(){ char bpf_comm[TASK_COMM_LEN] = {0}; long len = bpf_get_current_comm(bpf_comm,TASK_COMM_LEN); if (bpf_strncmp(bpf_comm,TASK_COMM_LEN,target_comm)) return 1; else if( target_sub_process ) { struct task_struct* task = (struct task_struct *)bpf_get_current_task(); struct task_struct* task_parent; //task_parent = task->parent //这句eBPF 验证器容易产生invaild read之类错误 bpf_core_read(&task_parent, sizeof(void*), &task->parent);//替换成这样即可消除 int err = bpf_core_read(&bpf_comm, TASK_COMM_LEN, &task_parent->comm); bpf_printk("#### task_parent_comm = %s \n " , bpf_comm); if (bpf_strncmp(bpf_comm,TASK_COMM_LEN,target_comm)) //比较 return 1; } return 0; }