DEFINE PER CPU,如何實現「陣列」

2021-09-06 11:38:01 字數 1116 閱讀 4596

引述自:

kevin.liu 的《排程器筆記》中指明「有幾個 cpu 就會有幾個 rq 結構體,所有的結構體儲存在 乙個陣列中(即runqueues)";

《深入linux核心架構》p_73指明」系統的所有就緒佇列中都在runqueues陣列中,由下定義完成:

static define_per_cpu_shared_aligned(struct rq, runqueues);

由於unicore32是單核,所以原先就沒關注過這個問題;

在2.6.32中並沒有找到所謂的「陣列」,那麼它是如何實現的??

我們需要了解幾個知識點:

1、相關的define_per_cpu巨集通過指定變數的section屬性而放到指定的節中,可以確定鏈結生成的vimlinux中只有乙份,而不是每個cpu都有乙份,因此實際上更本就不存在「陣列」(在概念上,我們仍然可以講「陣列」)。

根據指明的section屬性,我們知道在核心啟動過程中該節所佔的儲存空間被釋放了。

//

vmlinux.lds

.init :

2、unsigned long __per_cpu_offset[nr_cpus];

//unicore32是單核,因此此處列出x86**

void *__cpuinit

per_cpu_init(

void

)

//................

}

即對於每乙個cpu對於位於__per_cpu_start與__per_cpu_end之間的變數都拷貝了乙份,在__per_cpu_offset[nr_cpus]中存放了與__per_cpu_start的偏移量。因此當我們get cpu variable的時候,給出variable name和cpu的id,就可以在形式上以陣列的形式訪問了。

疑問:1、為什麼不直接定義成陣列的形式,這樣也可以完成操作啊,而且又不需要在執行時做拷貝,也不需要分配空間?

2、現行的做法是不是可以提高快取利用率?畢竟每個核都有自己的l1 dcache,如果我們直接以陣列的形式來實現,就會將其它cpu的資料也快取進自己的cache,當然對於龍芯和arm還有預取指令,把匯流排資源和功耗花在自己極少會使用的資料上,純屬浪費。

如何關閉與恢復visual studio實時偵錯程式

如何關閉與恢復visual studio實時偵錯程式 刪除 hkey local machine software microsoft windows nt currentversion aedebug debugger hkey local machine software microsoft n...

如何關閉與恢復visual studio實時偵錯程式

前段時間裝了vs2005,今天裝了個 酷我 盒 開啟時,老出現 visual studio實時偵錯程式 對話方塊。沒法用,鬱悶至極,於是找到了解決的辦法 如何關閉與恢復visual studio實時偵錯程式 在安裝了vs2005之後,一旦某些程序出現問題,那個偵錯程式總會出來搗亂。下面就解決它!刪除...

如何關閉與恢復visual studio實時偵錯程式

前段時間裝了vs2005,今天裝了個 酷我 盒 開啟時,老出現 visual studio實時偵錯程式 對話方塊。沒法用,鬱悶至極,於是找到了解決的辦法 如何關閉與恢復visual studio實時偵錯程式 在安裝了vs2005之後,一旦某些程序出現問題,那個偵錯程式總會出來搗亂。下面就解決它!刪除...