【问题标题】:Why is `kernal_thread()` not listed as a system call of Linux?为什么 `kernal_thread()` 没有被列为 Linux 的系统调用?
【发布时间】:2019-02-22 23:53:37
【问题描述】:

我想知道为什么kernal_thread() 没有在http://man7.org/linux/man-pages/man2/syscalls.2.html 中列为系统调用?

Linux 应用程序程序员从不需要创建内核线程吗?

Linux 应用程序程序员可以访问该函数吗?

谢谢。

【问题讨论】:

  • 如果您阅读了该手册页的第一句话系统调用通常不会直接调用,而是通过 glibc(或其他库)中的包装函数,这意味着你不能直接执行它。尝试使用 glibc 提供的标准 c 库。
  • @alvits 你的意思是kernel_thread()在glibc中吗?
  • 没有。 kernel_thread() 的头文件在 kernel-devel 包中。对于应用程序,请使用 pthread_*,它是对 clone 的系统调用的包装器。

标签: linux linux-kernel system-calls


【解决方案1】:

应用程序程序员通常需要使用该列表中的 clone 系统调用来创建“内核调度线程”,也就是“操作系统线程”或“本机线程”。

然而,“内核线程”只是内核用来运行内核代码以实现其内部目的的线程。它们仅由内核上下文代码创建和使用。每个软件都负责创建和管理自己的线程来完成自己的工作,包括用户空间应用程序和内核本身。

kernel_threadkernel/fork.c 中定义的内核函数,不暴露给用户空间。它是内部内核 API 的一部分,而不是系统调用。

【讨论】:

    【解决方案2】:

    正如您所熟悉的,它们是一个用户和内核的两个地址空间,正常的函数将在用户空间中运行,但是当您使用一些在内核空间中实现的函数调用时,您不能直接使用它们以便访问它们我们需要系统调用。

    所以现在你的问题是为什么 kernal_thread() 没有在系统调用中列出。

    (正如“那个人”回答的那样) kernal_thread() 函数由内核程序员或通常在设备驱动程序中用于在内核空间中创建线程。所以它们的实现是在内核空间中,并且只被内核开发者或程序员使用。 (注意:- 如果已经为用户空间的某些函数提供了一个接口,该接口将作为系统调用结束,因为该函数没有用户接口,所以它们在手册页中没有相关文档)

    如果您想阅读有关内核空间函数的文档,请下载内核源代码并查看“文档”文件夹或查看相应函数的源代码,它们几乎没有 cmets。

    【讨论】:

      猜你喜欢
      • 2017-03-20
      • 2017-06-24
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 2020-04-22
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多