ARM Linux核心源碼剖析

ARM Linux核心源碼剖析

《ARM Linux核心源碼剖析》是人民郵電出版社2014年出版的圖書,作者[韓] 尹錫訓 等 著;崔范松 譯

基本介紹

內容簡介,作者簡介,圖書目錄,

內容簡介

此書獻給想了解或分析Linux代碼的各位讀者!
逐行分析ARM Linux核心載入到RAM並運行Shell前的全部初始化過程!
Linux核心代碼分析全新方法!
Linux核心代碼分析實用指南!
本書主要內容
核心原始碼構建系統
ARM處理器結構
構建高效分析環境
彙編級啟動過程
核心分析常用API、ARM指令、GAS關鍵字
發生中斷到調用處理器的詳細過程

作者簡介

尹錫訓
所在公司的主營業務是在Linux、安卓系統上製作無線終端,擔任工程師已有3年。一直用C語言、Python、Java開發各種產品。最近把對未來的期待、展望與精力集中到Linux核心以及創業上,並不斷為之努力。
崔范松
吉林人,畢業於長春工業大學法學專業。大量接觸並翻譯過各類計算機圖書及相關資料,並從事過遊戲策劃及軟體測試工作。喜歡散步、旅遊等戶外運動,夢想成為一名自由職業者。

圖書目錄

第一部分 ARMLinux核心——分析核心前需要做的準備
第1章 核心介紹及2.6版和3.2版之間的差異 2
1.1 核心的誕生、作用以及內部結構 2
1.1.1 Linus創造的Linux 2
1.1.2 由多種子系統集成運行的單核心 3
1.1.3 全世界最著名的通用作業系統 5
1.2 核心2.6版和3.2版之間的差異 5
第2章 核心構建系統 8
2.1 核心初始化 8
2.2 核心配置 9
2.3 核心構建 11
2.4 核心安裝 17
第3章 了解ARM處理器 19
3.1 處理器概要和特徵 19
3.2 處理器架構與核心 19
3.3 處理器命名規則 21
3.4 處理器內部結構 21
3.5 處理器模式和暫存器 23
3.6 處理器異常 25
3.7 硬體擴展功能 26
3.7.1 快取 26
3.7.2 記憶體管理裝置 26
3.7.3 協處理器 26
第4章 構建分析環境 28
4.1 下載並安裝Linux源核心 28
4.1.1 下載源核心 28
4.1.2 安裝源核心 30
4.2 安裝ctags+cscope 31
4.2.1 用ctags製作原始碼標籤 31
4.2.2 製作cscope標籤資料庫 33
4.3 vim外掛程式下載及環境設定 34
4.3.1 下載vim外掛程式 34
4.3.2 vim+plugin的環境結構 37
4.3.3 vim環境設定 38
4.4 查看源碼分析環境工具 40
第二部分 核心的啟動——start_kernel調用方法
第5章 準備解壓核心 48
5.1 進入啟動載入後結束首個啟動——start標籤 49
5.2 BSS系統域初始化——not_relocated標籤 50
5.3 激活快取——cache_on標籤 53
5.4 頁目錄項初始化——__setup_mmu標籤 56
5.5 指令快取激活及快取策略適用——__common_mmu_cache_on標籤 58
第6章 從壓縮的核心zImage還原核心映像 60
6.1 解壓核心並避免覆寫——wont_overwrite、decompress_kernel標籤 61
6.2 調用已解壓核心——call_kernel標籤 62
6.3 快取清理及清除——cache_clean_flush標籤 62
6.4 快取禁用——cache_off標籤 64
第7章 調用start_kernel() 65
7.1 初始化指向——stext標籤 65
7.2 處理器信息搜尋——__look_processor_type 69
7.2.1 __lookup_processor_type標籤 69
7.2.2 __proc_info_begin和__proc_info_end中保存的信息 71
7.2.3 在MMU禁用狀態下將虛擬地址轉換為物理地址 73
7.2.4 查找proc_info_list結構體並比較處理器信息 74
7.3 搜尋我的機型——__lookup_machine_type 75
7.3.1 __lookup_machine_type標籤 75
7.3.2 保存在__arch_info_begin和__arch_info_end中的machine_desc信息及訪問路徑 76
7.3.3 查找machine_desc結構體並比較機器信息 77
7.4 源自啟動載入項的atags——__vet_atags標籤 78
7.5 對虛擬記憶體進行基礎創建——__create_page_tables標籤 81
7.6 設定核心(core)——v6_setup標籤 85
7.7 打開MMU並使用虛擬地址——__enable_mmu/__turn_mmu_on標籤 86
7.8 跳轉至start_kernel——__mmap_switched標籤 90
第三部分 核心的執行——核心的起始與結束位置
第8章 start_setup_processor_id()~~lock_kernel() 94
8.1 smp_setup_processor_id()、lockdep_init()、debug_objects_early_init() 95
8.1.1 smp_setup_processor_id() 95
8.1.2 lockdep_init() 95
8.1.3 debug_objects_early_init() 96
8.2 棧溢出感應——__boot_init_stack_canary 98
8.3 初始化提供進程集成方法的cgroup——__cgroup_init_early() 98
8.3.1 cgroupfs_root和cgroup的關聯初始化——init_cgroup_root() 102
8.3.2 初始化子系統——cgroup_init_subsys() 103
8.4 禁用IRQ 104
8.5 early_boot_irqs_off()、early_init_irq_lock_class() 104
8.6 大核心鎖——lock_kernel() 106
第9章 註冊針對時鐘事件的處理器 111
9.1 函式的聲明和定義——tick_init() 111
9.2 註冊處理事件的處理器——_clockevents_register_notifier() 113
9.2.1 為clockevents_lock添加自旋鎖 114
9.2.2 clockevents_chain生成原理 115
9.2.3 在clockevents_chain中註冊tick_notifier的方法 116
9.2.4 對clockevents_lock解除自旋鎖的原理 117
第10章 在CPU點陣圖中註冊當前運行CPU/初始化HIGHMEM管理 119
10.1 在包含熱插拔信息的點陣圖上添加執行init_task的CPU——boot_cpu_init() 119
10.2 管理高端記憶體——page_address_init() 121
第11章 整體指向——setup_arch 123
第12章 unwind_init()~~early_trap_init() 126
12.1 棧回溯——unwind_init() 126
12.2 求出包含機器信息的machine_desc結構體——setup_machine() 126
12.3 處理ATAG信息——setup_arch() 127
12.4 處理啟動參數——parse_cmdline() 129
12.5 構建原始碼樹——request_standard_resources() 131
12.6 初始化cpupossible點陣圖——smp_init_cpus() 136
12.7 用棧指定各ARM異常模式——cpu_init() 137
12.8 初始化以處理異常——early_trap_init() 138
12.9 查看中斷處理器函式 143
12.9.1 調用IRQ處理器——asm_do_IRQ() 147
12.9.2 返回中斷之前——ret_to_user標籤 147
第13章 設定處理器——setup_processor() 150
13.1 查看setup_processor()結構 150
13.2 查找CPUID——read_cpuid_id() 151
13.3 查找處理器信息——lookup_processor_type() 153
13.4 查找處理器結構信息——cpu_architecture() 153
13.5 查找處理器快取類型_cacheid_init() 156
13.6 調用處理器初始化函式——cpu_proc_init() 160
第14章 準備記憶體分頁——paging_init() 163
14.1 查看paging_init()的整體結構 163
14.2 設定記憶體類型表——build_mem_type_table() 165
14.3 檢驗記憶體信息——sanity_check_meminfo() 166
14.4 準備頁表——prepare_page_table() 168
14.4.1 prepare_page_table() 168
14.4.2 Linux的分頁結構 170
14.4.3 求出頁目錄項 170
14.4.4 pmd_clear() 172
14.5 設備區域映射準備——devicemaps_init() 174
14.6 準備使用高端記憶體——kmap_init() 177
14.7 初始化零頁 178
14.7.1 分配記憶體——__alloc_bootmem_nopanic() 179
14.7.2 在指定節點使用fallback分配記憶體——alloc_bootmem_core 180
14.7.3 將虛擬地址變換為page結構體——virt_to_page 182
14.8 保持數據快取一致性——flush_dcache_page() 182
第15章 在啟動時初始化記憶體分配器 184
15.1 bootmem函式流和數據結構 185
15.2 查看bootmem_init()結構 188
15.3 查找虛擬記憶體盤位置——check_initrd() 189
15.4 將節點的BANK信息反映到頁目錄——bootmem_init_node() 191
15.4.1 map_memory_bank() 192
15.4.2 bootmem_bootmap_pages() 195
15.4.3 find_bootmap_pfn() 196
15.4.4 node_set_online() 197
15.4.5 NODE_DATA宏 198
15.4.6 init_bootmem_node() 200
15.4.7 free_bootmem_node() 202
15.4.8 reserve_bootmem_node() 202
15.5 排除0號節點——reserve_node_zero() 203
15.6 排除虛擬記憶體盤節點——bootmem_reserve_initrd() 204
15.7 設定為無可用頁——bootmem_free_node() 205
15.8 初始化free_area區域 207
15.8.1 free_area結構體 207
15.8.2 free_area_init_node() 208
15.8.3 free_area_init_core() 209
15.8.4 init_currently_empty_zone() 211
15.8.5 memmap_init() 212
第16章 mm_init_owner()~~preempt_disable() 217
第17章 構建借用記憶體的後台 233
第18章 page_alloc_init()~~pidhash_init() 253
第19章 init_timers()~~page_cgroup_init() 273
第20章 終止bootmem分配器並替換為夥伴系統 297
第21章 初始化以支持CPU熱插拔 315
第22章 激活slab記憶體分配器——kmem_cache_init() 318
第23章 kmem_trace_init()~~security_init() 344
第24章 初始化VFS中使用的多種快取——vfs_cache_init() 367
第25章 radix_tree_init()~~ftrace_init() 382
第26章 同步記憶體與後備存儲——pagewriteback 394
第27章 查看啟動核心的最終函式結構——rest_init() 405
第28章 生成執行函式的核心執行緒——kernel_thread() 407
第29章 喚醒新生成的任務 419
第30章 準備使用核心 426
第31章 核心執行緒守護進程 453
第32章 find_task_by_pid_ns()~~cpu_idle() 469
附錄
附錄A 彙編語言、gas關鍵字總結 480
附錄B 核心分析常見API 485
附錄C 淺談ext2檔案系統 487
附錄D Linux執行緒模型 497
附錄E 連結器腳本檔案結構 500
後記 510
索引 513

相關詞條

熱門詞條

聯絡我們