原创 初始化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