gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:15:35 24 4
gpt4 key购买 nike

我是引导加载程序开发的新手。我尝试了一些基本的东西,比如打印字符串“Hello World”之类的东西。我想问一些类似的问题,

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

如果可能,请分享代码。

最佳答案

Is there any possibility for initializing cores in a multicore chip separately on a bootloader using asm/c/c++/mixed ?

是的,这是完全可能的。

If it is possible , kindly share the code .

仅仅因为它是可能的并不意味着代码就存在;即使代码存在,也不意味着它小到可以粘贴到这里。

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

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

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

关于assembly - 在引导加载程序中初始化单独的 CPU 内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13373858/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com