在引导加载程序中初始化单独的CPU核心

时间:2012-11-14 06:07:35

标签: assembly multiprocessing bootloader

是bootloader开发的新手。我尝试了一些基本的东西,比如打印字符串“Hello World”之类的东西。我想问一些类似的事情,

是否有可能使用asm / c / c ++ / mixed在引导加载程序中单独初始化多核芯片中的内核? (比如,我想单独初始化第一个核心或单独初始化第三个核心)。

如果可能,请分享代码。

2 个答案:

答案 0 :(得分:3)

  

是否有可能使用asm / c / c ++ / mixed在引导加载程序上分别初始化多核芯片中的内核?

是的,完全有可能。

  

如果可能,请共享代码。

仅仅因为可能并不意味着代码存在;即使代码存在,也并不意味着它足够小可以粘贴到此处。

现实是要正确执行此操作(在80x86上),您需要:

  • 如果您处于实模式(例如BIOS的引导加载程序),请切换到保护模式和长模式
  • 解析表(ACPI的MADT / APIC表,或者如果没有ACPI则为Intel的MultiProcessor规格表),以确定本地APIC的位置,其他CPU的数量以及这些CPU使用的ID。请注意,仅查找这些表(在解析它们之前)可能涉及搜索物理地址空间的区域以寻找签名并检查校验和。
  • 建立某种可用于延迟和超时的时间源
  • 找到/分配一些内存(低于0x00100000,从页面边界开始),以适合AP CPU启动蹦床。在某些情况下,这可能比您想象的要复杂(对于UEFI,无法保证0x00100000以下的任何内存都是可用的,您可能需要在合适的内存变为可用之前调用exitBootServices(),并且可能需要在调用exitBootServices()之前初始化您自己的视频输出代码,以便在您不再依赖UEFI的控制台支持后可以显示错误消息等。
  • 初始化AP启动蹦床,通常涉及将其复制到找到/分配的内存中,并且可能涉及在蹦床中设置各种值(例如,CPU应该用于堆栈的地址等)。当然,这还意味着以(16位实模式)汇编语言编写代码,并且通常会涉及更多代码以切换到保护模式或长模式,因此,如果/当AP CPU启动时,蹦床中的代码可使CPU升至它可以执行“正常”代码的状态。
  • 执行AP CPU启动顺序(这涉及在一个CPU上使用本地APIC向另一个CPU发送特殊的中断序列,其中包含时间延迟和超时以及错误处理)。

当然,所有这一切都是很多工作,其中大部分是出于多种原因完成的工作。例如,您可能会找到APCI(和/或多处理器规范)表,以后将它们用于100种不同的事物,然后可能初始化计时器,然后将它们用于100种不同的事物,您可能会初始化物理内存管理器并使用它用于100种不同的事物,等等。这意味着完成这些任务的代码最终会散布在整个引导过程中(有些在引导加载程序中,有些在其他引导代码中,有些在内核中),并且几乎“永远”方便的位置(例如“在此文件中用于启动其他CPU的所有东西”)。

答案 1 :(得分:0)

看看Pure64 - 代码非常简洁明了。事实上它完全符合你的要求!

相关问题