内核中的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

消息 Brecvmsg() 函数期间出现在用户空间中。 (因为用户空间程序的进程 ID 与内核模块写入的进程 ID 相同。)

recvmsg() 休眠直到收到给内核的消息,所以你在调用该函数之前不必担心内核是否已经应答。