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...