2

私は minix 3.1.2a を実行しています。私の目標は、BSP 以外の AP プロセッサを開始することです。ユニバーサル スタートアップ アルゴリズムに従いました。

  • BSP は AP に INIT IPI を送信します
  • BSP DELAY (10 ミリ秒)
  • BSP が AP に STARTUP IPI を送信
  • BSP DELAY (200μSEC)
  • BSP が AP に STARTUP IPI を送信
  • BSP DELAY (200μSEC)

ACPI テーブルを読み取った後に INIT IPI および STARTUP IPI を実行する関数は次のとおりです。

void START_APs2()
    {

 u32_t trampoline_addr;
 int UseCPU = 1;
 u32_t reg;
 /* Try to allocate the trampoline for APs to start */
                if ((trampoline_addr=find_trampoline())) 
                 {



 reg = LOCAL_APIC_READ(LOCAL_APIC_SPIV);
   reg |= 0x1FF;    /* Disable apic */
   LOCAL_APIC_WRITE(LOCAL_APIC_SPIV, reg);


                        /*======================== INIT IPI==============================*/



                     CLI();

                        /*LOCAL_APIC_WRITE(LOCAL_APIC_ICR_HIGH, (unsigned long)cpus[UseCPU].ApicID << 24);*/
                       LOCAL_APIC_WRITE(LOCAL_APIC_ICR_LOW,  (unsigned long)  (0x4500) | (trampoline_addr>>12)|(DEST_OTHERS << DEST_SHORT_SHIFT));
                        /*wait_for_ipi_completion();*/
                       VerifyLoop();

                       /*Some delay ...*/
                      milli_delay(100);

                       /*=============================STARTUP IPI==============================*/


                      /* LOCAL_APIC_WRITE(LOCAL_APIC_ICR_HIGH, (unsigned long)cpus[UseCPU].ApicID <<24);*/
                       LOCAL_APIC_WRITE(LOCAL_APIC_ICR_LOW,  (unsigned long)  (0x5600) | (trampoline_addr>>12)|(DEST_OTHERS << DEST_SHORT_SHIFT));
                       VerifyLoop();

                          /*Some delay ...*/
                      milli_delay(200);

                       /* send the IPI */

                       /*LOCAL_APIC_WRITE(LOCAL_APIC_ICR_HIGH, (unsigned long)cpus[UseCPU].ApicID <<24);*/
                       LOCAL_APIC_WRITE(LOCAL_APIC_ICR_LOW,  (unsigned long)  (0x5600) | (trampoline_addr>>12)|(DEST_OTHERS << DEST_SHORT_SHIFT));
                       VerifyLoop();

                          /*Some delay ...*/
                      milli_delay(200);

                      STI();
                     /* enable_cpu(this_cpu, WITHOUT_ECHO);*/
                       if (! AP_running()) 
                          {
                              Aprintf(("\n\n*** WARNING! AP# %d  is not running ***\n\n",(unsigned long)cpus[UseCPU].ApicID));

                          }
                          else
                          {
                               Aprintf("\n\n***AP RUNNING SUCCESSFULLY");

                          }

                 }
}

私は Windows 7、64 ビットのコア i7 ホスト マシンで実行し、3 つの異なる仮想 M/C を持っていることに注意してください。

  • ヴイエムウェア ワークステーション
  • VBOX
  • QEMUマネージャー

1-on VMWARE:

主に、前述のコードを実行するときに VMWARE でゲスト minix を実行します。

  • プロセッサの数、つまり 4 とコアの数 1 を選択し、そのコードを実行すると、システムは再起動し続けます。
  • プロセッサの数、つまり 1 とコアの数 4 を選択してそのコードを実行すると、システムがハングします。

2 オン VBOX:

  • プロセッサーの数を 4 に選択してそのコードを実行すると、システムがハングします。

3-on QEMU: 最初に acpi チェックサムが正しくないため、CPUAPIC ID を手動で入力してテストします。つまり、APIC ID =1 です。CPU 4 の数を選択してそのコードを実行すると、システムがハングします。

実際、私はその問題で10日以上立ち往生しており、髪の毛をすべて抜いています。なぜ開始しないのかを理解することはできません。

4

0 に答える 0