This commit is contained in:
云微
2025-02-10 23:25:39 +00:00
parent 5e6225549b
commit 4cf80067a0
6 changed files with 137 additions and 10 deletions

View File

@@ -22,7 +22,7 @@ The papers demonstrate eBPF's versatility in accelerating systems, enhancing sec
If you have any suggestions or adding papers, please feel free to open an issue or PR. The list was created in 2023.10, New papers will be added in the future.
> Check out our open-source projects at [eunomia-bpf](https://github.com/eunomia-bpf) and eBPF tutorials at [bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial). I'm also looking for a PhD position in the area of systems and networking in 2024/2025. My [Github](https://github.com/yunwei37) and [email](yunwei356@gmail.com).
> Check out our open-source projects at [eunomia-bpf](https://github.com/eunomia-bpf) and eBPF tutorials at [bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial). I'm also looking for a PhD position in the area of systems and networking in 2024/2025. My [Github](https://github.com/yunwei37) and [email](mailto:yunwei356@gmail.com).
## XRP: In-Kernel Storage Functions with eBPF

View File

@@ -20,7 +20,7 @@ eBPF扩展的伯克利数据包过滤器是一种新兴的技术允许
如果您有任何建议或添加论文的意见请随时开放一个问题或PR。此列表创建于 2023.10,未来将添加新的论文。
> 如果您对 eBPF 有些进一步的兴趣的话,也可以查看我们在 [eunomia-bpf](https://github.com/eunomia-bpf) 的开源项目和 [bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) 的 eBPF 教程。我也在寻找 2024/2025 年系统和网络领域的 PhD 相关机会,这是我的 [Github](https://github.com/yunwei37) 和 [邮箱](yunwei356@gmail.com)。
> 如果您对 eBPF 有些进一步的兴趣的话,也可以查看我们在 [eunomia-bpf](https://github.com/eunomia-bpf) 的开源项目和 [bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) 的 eBPF 教程。我也在寻找 2024/2025 年系统和网络领域的 PhD 相关机会,这是我的 [Github](https://github.com/yunwei37) 和 [邮箱](mailto:yunwei356@gmail.com)。
## XRP: In-Kernel Storage Functions with eBPF

View File

@@ -1,5 +0,0 @@
# trace http2 request in go
TODO: make it work
from <https://github.com/iovisor/bcc/blob/master/libbpf-tools/funclatency.c>.

View File

@@ -0,0 +1,134 @@
# write a basic kernel module
## hello world
Writing a Linux kernel module involves creating code that can be loaded into and unloaded from the kernel dynamically, without rebooting the system. Heres a simple step-by-step guide to help you write a basic kernel module:
### 1. Set Up Your Environment
Make sure you have the Linux kernel headers installed and a suitable development environment ready. For Ubuntu or Debian, install them with:
```bash
sudo apt-get install linux-headers-$(uname -r) build-essential
```
### 2. Write the Kernel Module Code
Heres an example of a very basic Linux kernel module:
```c
// hello.c: A simple Linux kernel module
#include <linux/init.h> // Macros for module initialization
#include <linux/module.h> // Core header for loading modules
#include <linux/kernel.h> // Kernel logging macros
// Function executed when the module is loaded
static int __init hello_init(void)
{
printk(KERN_INFO "Hello, world!\n");
return 0; // Return 0 if successful
}
// Function executed when the module is removed
static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye, world!\n");
}
// Macros to define the modules init and exit points
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL"); // License type (GPL)
MODULE_AUTHOR("Your Name"); // Module author
MODULE_DESCRIPTION("A simple module"); // Module description
MODULE_VERSION("1.0"); // Module version
```
### 3. Create a Makefile
To compile the kernel module, youll need a `Makefile`. Here's a simple one:
```makefile
obj-m += hello.o # hello.o is the target
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
```
### 4. Compile the Module
Run the following command in the directory where your `hello.c` and `Makefile` are located:
```bash
make
```
This will generate a file called `hello.ko`, which is the compiled kernel module.
### 5. Load the Module
To insert the module into the kernel, use `insmod`:
```bash
sudo insmod hello.ko
```
### 6. Check the Logs
To see the output from the `printk` statements, use the `dmesg` command:
```bash
dmesg | tail
```
You should see something like:
```txt
[ 1234.5678] Hello, world!
```
### 7. Remove the Module
To unload the module, use `rmmod`:
```bash
sudo rmmod hello
```
Again, check the logs using `dmesg`:
```bash
sudo dmesg | tail
```
You should see:
```txt
[ 1234.9876] Goodbye, world!
```
### 8. Clean Up
To clean up the build files, run:
```bash
make clean
```
### Notes
- **License**: The `MODULE_LICENSE("GPL")` ensures the module is GPL-compliant, which allows it to use symbols (functions) exported by the kernel.
- **Debugging**: Use `printk` for logging within the module. It behaves similarly to `printf` but is designed for kernel space.
- **Module Parameters**: You can add parameters to modules using `module_param()` to pass arguments when the module is loaded.
### Next Steps
Once you are familiar with this basic example, you can explore:
- Writing more advanced modules that interact with hardware or the filesystem.
- Using kernel-specific APIs like work queues, kthreads, or handling interrupts.
- Diving into eBPF or loadable kernel module techniques for debugging and tracing kernel events.

View File

@@ -1,7 +1,5 @@
# eBPF Tutorial by Example: Learning CO-RE eBPF Step by Step
[![CI](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/main.yml/badge.svg)](https://github.com/eunomia-bpf/bpf-developer-tutorial/actions/workflows/main.yml)
This is a development tutorial for eBPF based on CO-RE (Compile Once, Run Everywhere). It provides practical eBPF development practices from beginner to advanced, including basic concepts, code examples, and real-world applications. Unlike BCC, we use frameworks like libbpf, Cilium, libbpf-rs, and eunomia-bpf for development, with examples in languages such as C, Go, and Rust.
This tutorial does not cover complex concepts and scenario introductions. Its main purpose is to provide examples of eBPF tools (**very short, starting with twenty lines of code!**) to help eBPF application developers quickly grasp eBPF development methods and techniques. The tutorial content can be found in the directory, with each directory being an independent eBPF tool example.

View File

@@ -66,7 +66,7 @@ Attaching 1 probe...
按Ctrl-C后打印进程的系统调用计数。
- @: 表示一种特殊的变量类型称为map可以以不同的方式来存储和描述数据。你可以在@后添加可选的变量名(如@num)用来增加可读性或者区分不同的map。
- []: 可选的中括号允许设置map的关键字比较像关联数组。
- [] 可选的中括号允许设置map的关键字比较像关联数组。
- count(): 这是一个map函数 - 记录被调用次数。因为调用次数根据comm保存在map里输出结果是进程执行系统调用的次数统计。
Maps会在bpftrace结束(如按Ctrl-C)时自动打印出来。