如何在eBPF程序中检索任务的sessionid?

时间:2018-01-24 14:51:18

标签: linux linux-kernel bpf ebpf

我想从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_readtask_structtask移到堆栈中,但我无法将其发挥作用。我有什么遗失的吗?

1 个答案:

答案 0 :(得分:2)

经过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;