rlib/cpu.h
source/kernel/apic.h
のApicCtrl::Lapic::GetApicIdFromCpuId(int cpuid)
_apicIds[]
という配列を参照している。この配列での添え字番号がcpuid
,そこにある値がapicid
となっている。
“apic.cc” 197 行で_apicIds[]
は初期化されている。
この元データは、MADT(Multiple APIC Description Table)に存在する。
madtStLAPIC
構造体がそのエントリである。
エントリの出現順に、0からcpuidを付与する。(これはOS側でそう決めている)
8.9 PROGRAMMING CONSIDERATIONS FOR HARDWARE MULTI-THREADING CAPABLE PROCESSORS
madtStLAPIC
に書かれているInitial APIC ID (Processor ID)
は、最小単位がスレッドなので、必ずしもコア単位で連続しない。そのため、OS側でCPU番号を再度振っている。
From: ACPI Spec. 6.1 5.2.12.1 MADT Processor Local APIC / SAPIC Structure Entry Order
To ensure that the boot processor is supported post initialization, two guidelines should be followed. The first is that OSPM should initialize processors in the order that they appear in the MADT. The second is that platform firmware should list the boot processor as the first processor entry in the MADT.
上記より、cpuid==0となるプロセッサコアは、ブートプロセッサである。
cpuid int -> tekitou struct taskに対してcpuid TODO: cpuid