feat: Implement BPF struct_ops example with custom kernel module and user-space loader

This commit is contained in:
github-actions[bot]
2025-11-10 18:30:48 +00:00
parent ca927133b7
commit 5ce10be3e1
6 changed files with 352 additions and 132 deletions

View File

@@ -0,0 +1,74 @@
# BPF struct_ops Example with Custom Kernel Module
This example demonstrates BPF struct_ops functionality using a custom kernel module that defines struct_ops operations triggered via a proc file write.
## Overview
struct_ops allows BPF programs to implement kernel subsystem operations dynamically. This example includes:
1. **Kernel Module** (`module/hello.c`) - Defines `bpf_testmod_ops` struct_ops with three callbacks
2. **BPF Program** (`struct_ops.bpf.c`) - Implements the struct_ops callbacks in BPF
3. **User-space Loader** (`struct_ops.c`) - Loads the BPF program and triggers callbacks via `/proc/bpf_testmod_trigger`
## Building and Running
### 1. Build the kernel module:
```bash
cd module
make
cd ..
```
### 2. Load the kernel module:
```bash
sudo insmod module/hello.ko
```
### 3. Build the BPF program:
```bash
make
```
### 4. Run the example:
```bash
sudo ./struct_ops
```
### 5. Check kernel logs:
```bash
sudo dmesg -w
```
You should see output like:
```
bpf_testmod loaded with struct_ops support
bpf_testmod_ops registered
Calling struct_ops callbacks:
BPF test_1 called!
test_1() returned: 42
BPF test_2 called: 10 + 20 = 30
test_2(10, 20) returned: 30
BPF test_3 called with buffer length 21
First char: H
test_3() called with buffer
```
### 6. Clean up:
```bash
sudo rmmod hello
make clean
```
## How It Works
1. The kernel module registers a custom struct_ops type `bpf_testmod_ops`
2. It creates `/proc/bpf_testmod_trigger` - writing to this file triggers the callbacks
3. The BPF program implements the three callbacks: `test_1`, `test_2`, and `test_3`
4. The user-space program loads the BPF program and periodically writes to the proc file
5. Each write triggers all registered callbacks, demonstrating BPF struct_ops in action
## Troubleshooting
- If you get "Failed to attach struct_ops", make sure the kernel module is loaded
- Check `dmesg` for any error messages from the kernel module or BPF verifier
- Ensure your kernel has CONFIG_BPF_SYSCALL=y and supports struct_ops