初始化位址雜湊表

2021-05-24 02:24:08 字數 1919 閱讀 6418

560

行,page_address_init()

函式,來自

mm/highmem.c

:409void __init page_address_init(void)

410 420spin_lock_init(&pool_lock);

421}

這個函式很簡單,首先

413初始化乙個鍊錶

page_address_pool

,這個鍊錶在編譯的時候被定義成乙個全域性變數在同乙個檔案的

309行:

static struct list_head page_address_pool

414行,

page_address_maps

也是個全域性變數,來自同乙個檔案:

static struct page_address_map page_address_maps[last_pkmap];

其每乙個元素是乙個

page_address_map

結構:struct page_address_map ;

ok,第一次見到我們熟悉的

page

資料結構了。乙個

page

linux

頁框管理」。

array_size

獲得陣列的元素個數,這裡肯定就是

last_pkmap

了,由於我們沒有啟動

pae,這個值等於

1024

,也就是說

page_address_maps

共有1024

個元素。隨後

415行,

1024

個迴圈以後,

page_address_pool

通過每個

page_address_maps

的元素的

list

欄位將他們全部鏈結起來形成個雙向迴圈鍊錶,又

page_address_pool

作為head

。416

行,page_address_htable

,也定義於同一檔案:

static struct page_address_slot ____cacheline_aligned_in_smp page_address_htable[1<

____cacheline_aligned_in_smp

是乙個編譯優化選項,用於

smp方式的快取優化。

pa_hash_order

被定義為

7,所以

2^7=128

。所以array_size(page_address_htable)

為128

,那麼經過

128個迴圈以後,每個

page_address_htable

元素的lh

都被初始化成乙個煉表頭了,而對於的互斥鎖

lock

也通過spin_lock_init

函式進行初始化了。具體的初始化過程請查閱部落格「

linux

核心入門(三)——

c語言基本功」

以及「自旋鎖」。

最後page_address_pool

的自旋鎖

pool_lock

初始化之後,函式就結束了。簡單歸簡單,但是大家必須知道這個函式的意義。我們知道乙個

page

結構代表乙個

4k的頁面,我們核心初始化這麼乙個全域性的

page_address_maps

和page_address_htable

這麼兩個結構,作為頁面的位址對映。

561行,執行乙個

printk

函式。start_kernel()

開始執行至此,會顯示「

linux version 2.6.34…

」資訊。

雜湊表 初始化 插入 刪除 查詢 查詢

首先看乙個面試題 找到乙個字串中第一次出現一次的字元?思路是 如果是a z26個字元,可以設定大小為26的陣列,將每個字元出現的次數依次存放在陣列裡。如果是所有字元,將所有字元按照各自的asscii碼作為下標將出現的次數存放在陣列裡。如下 char findfirstchar const char ...

引數初始化表

成員初始化表的作用如下 成員初始化錶用在類的建構函式中,對類的資料成員等初始化。其實它的作用還不僅如此。class a public a int a,int b x a y b 這就是成員初始化表 private int x int y class b public b int c private ...

鍊錶初始化

include include include struct node void init node plink int create node plink int insert node plink int print node plink int main void init node plin...