2010年6月29日 星期二

memtest86關於smp實作

As we know memtest86+ is to originate from memtest86.但是memtest86 3.5裡頭關於SMP的源碼,在memtest86+ 4.0及4.1獲得延續。4.0及4.1雖然從代碼仍可看出SMP足跡,但實際上已經沒有支援SMP了。因此我們若要查看SMP的完整實作,必需Download memtest86 3.5 source code。
在main.c/test_start/initialise_cpus();首先要支援SMP就必需先調用這個routine,此處的test_start相當於memtest86+版的do_test。
void initialise_cpus(void)
{
int cpu_num, j;
smp_init_bsp();
num_cpus = smp_num_cpus();
/* let the BSP initialise the APs. */
for(cpu_num = 1; cpu_num < color="#3333ff">smp_boot_ap(cpu_num);
if(!smp_mode) {
/* some error in booting the AP,
* halt the already started APs */
for (j = 1; j <=cpu_num; j++) { jmp_address[j] = (void *)ap_halt; } break; } } } smp_init_bsp要看懂這個routine要先查詢一些資訊:小木偶裡頭有關cpuid的指令說明;Intel64 and IA-32 Architectures Software Developer's Manual-3A.pdf第8章。主要是找出CPU的核心數及尋找mp_config_table表。
smp_boot_ap這個routine才是重點。
以下資料取自於http://blog.chinaunix.net/u1/41699/showart_537820.html
多核初始化和啟動過程
多核初始化協議定義了兩類處理器:bootstrap processor(BSP) 和 application processors (APs). 上電或者MP重定後,系統硬體動態選擇一個作為BSP,其餘的作為APs。BSP的IA32_APIC_BASE中的BSP flag將被置位,其他的處理器中該位將被清空.上電或者復位後,AP等待BSP的SIPI(startup signal)信號,接收到SIPI信號後,AP執行BIOS中的AP配置代碼,然後進入halt狀態。對於支援Hyper_Threading的處理器,每個邏輯處理器將被作為一個單獨的處理器對待,都會有一個唯一的APIC ID。
志強(xeon)處理器MP初始化協定演算法:
1)基於系統拓撲結構,每個邏輯處理器將分配一個8位的APIC ID.這個ID將被寫入到每個處理器的local APIC ID寄存器中.
2)BSP被確定後,BSP創建一個ACPI的table和一個MP的table並將自己的初始APIC ID加到這些表中
3)在boot-strap流程的最後,BSP設置處理器數目為1,並開始廣播SIPI. 這裏,SIPI包含BIOS AP初始化代碼的向量
4)AP收到SIPI後,第一個得到信號量的AP開始執行初始化代碼,將自己的APIC ID加到ACPI和MP的表裏面,並將處理器數目加1.完成初始化後,AP執行一個CLI指令並halt自己
5)所有的AP都初始化完後,BSP得到一個系統處理器的個數,完成boot-strap代碼,進入OS.
6)此時AP保持halt狀態,等待INITs, NMIs和SMIs.
就我所了解以上的部分應該是BIOS所完成的,參考:http://www.biosren.com/thread-1395-1-1.html

BSP初始化過程
1. 初始化memory
2. Load microcode到處理器
3. 初始化記憶體範圍寄存器(MTRRs)
4. enable cache
5. 確定BSP是否是"GenuineIntel"
6. 執行CPUID,保存CPU資訊為將來使用
7. load AP的啟動代碼到低1M的一個4K的頁裏
8. 切換到保護模式
9. 轉換4K的頁基址為一個8位的向量. 例如 0x000BD000H --> 0xBDH
10.設置APIC的SVR的bit8來enable local APIC
11.建立錯誤處理handler
12.初始化鎖信號量
13.探測系統中的AP, 方法如下:
- 設置處理器COUNT為1
- 啟動一個timer,BSP開始等待
- 此時AP開始初始化,並將COUNT加1
- timer到期,BSP檢查COUNT,如果沒有增加,就表示系統中沒有AP.
14. 等timer中斷,檢查COUNT並建立處理器數目
AP初始化
1. 獲取信號量,開始初始化
2. load microcode到處理器
3. 初始化記憶體範圍寄存器(MTRRs)
4. enable cache
5. 檢查AP是否是"GenuineIntel"
6. 保存CPUID資訊,為將來使用
7. 切換到保護模式
8. 配置AP的共存記憶體介面執行環境
9. 將處理器個數加1
10.釋放信號量
11. 執行CLI並且進入halt狀態
12.等待INIT IPI

了解以上步驟變可從代碼來查看如何實現. update中....
--> 閱讀更多...