Ошибка многоадресной рассылки сообщения ядро ​​(Android) в пространство пользователя: netlink_broadcast_filtered + 0x24 / 0x3d4 - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь разработать функцию, которая позволила бы ядру (ядро Android: 4.9.59) отправлять сообщение приложению / много пользователей, и я следовал этому примеру: Связь между ядром и приложением пользователя пространства

Однако, когда я пытаюсь вызвать функцию передачи сообщений из планировщика, я получаю следующую ошибку:

Неустранимое исключение

ПК находится на netlink_broadcast_filtered+ 0x24 / 0x3d4

LR находится на netlink_broadcast + 0x14 / 0x20

Внутри планировщика ядра (kernel / sched) я создал заголовок (custom_code.h), который содержит функциюотправить сообщение из ядра.Я не использую модуль Kernel для внедрения этого, потому что Android не поддерживает модули.Код внутри custom_code.h выглядит следующим образом:

#include <linux/sched.h>
#include <net/sock.h>
#include <linux/netlink.h>
#include <linux/skbuff.h>
#include <linux/string.h>

#define MY_GROUP    1 //For netlink socket
struct sock* socket; //For netlink socket
struct sk_buff* socket_buff; //For netlink socket

static inline void nl_receive_callback (struct sk_buff *skb)
{
    nlmsg_free(skb);
}

struct netlink_kernel_cfg cfg = {
    .input  = nl_receive_callback,
    .groups = 1,
};

static inline int kernel_send_nl_msg(void)
{
    struct nlmsghdr *nlsk_mh;
    char* msg = "hello from kernel";

    socket = netlink_kernel_create(&init_net, NETLINK_USERSOCK, &cfg);

    socket_buff = nlmsg_new(256, GFP_KERNEL);
    nlsk_mh = nlmsg_put(socket_buff, 0, 0, NLMSG_DONE, strlen(msg), 0);
    //NETLINK_CB(socket_buff).pid = 0;    // kernel pid pid is deprecated
    NETLINK_CB(socket_buff).portid = 0;
    NETLINK_CB(socket_buff).dst_group = MY_GROUP;
    strcpy(nlmsg_data(nlsk_mh), msg);

    nlmsg_multicast(socket, socket_buff, 0, MY_GROUP, GFP_KERNEL);
    pr_info("%s", msg);//Print out the message to kernel

    return 0;
}

Я вызываю kernel_send_nl_msg из функции sugov_start (struct cpufreq_policy * policy) внутри cpufreq_schedutil.c (kernel / sched / cpufreq_schedutil.c)Я собрал все ядро ​​и прошил его на устройстве Android.

Мой модифицированный код внутри ядра / sched / cpufreq_schedutil.c выглядит следующим образом:

static int sugov_start(struct cpufreq_policy *policy)
{
    struct sugov_policy *sg_policy = policy->governor_data;
    unsigned int cpu;

    sg_policy->up_rate_delay_ns =
        sg_policy->tunables->up_rate_limit_us * NSEC_PER_USEC;
    sg_policy->down_rate_delay_ns =
        sg_policy->tunables->down_rate_limit_us * NSEC_PER_USEC;
    update_min_rate_limit_us(sg_policy);
    sg_policy->last_freq_update_time = 0;
    sg_policy->next_freq = UINT_MAX;
    sg_policy->work_in_progress = false;
    sg_policy->need_freq_update = false;
    sg_policy->cached_raw_freq = 0;

    for_each_cpu(cpu, policy->cpus) {
        struct sugov_cpu *sg_cpu = &per_cpu(sugov_cpu, cpu);

        memset(sg_cpu, 0, sizeof(*sg_cpu));
        sg_cpu->sg_policy = sg_policy;
        sg_cpu->flags = 0;
        sugov_start_slack(cpu);
        sg_cpu->iowait_boost_max = policy->cpuinfo.max_freq;
        cpufreq_add_update_util_hook(cpu, &sg_cpu->update_util,
                         policy_is_shared(policy) ?
                            sugov_update_shared :
                            sugov_update_single);
    }
        if(kernel_send_nl_msg() != 0)
            pr_info("Error sending message from Kernel using socket");

    return 0;
}

После перепрошивки образа ядра на устройство и попытки загрузки вышеупомянутой ошибки передается устройством(даже без загрузки).

Мой вопрос об ошибке следующий:

1) В чем может быть проблема, вызывающая ошибку?

2) Как можноЯ успешно отправляю сообщения из ядра Android в приложение / много пользователей?Любое предложение будет очень полезно.

...