Platform nasıl çalışıyor
Tarayıcın düşündüğünden fazlasını yapıyor. TCC (Tiny C Compiler) WASM üzerinden client-side çalışarak, sen yazarken anında syntax kontrolü sağlıyor. Sunucuya tek bir istek bile gitmiyor.
Run’a bastığında kodun local storage’a kaydedilir ve backend’e gönderilir.
Backend kodu clang ile BPF objesine derler, ardından sadece senin submission’ın için sıfırdan bir VM ayağa kaldırır.
VM
Her submission kendi izole sandbox’ında çalışır:
- 1 vCPU (ARM64), 64MB RAM
- Linux 6.1 kernel, tam BPF/tracepoint desteği
- Ağ erişimi yok, tamamen izole
- 2 saniyelik ömür, sonra yok edilir
VM’ler bare-metal ARM (Graviton) üzerinde 50ms altında boot oluyor. Firecracker microVM teknolojisi sayesinde her VM milisaniyeler içinde ayağa kalkar. Guest kernel sadece BPF programları çalıştırmaya yetecek kadar minimal tutuluyor.
VM, statik linklenmiş bir init process’e boot eder. Bu process minimum filesystem mount’larını yapar, BPF objeni yükler, exercise senaryosunu çalıştırır ve sonuçları geri stream eder.
Event’ler nasıl çıkıyor
Kodun ep_platform.h’ı include eder. Bu header arka planda bir BPF ring buffer map’i oluşturur.
DEBUG_STR, DEBUG_NUM ve SUBMIT_STR makroları yapılandırılmış event’leri bu ring buffer’a yazar.
VM içindeki init process ring buffer’ı poll eder ve event’leri vsock üzerinden host’a iletir. Host bunları SSE (Server-Sent Events) olarak gerçek zamanlı tarayıcına stream eder.
Geliştirici araçları
Aynı SSE stream’i bir dizi inceleme aracını besler; böylece kernel’in programınla gerçekte ne yaptığını görürsün — yalnızca nihai cevabı değil.
Çalışma zamanı inceleme sekmeleri
Kodun derlenir derlenmez backend, BPF objesini disassemble edip geri stream eder:
- Bytecode, derlenmiş komutları gösterir; her biri programın
.BTF.extdebug bilgisi üzerinden geldiği C satırına eşlenir. Her komut grubu, o satırın gerçek C kaynak metniyle başlıklandırılır; bu sayede hangi C ifadesinin hangi komutları ürettiğini görebilirsin. Koşullu ve koşulsuz atlamalar gutter’da oklarla gösterilir; her ok hedefini ham komut indeksi yerine ilgili C kaynak satırıyla etiketler (örn.→ L84). Döngü geri-kenarları ileri atlamalardan farklı renkle vurgulanır. Bir atlama hedefinin C kaynak eşlemesi yoksa (derleyici içi kod), komut indeksine geri döner. Disassembler saf-Rust bir eBPF decoder’dır ve komut komutllvm-objdumpile karşılaştırılmıştır. - Complexity, komut, map ve loop back-edge sayılarını doğrudan ELF’ten çıkarır; böylece bir program çalışmadan önce verifier limitlerine ne kadar yakın olduğunu görürsün.
Program VM’de çalıştığında loader daha fazla durumu yakalayıp guest message olarak stream eder:
- Maps, run’dan sonra BPF map’lerinin içeriğini iki grup halinde gösterir. Senin map’lerin (
SEC(".maps")ile tanımladıkların) map id ile yeniden açılıp hex artı tamsayı/string görünümüne çözümlenir. Derleyici dahilileri (varsayılan olarak daraltılmış), clang ve libbpf’in otomatik oluşturduğu.rodata,.bssve.datamap’lerini içerir; bunlar loader’da isimlerine göre değil,bpf_map__is_internal()ile sınıflandırılır..rodatastring havuzu NUL karakterinde bölünür ve her string literali ayrı ayrı gösterilir. Hiç yazmadığın.rodata.str1.1adlı bir map görürsen, bu daraltılmış grupta yer alır. - Rate, yayılan her event’i VM’de yakalanan bir
CLOCK_MONOTONIC_RAWtimestamp’ine göre gruplar; böylece histogram gerçek tetiklenme oranını yansıtır. - Steps, bu timestamp’li event’leri tek tek yeniden oynatır.
- Flame, kernel stack’lerini (bunları
bpf_get_stackid()ile kaydeden programlar için) bir flame graph’a katlar ve adresleri guest’in/proc/kallsyms’ine göre çözer. - Timeline, bir program reddedildiğinde kernel verifier’ının log’unu sıralı bir gezinti olarak yeniden çizer. Debug bilgisi mevcutsa, verifier reddi ayrıca kaynak bilgisi de gösterebilir: ihlal eden erişimin hangi struct üyesine veya stack değişkenine karşılık geldiğini DWARF debug bilgisinden çekerek gösterir.
Editör araçları
SEC("...")otomatik tamamlama, guest kernel’in kendisinden (syscall tablosu, trace-event header’ları veSystem.map) çıkarılan bir katalogla beslenir; böylece yalnızca gerçekten var olan attach noktalarını önerir.- Helper otomatik tamamlama — C gövdesinde
bpf_önekini yazmaya başlayınca eşleşen eBPF helper fonksiyonları listelenir. Birini seçtiğinde imza, parametreler, dönüş değeri ve kernel belgelerine bağlantı içeren bir belge paneli açılır. Aynı panel, yazmış olduğun bir helper adının üzerine gelince de görünür. Araç çubuğundaki aranabilir “Browse eBPF helpers” paleti, kod yazmadan tüm helper’ları keşfetmeni sağlar. - Cevap farkı — submission yanlışsa, events paneli beklenen cevabı gönderiminle yan yana gösterir; her ikisi de string veya sayı olarak çözümlenir, böylece tam olarak nerede ayrıştığını görebilirsin. Programın birden fazla cevap üretiyorsa, fark yerine “multiple answers” notu görünür.
- Kod katlama — gutter’daki katlama okları odaklanmadığın blokları daraltmanı sağlar.
- Geliştirici detay geçişi — araç çubuğundaki bir geçiş, ek panelleri etkinleştirir: compile → load → attach → run → result adımlarını gösteren bir pipeline şeridi ve derleme, boot ile çalıştırma aşamalarına ait zamanlama rozetleri. Bunlar varsayılan olarak kapalıdır; platformun arka planda ne yaptığını incelemek istediğinde aç.
Reddedilen bir run’ın verifier mesajı ilgili satırda satır içi gösterilir ve küçük bir kural tablosu, yaygın derleme/verifier hatalarını somut düzeltme önerilerine dönüştürür.