之前有幾篇部落格詳細介紹了Xen的記憶體初始化,確實感覺這部分內容蠻複雜的。這兩天在看Linux核心啟動中記憶體的初始化,也是看的雲裡霧裡的,想嘗試下邊看邊寫,在寫部落格的過程中慢慢思考,最後也能把自己的思考分享給其它人。
這個系列主要分為兩個部分,彙編部分和C語言部分。
這篇博文主要介紹的是彙編部分。
註:這兩篇博文介紹的都是64位系統。 核心解壓縮過程
這個過程就不詳述了,整個Linux核心是作為一個壓縮過的鏡像提供的,在執行核心代碼之前,首先需要bootloader對其進行一個解壓縮,對這部分有興趣可以參看這篇部落格。 最初的頁表什麼樣。
解壓結束後,會進行一個對elf格式的parse,然後對核心進行載入,最後進入arch/x86/kernel/head_64.S中的startup_64。
startup_64主要完成分頁功能啟用,最後跳入C代碼x86_64_start_kernel。在開始分析代碼之前,我們要先來看看在核心的資料區段中,初始化頁表是長怎麼樣的。
12345678910111213141516171819202122232425262728293031 |
__INITDATANEXT_PAGE(early_level4_pgt) .fill 511,8,0 .quad level3_kernel_pgt - __START_KERNEL_map + _PAGE_TABLENEXT_PAGE(early_dynamic_pgts) .fill 512*EARLY_DYNAMIC_PAGE_TABLES,8,0 .dataNEXT_PAGE(init_level4_pgt) .fill 512,8,0NEXT_PAGE(level3_kernel_pgt) .fill L3_START_KERNEL,8,0 /* (2^48-(2*1024*1024*1024)-((2^39)*511))/(2^30) = 510 */ .quad level2_kernel_pgt - __START_KERNEL_map + _KERNPG_TABLE .quad level2_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLENEXT_PAGE(level2_kernel_pgt) PMDS(0< |