如何在 eBPF 程序中检索任务的 sessionid?
How can I retrieve a task's sessionid in an eBPF program?
我想从 eBPF 程序中的任务结构中检索 sessionid。我的 eBPF 程序中有以下代码:
struct task_struct *task;
u32 sessionid;
task = (struct task_struct *)bpf_get_current_task();
sessionid = task->sessionid;
这会运行,但 sessionid 总是以 -1 结束。我在 this 的回答中读到我可以使用 task_session
来检索它,但我收到有关无效内存访问的错误。我相信我需要使用 bpf_probe_read
将 task
指向的 task_struct
移到堆栈上,但我无法让它工作。有什么我想念的吗?
在进一步研究 task_struct
结构后,我意识到你可以这样做:
struct task_struct *task;
struct pid_link pid_link;
struct pid pid;
unsigned int sessionid;
task = (struct task_struct *)bpf_get_current_task();
bpf_probe_read(&pid_link, sizeof(pid_link), (void *)&task->group_leader->pids[PIDTYPE_SID]);
bpf_probe_read(&pid, sizeof(pid), (void *)pid_link.pid);
sessionid = pid.numbers[0].nr;
我想从 eBPF 程序中的任务结构中检索 sessionid。我的 eBPF 程序中有以下代码:
struct task_struct *task;
u32 sessionid;
task = (struct task_struct *)bpf_get_current_task();
sessionid = task->sessionid;
这会运行,但 sessionid 总是以 -1 结束。我在 this 的回答中读到我可以使用 task_session
来检索它,但我收到有关无效内存访问的错误。我相信我需要使用 bpf_probe_read
将 task
指向的 task_struct
移到堆栈上,但我无法让它工作。有什么我想念的吗?
在进一步研究 task_struct
结构后,我意识到你可以这样做:
struct task_struct *task;
struct pid_link pid_link;
struct pid pid;
unsigned int sessionid;
task = (struct task_struct *)bpf_get_current_task();
bpf_probe_read(&pid_link, sizeof(pid_link), (void *)&task->group_leader->pids[PIDTYPE_SID]);
bpf_probe_read(&pid, sizeof(pid), (void *)pid_link.pid);
sessionid = pid.numbers[0].nr;