python与BPF映射的交互

2024-06-12 16:57:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否有一个从python用户空间初始化BPF映射的简单方法。对于我的项目,我将为每个进程提供一个可怕的NxN 2d浮点数组。为了简单起见,让我们假设N在进程之间是常数(比如5)。为了实现对这些数据的内核支持,我可以做如下操作:

b = BPF(text = """
    typedef struct
    {
        float transMat[5][5];
    } trans_struct;



    BPF_HASH(trans_mapping, char[16], trans_struct);

    .....
""")

我想知道是否有一种简单的方法可以从python初始化这个映射。比如:

for ele in someDictionary:
    #asume someDitionary has mapping (comm -> 5x5 float matrix)
    b["trans_mapping"].insert(ele, someDictionary[ele])

我想我困惑的关键是——1)所有映射方法都可供用户使用,2)从python对象到c结构时如何确保类型一致性


Tags: 项目方法用户trans进程空间数组float
1条回答
网友
1楼 · 发布于 2024-06-12 16:57:31

基于pchaigno注释的解决方案需要注意的关键是使用c_类型以确保跨环境的类型一致性,并通过索引BPF程序对象来提取表。由于我们能够通过索引获取地图,因此get_table()函数现在被认为已经过时。这种格式提供了从python前端将数据加载到地图中的结构,但并不完全符合我的问题的细节

from time import sleep, strftime
from bcc import BPF
from bcc.utils import printb
from bcc.syscall import syscall_name, syscalls
from ctypes import *


    b = BPF(text = """

    BPF_HASH(start, u32, u64);


    TRACEPOINT_PROBE(raw_syscalls, sys_exit)
    {
        u32 syscall_id = args->id;
        u32 key = 1;
        u64 *val;
        u32 uid = bpf_get_current_uid_gid();

        if (uid == 0)
        {
            val = start.lookup(&key); //find value associated with key 1
            if (val)
                bpf_trace_printk("Hello world, I have value %d!\\n", *val);

        }
        return 0;
    }
    """)

    thisStart = b["start"]
    thisStart[c_int(1)] = c_int(9) #insert key-value part 1->9


    while 1:
        try:
            (task, pid, cpu, flags, ts, msg) = b.trace_fields()
        except KeyboardInterrupt:
            print("Detaching")
            exit()
        print("%-18.9f %-16s %-6d %s" % (ts, task, pid, msg))

相关问题 更多 >