Я пытаюсь разработать функцию, которая позволила бы ядру (ядро 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 в приложение / много пользователей?Любое предложение будет очень полезно.