【问题标题】:How are the file-descriptors allocated when an open()/socket() is called from inside kernel?从内核内部调用 open()/socket() 时如何分配文件描述符?
【发布时间】:2015-09-01 23:49:33
【问题描述】:

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

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

【问题讨论】:

  • 每个进程有一个单独的文件描述符表。
  • 是的,这就是问题所在。在内核中创建套接字时,任何进程上下文都可以使用它。你如何区分?
  • 每个进程的文件描述符用于查找对系统范围文件表的引用。来自open 手册页:“对 open() 的调用会创建一个新的打开文件描述,即系统范围的打开文件表中的一个条目......文件描述符是对这些条目之一的引用”。所以在不同进程(甚至在同一个进程内)的两个文件描述符可以引用同一个文件条目(不管描述符值是相同还是不同)。你是这个意思吗?
  • 不,我的问题是指 FD 的内核模式创建。这些内核模式 FD 可以被任何进程使用。
  • 不确定我明白你的意思。从open返回的FD由内核分配和管理。只是它为每个进程分配它,然后用作间接获取真正的文件条目。

标签: linux linux-kernel kernel kernel-module vfs


【解决方案1】:

内核直接使用文件/套接字对象,不需要用户空间使用的文件描述符。

例如,当在内核中创建套接字时(例如,用于 RPC),它只是将 inet 地址(与端口)与回调函数相关联,回调函数在此地址上处理消息发送/接收。所以,用户空间程序只需要知道这个地址就可以进行通信了。

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2012-01-05
    • 2019-01-29
    • 2011-04-10
    • 2019-02-09
    • 2021-12-06
    • 1970-01-01
    • 2017-02-04
    • 2023-03-23
    相关资源
    最近更新 更多