【发布时间】:2015-06-06 10:44:11
【问题描述】:
我正在关注this article实现android linux内核与用户空间的通信。
我使用 insmod 内核将我的内核插入 Android avd 金鱼内核,然后我使用 cat /proc/kmsg 观察内核消息,但我发现程序没有按预期执行。这是我的代码:
void hello_nl_recv_msg(struct sk_buff *skb)
{
struct nlmsghdr *nlh;
int pid;
struct sk_buff *skb_out;
int msg_size;
char *msg = "Hello from kernel";
int res;
printk(KERN_INFO "Entering: %sn", __FUNCTION__);
msg_size = strlen(msg);
nlh = (struct nlmsghdr *)skb->data;
printk(KERN_INFO "Netlink received msg payload:%sn", (char *)nlmsg_data(nlh));
pid = nlh->nlmsg_pid; //pid of sending process
skb_out = nlmsg_new(msg_size, 0);
if (!skb_out)
{
printk(KERN_ERR "Failed to allocate new skbn");
return;
}
nlh = nlmsg_put(skb_out, 0, 0, NLMSG_DONE, msg_size, 0);
NETLINK_CB(skb_out).dst_group = 0; //not in mcast group
strncpy(nlmsg_data(nlh), msg, msg_size);
res = nlmsg_unicast(nl_sk, skb_out, pid);
if (res < 0)
printk(KERN_INFO "Error while sending bak to usern");
}
int init_module()
{
printk("Entering: %sn", __FUNCTION__);
nl_sk = netlink_kernel_create(&init_net, NETLINK_USER, 0, hello_nl_recv_msg, NULL, THIS_MODULE);
printk("%s",nl_sk);
// nl_sk = netlink_kernel_create(NETLINK_USER, input);
//if (!nl_sk)
//{
// printk(KERN_ALERT "Error creating socket.n");
// return -10;
//}
return 0;
}
我发现程序执行的时候
nl_sk = netlink_kernel_create(&init_net, NETLINK_USER, 0, hello_nl_recv_msg, NULL, THIS_MODULE);
内核返回-1或其他整数,无法执行函数“hello_ne_recv_msg”。我用的是android avd,内核是goldfish 2.6。请帮助我,谢谢。
【问题讨论】:
-
你为什么用
%s来打印nl_sk的值?另外,-1probably means-EPERM- “不允许操作”。 -
另外,您是如何确定
netlink_kernel_create返回-1 的?从definition for that function 的粗略一瞥,我只能看到它在错误时返回NULL。 -
我也刚刚意识到您使用的内核现在已经 6 岁了。您使用这么旧的内核有什么原因吗?
-
@tangrs 我用 print("%s",nl_sk) ,因为我想看看会打印什么,没有实用功能。我想知道它为什么返回-1?请帮助我,非常感谢。
-
@tangrs 我用的是老内核,因为我用3.4内核插入内核时出现错误,所以我用老内核来测试。但我遇到了这个错误。
标签: android linux-kernel