Operating system 动态禁用和启用超线程

Operating system 动态禁用和启用超线程,operating-system,x86,bios,hyperthreading,acpi,Operating System,X86,Bios,Hyperthreading,Acpi,我想知道,从理论上讲,在BIOS中禁用超线程后是否可以启用超线程,反之亦然。事实证明,如果超线程被禁用,它们仍然会作为禁用的核心显示在ACPI的MADT表中。这是MADT的一个示例输出,处理器有4个内核,每个内核有2个线程,并且禁用了超线程 CPU 0: APIC_ID=0 ACPI_PROCESSOR_ID=0 ENABLED=1 CPU 1: APIC_ID=2 ACPI_PROCESSOR_ID=1 ENABLED=1 CPU 2: APIC_ID=4 ACPI_PROCESSOR_ID=

我想知道,从理论上讲,在BIOS中禁用超线程后是否可以启用超线程,反之亦然。事实证明,如果超线程被禁用,它们仍然会作为禁用的核心显示在ACPI的MADT表中。这是MADT的一个示例输出,处理器有4个内核,每个内核有2个线程,并且禁用了超线程

CPU 0: APIC_ID=0 ACPI_PROCESSOR_ID=0 ENABLED=1
CPU 1: APIC_ID=2 ACPI_PROCESSOR_ID=1 ENABLED=1
CPU 2: APIC_ID=4 ACPI_PROCESSOR_ID=2 ENABLED=1
CPU 3: APIC_ID=6 ACPI_PROCESSOR_ID=3 ENABLED=1
CPU 4: APIC_ID=255 ACPI_PROCESSOR_ID=4 ENABLED=0
CPU 5: APIC_ID=255 ACPI_PROCESSOR_ID=5 ENABLED=0
CPU 6: APIC_ID=255 ACPI_PROCESSOR_ID=6 ENABLED=0
CPU 7: APIC_ID=255 ACPI_PROCESSOR_ID=7 ENABLED=0
我想知道(a)是否有一个选项可以在运行时启用这些内核(无需重新启动和通过BIOS)。以及(b)如果未启用超线程/处理器(例如,是否在本地APIC禁用的情况下执行hlt或mwait指令),则超线程/处理器处于什么状态(定义良好或未定义)

我在ACPI规范(5.2.12.2处理器本地APIC结构)中读到的关于启用标志的内容如下:

如果为零,则此处理器不可用,并且操作系统 支持人员不会尝试使用它

但是,如果有人知道,我想知道禁用的超线程的实际状态是什么。例如,初始化期间,Intels软件开发人员手册第3卷(第8.4.3节)中所述的MP初始化协议算法是否在禁用的超线程上执行?

(a)很抱歉,除非您有权访问处理器初始化代码,或者您的BIOS供应商碰巧注释了几行不同的代码,否则您无法以99.99%的确定性进行操作。在冷启动过程结束时,内核和线程的数量被锁定


(b) 我很确定当HT禁用位设置时。逻辑处理器1和辅助APIC被禁用。

如果BIOS可以做到这一点,您当然也可以做到。然而,这可能是主板/芯片组特定的方法,因此它不可移植。我同意,但是,根据BIOS保留禁用内核的状态,可能只是发送一系列IPI并设置APIC ID以唤醒内核的简单问题。另一方面,如果内核从来没有正确初始化过,那么它将很难实现,因为正如您所指出的,它可能涉及特定于芯片组的操作。从未尝试过这样的事情。我不知道内核可能在什么状态下“唤醒”,以及它们可能在什么模式下开始运行。操作系统必须开始管理它们,向它们分配线程,配置mto处理中断等。在我看来,整个前景似乎属于“非常不可能”的类别:(我认为这个问题与将i5破解成i7或类似的东西有关。我还没有听说有人能成功做到这一点。首先,您需要为HT内核分配有效的APIC id,这些内核总是由最后一位标识,因此“CPU 4”需要APIC id为1等等。但我确信有一些CPU“功能”这将忽略这样的疯狂,即使你在你的BIOS中入侵了它。
CPU 0: APIC_ID=0 ACPI_PROCESSOR_ID=0 ENABLED=1
CPU 1: APIC_ID=2 ACPI_PROCESSOR_ID=1 ENABLED=1
CPU 2: APIC_ID=4 ACPI_PROCESSOR_ID=2 ENABLED=1
CPU 3: APIC_ID=6 ACPI_PROCESSOR_ID=3 ENABLED=1
CPU 4: APIC_ID=255 ACPI_PROCESSOR_ID=4 ENABLED=0
CPU 5: APIC_ID=255 ACPI_PROCESSOR_ID=5 ENABLED=0
CPU 6: APIC_ID=255 ACPI_PROCESSOR_ID=6 ENABLED=0
CPU 7: APIC_ID=255 ACPI_PROCESSOR_ID=7 ENABLED=0