【问题标题】:Threading on bootloader引导加载程序上的线程
【发布时间】:2009-12-25 01:34:36
【问题描述】:

我在哪里可以找到有关如何在 x86 架构引导加载程序上实现线程的资源/教程...假设我想在显示进度条的同时在后台加载资源..

【问题讨论】:

  • 这个问题将如何引起主观意见? :D 引导加载程序太低级,不会引起宗教争论

标签: c++ c multithreading bootloader


【解决方案1】:

这是一个非常不寻常的问题...所以请允许我对此发表意见...

  • 引导加载程序,实际上是一组有限的汇编代码,确切地说是 464 字节,64 字节用于分区信息,最后两个字节用于指示引导加载程序结束的魔术标记,总共 512 字节。
  • 诸如 Grub 之类的引导加载程序可以通过实施两阶段引导加载程序来绕过此限制,第一阶段是前面提到的 512 字节,然后加载第二阶段,在其中执行更多选项等。
  • 一般来说,引导加载程序代码是 16 位汇编代码,因为原始 BIOS 代码是 16 位代码,这就是今天从 386 到现代处理器的处理器在实模式下启动的内容。
  • 使用双阶段引导加载程序,前 512 字节为 16 位,然后第二阶段将处理器切换到 32 位模式,准备好寄存器和门选择器,然后跳转到实际程序的入口代码进行启动 - 这是考虑到必须从磁盘上的特定位置读取数据或读取包含启动代码存储位置数据的配置文件。
  • 在 32 位模式下实现线程是一件很棘手的事情,因为您必须在 Assembly 中创建某种调度程序(因为您提到在 x86 架构引导加载程序上实现线程)。

您可以通过使用 C 实现引导加载程序的第二阶段部分来解决此问题(但棘手的一点是,由于尚未设置运行时环境,因此不使用标准库!)

使用 Grub 或查看开源 BIOS 引导加载程序 here 可能会更好- 这将取决于您的处理器。这里还有另一个网站可能会提供更多信息here

不幸的是,启动时的进度条是用 C/C++ 编写的(已经在 32 位中,环境设置,任务调度程序设置,线程包括,虚拟内存管理器加载等 - 这是内核级别,启动后过程完成),其中创建了一个线程,该线程在后台运行,说明硬件检测/进一步的环境设置等,使用进度条作为告诉用户“等待,系统正在运行”的方式加载中”

【讨论】:

  • 你说得对,我实际上处于第二阶段,我已经定义了大部分类和类型。我发现的大多数资源都使用调度程序。这对我来说似乎是一个链接列表。我在 c 中编写链表时遇到的唯一问题是使用关键字“new”。我以前用 C++ 写过一个链表。回到绘图板
【解决方案2】:

This book 可能对您有所帮助——它描述了 linux 内核的各个方面——包括初始化。您可能想看看 GRUB 它在 UNIX 风格中的相当标准。

我提到的书应该是你的首选资源,内核直到初始化周期的后期才认为它的金属线程能力,我的意思是为线程设置数据结构是有据可查的。

虽然我似乎想不出在引导加载程序中允许线程构造有什么真正的好处——首先使用单线程过程代码设置基本硬件更简单,其次您希望代码是 bullet -证明,因此不需要线程作为防御机制。

所以我希望您正在考虑模拟进度条:D

【讨论】:

  • 是的,试图模仿一个。我会试着找到这本书
猜你喜欢
  • 2013-07-07
  • 1970-01-01
  • 2014-10-03
  • 2021-11-18
  • 1970-01-01
  • 2016-10-25
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多