kernel中的per cpu變數

2021-05-28 08:18:13 字數 1439 閱讀 8594

per-cpu 變數的引入有效的解決了smp系統中處理器對鎖得競爭,每個cpu只需訪問自己的本地變數。本文闡述了per-cpu變數在2.6核心上的實現和相關操作。

在系統編譯階段我們就手工的定義了乙份所有的per-cpu變數,這些變數的定義是通過巨集define_per_cpu實現的:

11 #define define_per_cpu(type, name)

\12 __attribute__(

(__section__(

".data.percpu"))

) __typeof__(type) per_cpu__##name

從上面的**我們可以看出,手工定義的所有per-cpu變數都是放在.data.percpu段的。注意上面的巨集只是在smp體系結構下才如此定義。如果不是smp結構的計算機那麼只是簡單的把所有的per-cpu變數放到全域性變數應該放到的地方。

單cpu的per-cpu變數定義:

27 #else/*

! smp *

/28

29 #define define_per_cpu(type, name)

\30 __typeof__(type) per_cpu__##name

在了解了上述**後,我們還必須弄清楚一點:單cpu的計算機中使用的per-cpu變數就是通過上述巨集定義的放在全域性資料區的per-cpu變數。而在smp體系結構中,我們使用卻不是放在.data.percpu段的變數,設想一下如果使用這個變數,那麼應該哪個cpu使用呢?事實上,smp下,每個cpu使用的都是在.data.percpu段中的這些per-cpu變數的副本,有幾個cpu就建立幾個這樣的副本。

在系統初始化期間,start_kernel()函式中呼叫setup_per_cpu_areas()函式,用於為每個cpu的per-cpu變數副本分配空間,注意這時alloc記憶體分配器還沒建立起來,該函式呼叫alloc_bootmem函式為初始化期間的這些變數副本分配物理空間。

332 static void __init setup_per_cpu_areas(void)/*

*/333

350 }

351 #endif /

*!__generic_per_cpu */

上述函式,在分配好每個cpu的per-cpu變數副本所占用的物理空間的同時,也對__per_cpu_offset[nr_cpus]陣列進行了初始化用於以後找到指定cpu的這些per-cpu變數副本。

15 #define per_cpu(var, cpu)

(*reloc_hide(

&per_cpu__##var, __per_cpu_offset[cpu]))

16 #define __get_cpu_var(var) per_cpu(var, smp_processor_id())

這兩個巨集乙個用於獲得指定cpu的per-cpu變數,另乙個用於獲的本地cpu的per-cpu變數,可以自己分析一下。

kernel中的函式 request

下圖為示意圖,讀者可以參考該圖來閱讀 個人認為對linux下i o資源的管理如掌握 request region函式就能掌握其精髓。linux下對i o資源主要用結構體resource來管理,管理的方法就是用resource來描述使用的i o資源的狀態,並將這些resource用如下兩個resour...

OpenCL中kernel的迴圈呼叫

kernel的迴圈呼叫主要是涉及緩衝區的建立和主機端命令同步 很多例子中會在建立快取物件時對快取物件做初始化,例如 cl mem memobject1 clcreatebuffer context,cl mem read only cl mem copy host ptr sizeof float ...

kernel中各種initcall的優先順序

首先看下核心中的定義 define core initcall sync fn define initcall 1s fn,1s define postcore initcall fn define initcall 2 fn,2 define postcore initcall sync fn d...