python взаимодействие с картами БНФ - PullRequest
0 голосов
/ 23 апреля 2020

Мне интересно, можно ли легко инициализировать карты BPF из python пространства пользователя. Для моего проекта у меня будет страшно выглядящий массив 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 структура

1 Ответ

0 голосов
/ 24 апреля 2020

Решение на основе комментария pchaigno. Ключевыми моментами, на которые следует обратить внимание, является использование c_types для обеспечения согласованности типов в средах и извлечение таблицы путем индексации программного объекта 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))
...