Thank you to both Andrii and Toke! It's been extremely helpful to read your 
responses. Having conversations like these really helps me when I go into the 
source code and try to understand the overall intent of it. I'm going to try 
and summarize the conversation to confirm my understanding.

bpf_probe_read() will read any valid kernel memory (nothing new here). If the 
memory is already available to be read in the program (e.g. in tracepoint 
args), then __builtin_memcpy can be used and will potentially throw attach-time 
errors if reading structs incorrectly (for some reason I don't think we 
clarified).

CO-RE can guarantee valid memory reads because of the nature of being able to 
check offsets and relocations at load time rather than attach time or just 
returning garbage data with no errors.

To build CO-RE programs you need a vmlinux file (not to be confused with the 
header, vmlinux.h) which is normally found at /sys/kernel/btf/vmlinux on 
systems that have been compiled with pahole and CONFIG_DEBUG_INFO_BTF=y. Having 
the vmlinux.h file is helpful because it replaces kernel headers and makes 
building a bit nicer, but isn't necessary. Once compiled, CO-RE programs should 
be able to run on any system  that has a vmlinux file in one of the locations 
listed here: https://github.com/libbpf/libbpf/blob/master/src/btf.c#L4583.

For earlier kernels, it's possible to generate a vmlinux file (and this is one 
of the spots I'm a bit murky on) with pahole -J, but I'm not sure what you are 
supposed to target when running that? Just the compiled kernel binary? 
Something else?

BTF is just a type format that can describe C data-types. Almost like a 
meta-language? I've personally not looked at the source for BTF yet, but it 
seems to be versatile enough that it's useful for CO-RE for describing internal 
data structures from the kernel, but it's also useful for a variety of other 
things (like map declarations) and will likely be increasingly relied on in 
future iterations of BPF, both CO-RE and otherwise. BTF support mainly comes 
from the compiler (which I do believe clang 10+ works, just from my experience. 
I'm primarily using clang 10 right now) and libbpf supporting it, not 
necessarily the kernel (except for CO-RE with the vmlinux).

Again, appreciate the responses. I've been building with BPF/libbpf about a 
year now and still feel like I've only scratched the surface. Reading source 
code is great, but sometimes it just really helps to get high-level ideas as 
well!

-Tristan


-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#1959): https://lists.iovisor.org/g/iovisor-dev/message/1959
Mute This Topic: https://lists.iovisor.org/mt/80853471/21656
Group Owner: [email protected]
Unsubscribe: https://lists.iovisor.org/g/iovisor-dev/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to