BPF Map'ler ve State Yonetimi
Maps and multiple programs
Şimdiye kadar her alıştırmada tek bir eBPF programı kullandık. Peki farklı event’ler arasında bilgi ilişkilendirmemiz gerekirse ne olur?
Örneğin: Bir process başladığında adını biliyoruz. Exit ettiğinde ise exit code’unu biliyoruz. Belirli bir code ile exit eden process’lerin adını öğrenmek istersek ne yapmalıyız?
Birden fazla eBPF programı
Tek bir dosyada birden fazla program tanımlayabilirsiniz, her biri farklı event’lere hook olur.
Her program bağımsızdır ve kendi event’i tetiklendiğinde çalışır.
Birden fazla program gerektiren yaygın bir durum entry+exit event çiftidir.
Entry noktasında girdi bilgilerine (argument’ler, process bilgisi) sahibiz.
SEC("tracepoint/sched/sched_process_exec")
int on_process_start(struct trace_event_raw_sched_process_exec *ctx) {
// When the process starts execution
}
Exit noktasında ise çıktı bilgilerine (return value’lar, exit code’lar) sahibiz.
SEC("tracepoint/syscalls/sys_enter_exit")
int on_process_exit(struct trace_event_raw_sys_enter *ctx) {
// When the process calls exit (program termination)
// ctx->args[0] contains the exit code
}
Her iki event’i ilişkilendirmek için, program çağrıları arasında veriyi kalıcı hale getirmemiz gerekiyor.
State’i kalıcı hale getirme
Map’ler, eBPF program çağrıları arasında kalıcı olan veri yapılarıdır.
eBPF’te birçok türde map bulunur. Bu alıştırmada hash map (key-value store) kullanacağız.
Map kullanımı oldukça basittir. Önce bu __uint/__type macro’ları ile bir struct tanımlayın.
struct {
__uint(type, BPF_MAP_TYPE_HASH);
__uint(max_entries, 1024);
__type(key, u64); // What you use to look up
__type(value, char[16]); // What you store
} my_map SEC(".maps");
Veri saklamak için, kopyalanacak veriye bir pointer iletirsiniz:
u64 key = 12345;
char value[16] = "hello";
bpf_map_update_elem(&my_map, &key, value, BPF_ANY);
Value’ya bir pointer almak için:
char *stored = bpf_map_lookup_elem(&my_map, &key);
if (!stored) { // Key not found
return 0;
}
// Use `stored` (it's a pointer to the char[16] array)
Map’ten bir entry silmek için:
bpf_map_delete_elem(&my_map, &key);
Görev
exit_with_code adlı bir program çalışıp exit edecek. Exit code’unu SUBMIT_NUM(code) ile gönderin.
Başlangıç kodu mantığın büyük bölümünü zaten içeriyor, sonuçta bu bir giriş bölümü.
Yapmanız gereken
Process adının "exit_with_code" ile eşleşip eşleşmediğini kontrol edin ve eşleşiyorsa exit code’u gönderin.
Compare two strings for equality
- Args:
char* bufdynamic buffer to compareu32 buf_szlength of dynamic bufferconst char* buf2literal string to compare against