当我们从 user-space 调用任何套接字时,内核如何知道要调用哪个驱动程序?

How kernel know which driver to be called when we are calling any socket from user-space?

我在用户space 中使用IWD 作为无线守护进程。已加载驱动程序和固件。

当 IWD 使用 nl80211 调用套接字时,它会传递给 nl80211 而不是内核 space 中的 cfg80211。在内核 space 他们如何知道调用哪个驱动程序或将请求传递给哪个驱动程序?

使用此创建套接字:

    fd = socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK, NETLINK_GENERIC);

而这个fd是用来向内核传递请求的space.

[编辑]

这段代码中使用了类似套接字的概念:How to use netlink socket to communicate with a kernel module?

它使用相同的套接字创建和调用在用户space 和内核space 之间进行通信。

正如@stark 在评论中所解释的那样:

您正在使用 NETLINK_GENERIC 协议,因此将调用 Generic Netlink 代码。另一个问题是使用注册协议 31 的 user-written 模块。wiki.linuxfoundation.org/networking/generic_netlink_howto