gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1389Shell 137Markdown 80Rust 802602 Definitions

⎇ main docs/evidencia/tasas-kernel-2026-08-29/bpf_iter_task.bpf.c C · 72 lines · 1.8 KB History Who touched what raw

SDD 25 §9.5: el iterador BPF, medido — y H7 pasa a tener precio 09168bf1e · Sergio ·

1// Programa BPF del experimento §9.5.1 de SDD 25: un iterador `task` que emite
2// un registro BINARIO por proceso, para comparar contra el barrido de texto de /proc.
3//
4// No usa vmlinux.h a propósito (haría falta bpftool, que no está en la máquina ni
5// en el store): declara a mano el mínimo de tipos con `preserve_access_index`, que
6// es lo que hace CO-RE reubicar los offsets contra el BTF del kernel en carga.
7#include <linux/bpf.h>
8#include <bpf/bpf_helpers.h>
9#include <bpf/bpf_core_read.h>
10
11char LICENSE[] SEC("license") = "GPL";
12
13typedef unsigned int u32;
14typedef unsigned long long u64;
15
16struct bpf_iter_meta {
17	struct seq_file *seq;
18	u64 session_id;
19	u64 seq_num;
20} __attribute__((preserve_access_index));
21
22struct task_struct {
23	unsigned int __state;
24	int pid;
25	int tgid;
26	struct task_struct *real_parent;
27	char comm[16];
28	u64 utime;
29	u64 stime;
30} __attribute__((preserve_access_index));
31
32struct bpf_iter__task {
33	struct bpf_iter_meta *meta;
34	struct task_struct *task;
35} __attribute__((preserve_access_index));
36
37// El mismo puñado de campos que sandokan saca hoy de /proc/<pid>/stat.
38struct registro {
39	int pid;
40	int ppid;
41	u32 estado;
42	u32 _pad;
43	u64 utime;
44	u64 stime;
45	char comm[16];
46};
47
48SEC("iter/task")
49int barrido(struct bpf_iter__task *ctx)
50{
51	struct task_struct *t = ctx->task;
52	struct registro r = {};
53
54	if (!t)
55		return 0;
56
57	// El iterador `task` recorre HILOS. sandokan cuenta procesos ⇒ sólo los
58	// líderes de grupo, que es exactamente lo que hay bajo /proc/<pid>.
59	r.pid = BPF_CORE_READ(t, pid);
60	r.ppid = BPF_CORE_READ(t, tgid);
61	if (r.pid != r.ppid)
62		return 0;
63
64	r.ppid = BPF_CORE_READ(t, real_parent, tgid);
65	r.estado = BPF_CORE_READ(t, __state);
66	r.utime = BPF_CORE_READ(t, utime);
67	r.stime = BPF_CORE_READ(t, stime);
68	BPF_CORE_READ_INTO(&r.comm, t, comm);
69
70	bpf_seq_write(ctx->meta->seq, &r, sizeof(r));
71	return 0;
72}