多核CPU,不同类型的CPU和操作系统

时间:2016-07-15 12:11:32

标签: operating-system cpu multicore

操作系统应该支持CPU架构而不是特定的CPU,例如,如果某个公司有三种类型的CPU都基于x86架构, 一个是单核处理器,另一个是双核,最后一个有五个核,操作系统不是基于CPU类型的,它是基于架构的,所以内核如何知道它运行的CPU是否支持多核核心处理或它甚至有多少个核心......

也是例如定时器中断,某些版本的英特尔i386处理器系列使用PIT而其他版本使用API​​C定时器来生成定期定时中断,如果它想要配置它,操作系统如何识别...(特别是关于定时器,我知道它们通常由BIOS设置,但定时中断的ISR句柄也应该识别它运行的定时器机制,以便在处理某些中断时禁用/启用/修改它。

是否存在与操作系统而不是BIOS相关的CPU驱动程序?如果有人可以将我推荐到某个地方,我可以获得有关内核如何触发/实现多核处理的更多知识在“代码”方面它会很棒

1 个答案:

答案 0 :(得分:0)

操作系统内核几乎总是有一个名为 HAL 的抽象层,它提供了硬件上方的接口,内核的其余部分可以轻松使用。此HAL还体系结构相关,而不是依赖于模型。 CPU架构必须定义一些调用方法,该方法将允许HAL知道哪些特征存在以及哪些特征不存在于执行处理器中。

在IA32 / 64架构上,这是一条称为CPUID的指令。你可以在这里提出另一个问题:

CPUID从一开始就存在吗?

不,CPUID并未出现在最早的CPU中。事实上,随着i386处理器的发展,它出现了很多。根据英特尔手册第2A卷,EFLAGS寄存器中的第21位表示支持CPUID指令。

PUSHFD

使用PUSHFD指令,可以复制堆栈中EFLAGS寄存器的内容,并检查第21位是否已设置。

如果只是一条指令,CPUID如何返回信息?

CPUID指令返回EAX,EBX,ECX和EDX寄存器中的处理器标识和功能信息。其输出取决于执行前放入EAX和ECX寄存器的值。

可以放入EAX寄存器的每个值(对CPUID有效)称为CPUID叶。有些叶子有子叶,.i.e。它们依赖于ECX寄存器中的子叶值。

如何在操作系统内核级别检测到多核支持?

有一种称为ACPI(高级配置和电源接口)的标准,它定义了一组ACPI表。其中包括 MADT 多个APIC描述符表。此表包含具有有关本地APIC,I / O APIC,中断重定向等信息的条目。您应该知道,每个本地APIC只与一个逻辑处理器相关联。

使用该表,内核可以获取系统中存在的每个本地APIC的APIC-ID(只有那些CPU工作正常的APIC-ID)。 APIC id本身被划分为拓扑ID(逐位),其偏移量使用CPUID获取。这允许操作系统知道每个CPU所在的位置 - 域,芯片,核心和超线程ID。