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…
SDD 25 §9.5: el iterador BPF, medido — y H7 pasa a tener precio
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}