当从内核内部调用 open()/socket() 时,文件描述符是如何分配的?

How are the file-descriptors allocated when an open()/socket() is called from inside kernel?

一些内核库(例如rpc)在内核中打开一个套接字,并与文件描述符(FD)相关联。这些可以被任何命中代码的进程使用。鉴于对于任何进程,FD 都存储在其文件描述符 Table 中的 task_struct 中,这些内核 FD 存储在哪里以及它们是如何计算的? 这些不是由进程特别创建的(例如,这些 FD 是在 module_init 时创建的)。此类 FD 的值是如何分配的,进程 FD 以 0、1、2 开头并可能与这些 FD 重叠?

这也扩展到任何其他类型的 FD:文件、管道等。

内核直接使用file/socket对象,不需要用户space使用的文件描述符。

例如,当在内核中创建套接字时(例如,对于 RPC),它只是将 inet 地址(带有端口)与回调函数相关联,回调函数在该地址上处理消息 sending/receiving。因此,用户 space 程序只需要知道该地址即可进行通信。