尹锡训
所在公司的主营业务是在Linux、安卓系统上制作无线终端,担任工程师已有3年。一直用C语言、Python、Java开发各种产品。最近把对未来的期待、展望与精力集中到Linux内核以及创业上linux内核添加函数linux内核添加函数,并不断为之努力。
崔范松
吉林人linux运维面试题,毕业于长春工业大学法学专业。大量接触并翻译过各类计算机图书及相关资料linux操作系统培训,并从事过游戏策划及软件测试工作。喜欢散步、旅游等户外运动,梦想成为一名自由职业者。
目錄:
第一部分ARM Linux内核——分析内核前需要做的准备
第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初始化cpu possible位图——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查找CPU ID——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_enablepreempt_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_list3 cache
22.10用kmalloc函数分配的内存替代静态分配的内存
第23章kmem_trace_init~security_init
23.1生成ID alloccator缓存——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_vma slab缓存——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章同步内存与后备存储——page write back
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链接器脚本文件结构
后记
索引