【问题标题】:Multithreading at boot time?启动时多线程?
【发布时间】:2013-10-31 21:39:33
【问题描述】:

我们正在开发一个非常底层的应用系统,它在操作系统启动之前运行,实际上是一个启动应用程序。
问题是我们应该如何利用 CPU 内核/线程?
我们将运行多少个线程?
有可能吗?!有链接/教程吗?

【问题讨论】:

  • 如果您需要操作系统服务,例如打开内核并在它们之间进行调度,但又想在操作系统之前运行,那么您必须自己实现它们。您可以使用在与参考代码相同的硬件上运行的任何操作系统。
  • 我建议你给Linux或Unix内核一些帮助。
  • @DavidSchwartz 所以问题是操作系统如何利用 CPU 内核?
  • @parsaporahmad 答案是查看在同一硬件上运行的任何操作系统的代码。我想你会发现它相当复杂,特别是如果你打算支持多种硬件。
  • @parsaporahmad 听起来您实际上想知道这个问题问了什么:stackoverflow.com/questions/980999(SSE 是一种完全不同的并行,它是单核上的数据并行,与线程无关。 ) 另一方面,我不相信任何类型的“启动应用程序”都会从多线程中受益。

标签: c++ c assembly concurrency native


【解决方案1】:

由于您在谈论在启动操作系统之前 进行线程化,我将假设您还没有可用的内核。这意味着没有系统调用,所以没有 fork() 或 clone()。但是,出于此答案的目的,我还将假设您已经设置了 A20 门,一个 GDT,无论是受保护(对于 IA-32)还是长(对于 x86-64)模式,等等在。如果您不知道这些是什么,我们可能不应该在启动之前谈论线程。

您可以使用一些操作码和技巧让您的处理器使用其他内核,从而非常直接地实现线程。您可以在 Intel x86 中找到所有这些内容(您正在使用 x86,是吗?如果您使用不同的架构,您显然需要一套不同的手册)手册:http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf

坦率地说,没有这样的教程的原因是它不是很有用。在将内核加载到内存之前进行设置的全部目的是使将内核加载到内存中更容易。线程并不完全有助于实现这一目标。建议让内核处理此类低级实现要求,这样您就可以使用 fork() 和 clone() 系统调用来满足所有线程需求。

编辑:Sinn 的良好修正:fork() 创建一个新进程,这当然不是真正的线程。

【讨论】:

  • 不错的论点先生,请支持我的意见,但要稍加修正。实际上,fork 不被视为线程,因为它创建了一个不共享资源的新进程,即使您仍然具有(伪 1 核)并行性。
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多