helpers
helper函数1形式类似于系统调用,是内核暴漏给bpf程序的特殊函数,考虑到bpf程序运行在内核态,因而不会有上下文切换的开销,实际与kernel module中调用kernel函数类似,但由于调用局限在给定的范围内,因而能够在提供灵活性的同时,保证ebpf程序执行的安全性
bpf_get_current_cgroup_id
获取当前task所属cgroup的cgroup_id
- cgroup_id 出现在 cgroup v2 中,实际为cgroup对应 kfs node 的id
bpf_get_current_pid_tgid
获取当前cpu上执行任务的 pid, tgid
/*
* bpf_get_current_pid_tgid
*
* Get the current pid and tgid.
*
* Returns
* A 64-bit integer containing the current tgid and pid, and
* created as such:
* *current_task*\ **->tgid << 32 \|**
* *current_task*\ **->pid**.
*/
static __u64 (*bpf_get_current_pid_tgid)(void) = (void *) 14;
在 Linux 系统中,进程 ID(PID)和线程组 ID(TGID)是两个不同的概念
- 进程 ID(PID):每个正在运行的进程都有一个唯一的 ID。虽然在某些情况下 PID 可以重复使用(例如,当一个进程终止时,其 PID 可能会立即被新进程重用),但通常情况下每个进程都具有唯一的 PID。PID 用于在系统内部标识、管理和跟踪进程。
- 线程组 ID(TGID):线程组 ID 是所有线程的唯一标识符。与进程不同,Linux 系统将线程视为进程和线程组之间的一种关系,因此 TGID 表示当前线程所属的进程或线程组的 ID。也就是说,在单线程程序中,PID 和 TGID 是相同的。但在多线程程序中,每个线程都有自己的 ID,但它们共享相同的 TGID
总结来说:
- 每个进程都有一个唯一的 PID。
- 所有线程共享相同的 TGID。
- 在单线程程序中,PID 和 TGID 相同。
- 在多线程程序中,每个线程都有自己的 PID,但它们共享相同的 TGID
通常意义上的 pid 为 tgid
__u64 pid_tgid = bpf_get_current_pid_tgid();
__u32 tgid = pid_tgid >> 32;
__u32 pid = pid_tgid;
bpf_get_current_uid_gid
获取当前用户的 uid 和 gid
/*
* bpf_get_current_uid_gid
*
* Get the current uid and gid.
*
* Returns
* A 64-bit integer containing the current GID and UID, and
* created as such: *current_gid* **<< 32 \|** *current_uid*.
*/
static __u64 (*bpf_get_current_uid_gid)(void) = (void *) 15;