我正在尝试编写android的内核模块与用户空间服务进行通信,以便我的应用程序可以显示关于内核的一些信息。到目前为止,我已经尝试了几个我在网上找到的例子,但都没有成功。这个想法是为了让内核发送更新,然后服务才会接收它们。 ioctl不是解决方案,因为通信需要由事件驱动,并从内核启动。如果有人知道如何做到这一点,那么jni和内核模块的C代码将非常棒。如何使用netlink套接字进行内核 - 用户空间通信Android
2
A
回答
0
我已成功使用netlink套接字在Android中的内核和用户空间之间进行通信。要在非阻塞模式下使用套接字,请使用fcntl和select调用。
+0
当我找到时间时,我会再试一次,因为我们已经改变了使用其他方法的方法。如果真的有效,那么我第一次可能没有做对。谢谢! – TheMole
1
这里是我使用的一个代码片段(不包括错误检查返回值的简洁性),其中netlink套接字通信由内核驱动(即内核是发送者,用户程序是接收者)。
内核模块
#include <net/sock.h>
#include <net/netlink.h>
#include <linux/skbuff.h>
#include <string.h>
#define MY_GROUP 1
struct sock* socket;
struct sk_buff* socket_buff;
static void nl_receive_callback (struct sk_buff *skb)
{
nlmsg_free(skb);
}
static void kernel_send_nl_msg(void)
{
struct nlmsghdr *nlsk_mh;
char* msg = "hello kernel";
socket = netlink_kernel_create(&init_net, NETLINK_USERSOCK, 1, nl_receive_callback, NULL, THIS_MODULE);
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
NETLINK_CB(socket_buff).dst_group = MY_GROUP;
strcpy(nlmsg_data(nlsk_mh), msg);
nlmsg_multicast(socket, socket_buff, 0, MY_GROUP, GFP_KERNEL);
return;
}
你会解雇这件事为你的内核事件,例如的结果以响应ioctl或在您的中断处理中。
用户程序
#include <sys/socket.h>
#include <linux/netlink.h>
#define MY_GROUP 1
void user_recieve_nl_msg(void)
{
int sock_fd;
struct sockaddr_nl user_sockaddr;
struct nlmsghdr *nl_msghdr;
struct msghdr msghdr;
struct iovec iov;
char* kernel_msg;
sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_USERSOCK);
memset(&user_sockaddr, 0, sizeof(user_sockaddr));
user_sockaddr.nl_family = AF_NETLINK;
user_sockaddr.nl_pid = getpid();
user_sockaddr.nl_groups = MY_GROUP;
bind(sock_fd, (struct sockaddr*)&user_sockaddr, sizeof(user_sockaddr));
while (1) {
nl_msghdr = (struct nlmsghdr*) malloc(NLMSG_SPACE(256));
memset(nl_msghdr, 0, NLMSG_SPACE(256));
iov.iov_base = (void*) nl_msghdr;
iov.iov_len = NLMSG_SPACE(256);
msghdr.msg_name = (void*) &user_sockaddr;
msghdr.msg_namelen = sizeof(user_sockaddr);
msghdr.msg_iov = &iov;
msghdr.msg_iovlen = 1;
recvmsg(sock_fd, &msghdr, 0);
kernel_msg = (char*)NLMSG_DATA(nl_msghdr);
print("Kernel message: %s\n", kernel_msg); // print to android logs
}
close(sock_fd);
}
我在内核nlmsg_multicast()的使用,而不是nlmsg_unicast(),因为做一个单播,内核模块需要知道你的用户进程的进程ID(所以你需要在那里添加一些额外的实现)。
希望有帮助!
相关问题
- 1. Netlink用户空间和内核空间通信
- 2. 如何使用NETLINK套接字从PYTHON的内核空间传输数据?
- 3. 如何使用Netlink套接字接收内核事件?
- 4. 使用netlink套接字在Linux内核中的用户空间应用程序和字符设备之间进行通信时出错
- 5. 如何使用套接字netlink与新的netlink系列
- 6. 在用户空间使用netlink从内核接收数据时出错
- 7. 如何使用netlink监视用户空间deamon中的内核arp表?
- 8. 问题与netlink套接字:内核冻结
- 9. 使用netlink进行实时套接字监控inet_diag
- 10. 如何在内核和用户空间之间创建一个“netlink”?
- 11. 使用netlink虚拟机和内核通信
- 12. 如何在Android 4.0.3中通过套接字进行通信
- 13. Linux内核可以与用户空间进行通信的方式是什么?
- 14. 在用户空间和内核空间上执行进程
- 15. AF_NETLINK套接字(netlink)使用boost :: asio
- 16. 内存分配内核空间和用户空间进程
- 17. 内核和用户空间之间数据共享的套接字
- 18. 如何识别用户空间和内核空间之间的特定套接字?
- 19. 用户进程,终端和内核之间的通信
- 20. Linux内核空间和用户空间
- 21. 如何通过JavaScript通过TCP套接字进行通信?
- 22. 内核和用户应用程序之间进行通信的方法
- 23. 使用套接字进行Android编程
- 24. 通过sysfs将信息从内核空间导出到用户空间
- 25. 如何使用套接字与套接字进行交互
- 26. 通过套接字与多个客户端进行通信
- 27. 使用用户空间程序与内核模块进行通信的最佳方式是什么?
- 28. 当使用原始套接字进行TCP通信时,请保持内核不接收传入数据包
- 29. 在C中使用套接字进行通信的问题#
- 30. C#(ASP.NET)通过套接字进行android通信
一个选择是使用netlink套接字。 http://stackoverflow.com/questions/3299386/how-to-use-netlink-socket-to-communicate-with-a-kernel-module –
已经尝试使用非常相同的代码。在Ubuntu上它工作正常,但是当我在Andoid上尝试它时,它什么都不做。对于更糟糕的部分,它设法创建套接字并绑定(我没有收到错误消息),但是我没有收到内核应该在连接时打印并且也没有从netlink读取的消息。程序仅在读取时阻止... – TheMole