内核中的NETLINK输入函数
NETLINK input function in kernel
当我们从用户进程调用 sendmsg API 调用时,输入函数被调用并且我们已经将消息发送到内核。好的,但是当我们调用 recvmsg API 调用时,是否再次调用了输入函数?我在示例中看到了这个,我无法发表评论,因为我没有声誉。 post 的标题是:"How to use netlink socket to communicate with a kernel module?" 所以,谁能看到那个例子并告诉我如何区分写入内核套接字和从中读取。
为什么输入函数会被再次调用? sendmsg()
发送,recvmsg()
接收。 hello_nl_recv_msg()
仅在内核模块收到消息时执行。
在该示例中,用户空间程序使用 sendmsg()
函数向内核发送消息 A。
消息A到达内核。内核调用 hello_nl_recv_msg()
。消息 A 封装在参数 skb
.
中
内核模块选择向其进程ID 为发送skb
的进程发送响应。它创建消息 B。内核模块使用nlmsg_unicast()
函数向用户空间发送消息B。
消息 B 在 recvmsg()
函数期间出现在用户空间中。 (因为用户空间程序的进程 ID 与内核模块写入的进程 ID 相同。)
recvmsg()
休眠直到收到给内核的消息,所以你在调用该函数之前不必担心内核是否已经应答。
当我们从用户进程调用 sendmsg API 调用时,输入函数被调用并且我们已经将消息发送到内核。好的,但是当我们调用 recvmsg API 调用时,是否再次调用了输入函数?我在示例中看到了这个,我无法发表评论,因为我没有声誉。 post 的标题是:"How to use netlink socket to communicate with a kernel module?" 所以,谁能看到那个例子并告诉我如何区分写入内核套接字和从中读取。
为什么输入函数会被再次调用? sendmsg()
发送,recvmsg()
接收。 hello_nl_recv_msg()
仅在内核模块收到消息时执行。
在该示例中,用户空间程序使用 sendmsg()
函数向内核发送消息 A。
消息A到达内核。内核调用 hello_nl_recv_msg()
。消息 A 封装在参数 skb
.
内核模块选择向其进程ID 为发送skb
的进程发送响应。它创建消息 B。内核模块使用nlmsg_unicast()
函数向用户空间发送消息B。
消息 B 在 recvmsg()
函数期间出现在用户空间中。 (因为用户空间程序的进程 ID 与内核模块写入的进程 ID 相同。)
recvmsg()
休眠直到收到给内核的消息,所以你在调用该函数之前不必担心内核是否已经应答。