原创 初始化slab分配器

5.8.2 初始化slab分配器 回到mm_init()函數,繼續走,下一個函數kmem_cache_init(),也是重點函數,用於初始化內核slab分配體系。這個函數來自文件mm/slab.c   1375void __init k

原创 軟中斷初始化

5.10.3 軟中斷初始化 open_softirq結束後,init_timers就結束了,整個內核就可以享受時鐘服務了,接下來start_kernel的609行調用hrtimers_init。由於我們沒有配置CONFIG_HIGH_RE

原创 子系統的初始化

6.2 子系統的初始化 所以接下來說do_basic_setup函數,任然是來自init/main.c:   778/*  779 * Ok, the machine is now initialized. None of the de

原创 安裝根文件系統

5.12 安裝根文件系統 start_kernel下步是另一個重要的函數,678行的vfs_caches_init,用於初始化VFS那些數據結構的slab緩存,來自fs/dcache.c:   2355void __init vf

原创 啓用夥伴算法

5.8 初始化內存管理 回到start_kernel,下一個函數執行mm_init()。這個函數很重要了,來自同一個文件。   static void __init mm_init(void) {        /*       

原创 設置APIC中斷服務

5.10 初始化中斷處理系統 start_kernel接下來要做的事是初始化中斷處理系統。整個內核的中斷系統的核心就是我們在“初始化中斷描述符表”裏面設置的那個中斷描述符表。而這個表的前19個表項我們已經在“初始化異常服務”中設置爲了一些

原创 走進start_kernel尾聲

5.11 走進start_kernel尾聲 中斷體系建立起來後,雖然後面還有很多行代碼,但是都是些比較好理解的初始化函數了,也就是說start_kernel進入尾聲了。 5.11.1 初始化slab的後續工作 繼續分析start_kene

原创 初始化本地軟時鐘

5.10.2 初始化本地軟時鐘 native_init_IRQ結束後,init_IRQ也就結束了,回到start_kernel中,607行,prio_tree_init函數很簡單:   void __init prio_tree_ini

原创 初始化內存管理區列表

5.4 初始化內存管理區列表 回到start_kernel函數,569行的build_all_zonelists()函數,來自mm/page_alloc.c:   2815void build_all_zonelists(void) 2

原创 初始化異常服務

5.7 初始化異常服務 繼續走,start_kernel的583行,sort_main_extable,把編譯期間,kbuild設置的異常表,也就是__start___ex_table和__stop___ex_table之中的所有元素進行

原创 C語言中函數參數的入棧順序

對技術執着的人,比如說我,往往對一些問題,不僅想做到“知其然”,還想做到“知其所以然”。C語言可謂博大精深,即使我已經有多年的開發經驗,可還是有許多問題不知其所以然。某天某地某人問我,C語言中函數參數的入棧順序如何?從右至左,我隨口回答。

原创 初始化定時器中斷

5.10.4 初始化定時器中斷 回到start_kernel,612行time_init函數: void __init time_init(void) {        late_time_init = x86_late_time_in

原创 啓動shell環境

6.3 啓動shell環境 init_post函數來自同一個文件的814行:   811/* This is a non __init function. Force it to be noinline otherwise gcc  8

原创 設置每CPU環境

5.3 設置每CPU環境 回到start_kernel,563行調用mm_init_owner函數,將init_mm的owner字段指回init_task。這個函數可以說進入start_kernel以來最簡單的函數了。繼續走,setup_

原创 利用early_res分配內存

5.5 利用early_res分配內存 回到start_kernel中,570行,page_alloc_init()函數: void __init page_alloc_init(void) {        hotcpu_notifie