python 与 BPF 映射的交互
python interaction with BPF maps
我想知道是否有一种易于从 python 用户空间初始化 BPF 映射的方法。对于我的项目,我将为每个进程设置一个看起来很吓人的 NxN 二维浮点数组。为简单起见,假设 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) 是否所有 map 方法都可供用户使用,2) 在从 python 对象到 c 结构[=13] 时我们如何确保类型一致性=]
基于 pchaigno 评论的解决方案——需要注意的关键是使用 c_types 来确保跨环境的类型一致性,并通过索引 BPF 程序对象来提取 table。由于我们能够通过索引获取地图,因此 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))
我想知道是否有一种易于从 python 用户空间初始化 BPF 映射的方法。对于我的项目,我将为每个进程设置一个看起来很吓人的 NxN 二维浮点数组。为简单起见,假设 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) 是否所有 map 方法都可供用户使用,2) 在从 python 对象到 c 结构[=13] 时我们如何确保类型一致性=]
基于 pchaigno 评论的解决方案——需要注意的关键是使用 c_types 来确保跨环境的类型一致性,并通过索引 BPF 程序对象来提取 table。由于我们能够通过索引获取地图,因此 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))