Linux内核如何知道哪个进程进行了系统调用?

Linux内核如何知道哪个进程进行了系统调用?

假设一个进程进行了系统调用来打开一个文件,当Linux内核执行这个系统调用时,Linux内核应该将打开的文件添加到进行系统调用的fd进程表中。fd

当传递给系统调用的参数不包含 PID 时,Linux 内核如何知道哪个进程进行了此系统调用?

答案1

内核系统调用在调用进程的上下文中执行,只是在不同的特权级别和不同的支持基础设施上执行。 Linux 内核有一个每个 CPU 的变量来跟踪当前进程,current_task;每当它需要知道当前进程是什么时,它就会使用它。在给定的 CPU 上,当前任务仅在调度程序决定时才会更改,并且上下文切换会注意保存所有必要的信息,以便内核可以跟踪发生的情况。

LWN 有几篇关于系统调用的有用文章,系统调用剖析第 1 部分第2部分。他们解释了如何定义系统调用以及如何执行它们,尽管可能没有足够的细节来实际回答您的问题,因为它们没有详细介绍从用户空间到内核空间的转换;但这“只是”CPU 上可用的基于陷阱的转换支持。

答案2

你的问题表明应用程序知道并管理自己的 PID,并且应该将其传递给内核,以便后者知道如何完成其​​工作。这是一个普遍的误解。这种信息流动的方式实际上是相反的。进程不需要知道或存储其进程 ID、文件描述符表等。如果它想要获取有关它们的信息,则需要使用诸如 等系统调用从内核中检索getpidioctl

虽然内核是由一大堆源代码行组成的,但它并不是在其一侧运行的单个程序,用户态程序位于另一侧并向内核发送请求,就像网络浏览器向内核发送请求一样。网络服务器。系统调用参数和返回值不是应用程序和内核之间流动的唯一信息,有关每个线程和进程的所有低级信息,无论其状态如何(运行、等待、睡眠……),都存储在内核内存中。

您应该看到大部分内核代码,就像一个大库,与系统上每个正在运行的进程相关联。当一个进程(实际上是一个线程)执行系统调用时,它只是潜入那个特殊的库并在一小段时间内获得超能力。但它仍然是同一个线程,因此内核拥有识别和管理正在运行的线程所需的所有信息,例如其所有者、组、pid、文件描述符表等,因为它正是内核(此处为调度程序)它将线程分配给可用的 (v)CPU。

相关内容