第一部份ARMLinux内核——分析内核前须要做的打算
第1章内核介绍及2.6版和3.2版之间的差别
1.1内核的诞生、作用以及内部结构
1.1.1Linus创造的Linux
1.1.2由多种子系统集成运行的单内核
1.1.3全世界最知名的通用操作系统
1.2内核2.6版和3.2版之间的差别
第2章内核建立系统
2.1内核初始化
2.2内核配置
2.3内核建立
2.4内核安装
第3章了解ARM处理器
3.1处理器概要和特点
3.2处理器构架与核心
3.3处理器命名规则
3.4处理器内部结构
3.5处理器模式和寄存器
3.6处理器异常
3.7硬件扩充功能
3.7.1缓存
3.7.2显存管理装置
3.7.3协处理器
第4章建立剖析环境
4.1下载并安装Linux源内核
4.1.1下载源内核
4.1.2安装源内核
4.2安装ctags+cscope
4.2.1用ctags制做源代码标签
4.2.2制做cscope标签数据库
4.3vim插件下载及环境设置
4.3.1下载vim插件
4.3.2vim+plugin的环境结构
4.3.3vim环境设置
4.4查看源码剖析环境工具
第二部份内核的启动——start_kernel调用方式
第5章打算解压内核
5.1步入启动加载后结束首个启动——start标签
5.2BSS系统域初始化——not_relocated标签
5.3激活缓存——cache_on标签
5.4页目录项初始化——__setup_mmu标签
5.5指令缓存激活及缓存策略适用——__common_mmu_cache_on标签
第6章从压缩的内核zImage还原内核映像
6.1解压内核并防止覆写——wont_overwrite、decompress_kernel标签
6.2调用已解压内核——call_kernel标签
6.3缓存清除及消除——cache_clean_flush标签
6.4缓存禁用——cache_off标签
第7章调用start_kernel
7.1初始化指向——stext标签
7.2处理器信息搜救——__look_processor_type
7.2.1__lookup_processor_type标签
7.2.2__proc_info_begin和__proc_info_end中保存的信息
7.2.3在MMU禁用状态下将虚拟地址转换为化学地址
7.2.4查找proc_info_list结构体并比较处理器信息
7.3搜救我的型号——__lookup_machine_type
7.3.1__lookup_machine_type标签
7.3.2保存在__arch_info_begin和__arch_info_end中的machine_desc信息及访问路径
7.3.3查找machine_desc结构体并比较机器信息
7.4源自启动加载项的atags——__vet_atags标签
7.5对虚拟显存进行基础创建——__create_page_tables标签
7.6设置核心(core)——v6_setup标签
7.7打开MMU并使用虚拟地址——__enable_mmu/__turn_mmu_on标签
7.8跳转至start_kernel——__mmap_switched标签
第三部份内核的执行——内核的起始与结束位置
第8章start_setup_processor_id~lock_kernel
8.1smp_setup_processor_id、lockdep_init、debug_objects_early_init
8.1.1smp_setup_processor_id
8.1.2lockdep_init
8.1.3debug_objects_early_init
8.2栈溢出感应——__boot_init_stack_canary
8.3初始化提供进程集成方式的cgroup——__cgroup_init_early
8.3.1cgroupfs_root和cgroup的关联初始化——init_cgroup_root
8.3.2初始化子系统——cgroup_init_subsys
8.4禁用IRQ
8.5early_boot_irqs_off、early_init_irq_lock_class
8.6大内核锁——lock_kernel
第9章注册针对时钟风波的处理器
9.1函数的申明和定义——tick_init
9.2注册处理风波的处理器——_clockevents_register_notifier
9.2.1为clockevents_lock添加载流子锁
9.2.2clockevents_chain生成原理
9.2.3在clockevents_chain中注册tick_notifier的方式
9.2.4对clockevents_lock解除载流子锁的原理
第10章在CPU位图中注册当前运行CPU/初始化HIGHMEM管理
10.1在包含热拔插信息的位图上添加执行init_task的CPU——boot_cpu_init
10.2管理高档显存——page_address_init
第11章整体指向——setup_arch
第12章unwind_init~early_trap_init
12.1栈回溯——unwind_init
12.2求出包含机器信息的machine_desc结构体——setup_machine
12.3处理ATAG信息——setup_arch
12.4处理启动参数——parse_cmdline
12.5建立源代码树——request_standard_resources
12.6初始化cpupossible位图——smp_init_cpus
12.7用栈指定各ARM异常模式——cpu_init
12.8初始化以处理异常——early_trap_init
12.9查看中断处理器函数
12.9.1调用IRQ处理器——asm_do_IRQ
12.9.2返回中断之前——ret_to_user标签
第13章设置处理器——setup_processor
13.1查看setup_processor结构
13.2查找CPUID——read_cpuid_id
13.3查找处理器信息——lookup_processor_type
13.4查找处理器结构信息——cpu_architecture
13.5查找处理器缓存类型_cacheid_init
13.6调用处理器初始化函数——cpu_proc_init
第14章打算显存分页——paging_init
14.1查看paging_init的整体结构
14.2设置显存类型表——build_mem_type_table
14.3检验显存信息——sanity_check_meminfo
14.4打算页表——prepare_page_table
14.4.1prepare_page_table
14.4.2Linux的分页结构
14.4.3求出页目录项
14.4.4pmd_clear
14.5设备区域映射打算——devicemaps_init
14.6打算使用高档显存——kmap_init
14.7初始化零页
14.7.1分配显存——__alloc_bootmem_nopanic
14.7.2在指定节点使用fallback分配显存——alloc_bootmem_core
14.7.3将虚拟地址变换为page结构体——virt_to_page
14.8保持数据缓存一致性——flush_dcache_page
第15章在启动时初始化显存分配器
15.1bootmem函数流和数据结构
15.2查看bootmem_init结构
15.3查找虚拟显存盘位置——check_initrd
15.4将节点的BANK信息反映到页目录——bootmem_init_node
15.4.1map_memory_bank
15.4.2bootmem_bootmap_pages
15.4.3find_bootmap_pfn
15.4.4node_set_online
15.4.5NODE_DATA宏
15.4.6init_bootmem_node
15.4.7free_bootmem_node
15.4.8reserve_bootmem_node
15.5排除0号节点——reserve_node_zero
15.6排除虚拟显存盘节点——bootmem_reserve_initrd
15.7设置为无可用页——bootmem_free_node
15.8初始化free_area区域
15.8.1free_area结构体
15.8.2free_area_init_node
15.8.3free_area_init_core
15.8.4init_currently_empty_zone
15.8.5memmap_init
第16章mm_init_owner~preempt_disable
16.1设置显存拥有者——mm_init_owner
16.2保存命令行——setup_command_line
16.3初始化per-cpu数据——setup_per_cpu_areas
16.4求CPU个数——setup_nr_cpu_ids
16.5注册SMP上的启动进程——smp_prepare_boot_cpu
16.6初始化数据结构以使用调度程序——sched_init
16.6.1为集合调度中使用的task_group的sched_entity结构体和runqueue结构体分配显存
16.6.2初始化root_domain、rt_bandwidth、task_group相关数据结构
16.6.3初始化系统上所有可用CPU的就绪队列
16.6.4初始化当前任务的调度相关值与注册针对负载均衡的中断处理器
16.7容许内核占领和制止占据——preempt_enable/preempt_disable
第17章建立借用显存的后台
17.1在build_all_zonelists中操作的一些数据结构
17.2查看build_all_zonelists结构
17.3决定zone的列表形式——set_zonelist_order
17.4建立备用列表和备用位图——__build_all_zonelists
17.4.1build_zonelists
17.4.2build_zonelist_in_node_order
17.4.3build_zonelists_in_zone_order
17.4.4build_thisnode_zonelists
17.4.5build_zonelists_cache
17.5输出备用列表信息——mminit_verify_zonelist
17.6指定处理页分配恳求的节点——cpuset_init_current_mems_allowed
17.7求空页数——nr_free_pagecache_pages
17.8页联通性
第18章page_alloc_init~pidhash_init
18.1处理用于热拔插CPU的页——page_alloc_init
18.2处理console参数——parse_early_param
18.3处理特殊参数——parse_args
18.4确认中断处理是否激活——irqs_disable
18.5内核异常列表定义——sort_main_extable
18.6初始化RCU机制——rcu_init
18.7打算使用IRQ——early_irq_init
18.8初始化中断——init_IRQ
18.9建立迅速搜救进程信息的结构——pidhash_init
第19章init_timers~page_cgroup_init
19.1初始化计时器——init_timers
19.1.1timers_cpu_notify
19.1.2register_cpu_notifier
19.1.3open_softirq
19.2初始化高帧率计时器——hrtimers_init
19.3注册softirq的反弹函数——softirq_init
19.4设置xtime——timekeeping_init
19.5初始化硬件计时器——time_init
19.6初始化时钟时间——sched_clock_init
19.7激活CPU的中断处理——local_irq_enable
19.8测量用作根文件系统的init虚拟显存盘
19.9初始化以分配动态显存——vmalloc_init
19.10预先初始化目录项和索引节点缓存——vfs_caches_init_early
19.11初始化cpuset子系统——cpuset_init_early
19.12初始化显存子系统——page_cgroup_init
第20章中止bootmem分配器并替换为伙伴系统
20.1mem_init函数的调用关系及其与数据结构的互相关系
20.2查看mem_init结构
20.3记录到不存在的显存位图——free_unused_memmap_node
20.4移交至普通空白页伙伴系统——free_all_bootmem_node
20.4.1register_page_bootmem_info_node
20.4.2free_all_bootmem_core
20.4.3__free_pages_bootmem
20.4.4__free_pages
20.4.5free_hot_cold_page
20.4.6__free_pages_ok
20.5移交到高档显存空白页伙伴系统——free_area
第21章初始化以支持CPU热拔插
21.1初始化cpu_hotplug成员变量——cpu_hotplug_init
21.2CPU的联机→脱机转换处理
第22章激活slab显存分配器——kmem_cache_init
22.1slab分配器的概念及结构体
22.2slab分配器的重要结构体——kmem_cache和kmem_list3
22.3查看kmem_cache_init结构
22.4初始化initkmem_list3〔〕、cache_cache、nodelist〔〕
22.5联接kmem_list3字段并决定cache压缩时间——set_up_list3s
22.6求出用于cache扩充/压缩的页次序——cache_estimate
22.7malloc_sizes和cache_names
22.8生成cache——kmem_cache_create
22.8.1kmem_cache_zalloc
22.8.2calculate_slab_order
22.8.3setup_cpu_cache
22.8.4enable_cpucache
22.9生成arraycache_init,kmem_list3cache
22.10用kmalloc函数分配的显存取代静态分配的显存
第23章kmem_trace_init~security_init
23.1生成IDalloccator缓存——idr_init_cache
23.2初始化pageset——setup_per_cpu_pageset
23.3指定交叉节点——numa_policy_init
23.4结束计时器初始化——late_time_init
23.5测定BogoMIPS——calibrate_delay
23.6制做位图以分配进程辨识符(ID)——pidmap_init
23.7初始化优先树的数据结构——prio_tree_init
23.8生成anon_vmaslab缓存——anon_vma_init
23.9为对象的每位用户赋于资格——cred_init
23.10初始化数据结构以使用fork函数——fork_init
23.11初始化生成进程的缓存——proc_caches_init
23.12初始化缓冲缓存——buffer_init
23.13打算秘钥——key_init
第24章初始化VFS中使用的多种缓存——vfs_cache_init
第25章radix_tree_init~ftrace_init
25.1基数树相关数据结构初始化——radix_tree_init
25.2打算使用讯号——signals_init
25.3注册并挂载proc文件系统——proc_root_init
25.4注册无法初始化的子系统——cgroup_init
25.5重置top_cpuset并注册cpuset文件系统——cpuset_init
25.6初始化任务统计信息插口——delayacct_init
25.7为管理延后信息做打算——delayacct_init
25.7.1延后审计
25.7.2delayacct_init
25.7.3task_delay_info结构体和delayacct_tsk_init
25.8检测写缓冲一致性——check_bugs
第26章同步显存与后备储存——pagewriteback
26.1页回写机制
26.2激活页回写——pdflush_init
26.3pdflush线程
26.4指定页回写函数
26.5周期性页回写和强制性页回写反弹函数调用方式
26.5.1周期性页回写函数——wb_kupdate
26.5.2强制性页回写函数——background_writeout
26.6初始化周期性页回写
第27章查看启动内核的最终函数结构——rest_init
第28章生成执行函数的内核线程——kernel_thread
28.1查看kernel_thread结构
28.2生成处理器的网段——do_fork
28.3复制父进程——copy_process
第29章唤起新生成的任务
29.1查看wake_up_new_task结构
29.2获取任务的就绪队列——task_rq_lock
29.3改善任务的优先次序——effective_prio
第30章打算使用内核
30.1将当前进程转移到其他CPU——sched_init_smp
30.2结束系统整体初始化——do_basic_setup
30.2.1生成执行rcu_sched_grace_period的线程——rcu_init_sched
30.2.2生成events工作队列——init_workqueues
30.2.3初始化cpuset子系统的top_cpuset——cpuset_init_smp
30.2.4生成khelper工作队列——usermodehelper_init
30.2.5初始化Linux的设备模型——driver_init
30.2.6在proc文件系统注册irq信息——init_irq_proc
30.2.7调用内核未知子系统——do_initcalls
30.3为初始化以后的操作做打算——init_post
第31章内核线程守护进程
31.1内核线程守护进程——kthreadd
31.2忽视讯号——ignore_signals
31.3设置nice值——set_user_nice
31.4搜索执行任务的CPU——set_cpus_allowed_prt
31.5搜索包含列表的实际结构体位置——list_entry
31.6生成内核线程——create_kthread
第32章find_task_by_pid_ns~cpu_idle
32.1用PID搜索任务——find_task_by_pid_ns
32.2解除BKL——unlock_kernel
32.3将调度类变更为idle——init_idle_bootup_task
32.4RCU机制激活完成通知——rcu_scheduler_starting
32.5激活内核占据——preempt_enable_no_resched
32.6执行进程调度表——schedule
32.7Linux启动万里长征的终点——cpu_idle
附表
附表A汇编语言、gas关键词总结
附表B内核剖析常见API
附表C探讨ext2文件系统
附表DLinux线程模型
附表E链接器脚本文件结构
杂记
索引