主页 详情

《ARM Linux内核源码剖析》_(韩)尹锡训等著;崔范松译_13598348_9787115359100

【书名】:《ARM Linux内核源码剖析》
【作者】:(韩)尹锡训等著;崔范松译
【出版社】:北京:人民邮电出版社
【时间】:2014
【页数】:518
【ISBN】:9787115359100
【SS码】:13598348

最新查询

内容简介

第一部分 ARM Linux内核——分析内核前需要做的准备

第1章 内核介绍及2.6版和3.2版之间的差异

1.1 内核的诞生、作用以及内部结构

1.1.1 Linus创造的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.3 vim插件下载及环境设置

4.3.1 下载vim插件

4.3.2 vim+plugin的环境结构

4.3.3 vim环境设置

4.4 查看源码分析环境工具

第二部分 内核的启动——start_kernel调用方法

第5章 准备解压内核

5.1 进入启动加载后结束首个启动——start标签

5.2 BSS系统域初始化——not relocated标签

5.3 激活缓存——cache on标签

5.4 页目录项初始化——setup mmu标签

5.5 指令缓存激活及缓存策略适用——common mmu cache on标签

第6章 从压缩的内核zlmage还原内核映像

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.1 smp_setup_processor_id()、lockdep_init()、debug_objects early_init()

8.1.1 smp_setup_processor_id()

8.1.2 lockdep_init()

8.1.3 debug_objects_early_init()

8.2 栈溢出感应——__boot_init_stack_canary

8.3 初始化提供进程集成方法的cgroup——_cgroup_init_early()

8.3 1 cgroupfs_root和cgroup的关联初始化——init_cgroup_root()

8.3.2 初始化子系统——cgroup_init_subsys()

8.4 禁用IRQ

8.5 early_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.2 clockevents_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信息——sctup 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 准备页表——prcpare_page_table()

14.4.1 prepare_page_table()

14.4.2 Linux的分页结构

14.4.3 求出页目录项

14.4.4 pmd_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.1 bootmem函数流和数据结构

15.2 查看bootmem_init()结构

15.3 查找虚拟内存盘位置——cheek_initrd()

15.4 将节点的BANK 信息反映到页目录——bootmem_init_node()

15.4.1 map memory_bank()

15.4.2 bootrmem bootmap_pages()

15.4.3 find_bootmap_pfn()

15.4.4 node_set_online()

15.4.5 NODE_DATA宏

15.4.6 init_bootmem_node()

15.4.7 free_bootmem_node()

15.4.8 reserve_bootmem_node()

15.5 排除0号节点——reserve_node_zero()

15.6 排除虚拟内存盘节点——bootmem_reserve_initrd()

15.7 设置为无可用页——bootmem_free_node()

15.8 初始化free_area区域

15.8.1 free_area结构体

15.8.2 free_area_init_node()

15.8.3 free_area_init_core()

15.8.4 init_currently_empty_zone()

15.8.5 memmap_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.1 build_zonelists()

17.4.2 build_zonelist_in_node_order()

17.4.3 build_zonelists_in_zone_order()

17.4.4 build_thisnode_zonclists()

17.4.5 build_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 构建迅速搜寻进程信息的结构——pidhasn_init()

第19章 init_timers()~page_cgroup_init()

19.1 初始化计时器——init_timers()

19.1.1 timers_cpu_notify()

19.1.2 register_cpu_notifier()

19.1.3 open_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子系统——cpus_et_init_early()

19.12 初始化内存子系统——page_cgroup_init()

第20章 终止bootmem分配器并替换为伙伴系统

20.1 mem_init()函数的调用关系及其与数据结构的相互关系

20.2 查看mem_init()结构

20.3 记录到不存在的内存位图——free_unused_memmap_node()

20.4 移交至普通空白页伙伴系统——free_all_bootmem_node()

20.4.1 register_page_bootmem_in_fonode()

20.4.2 free_all_bootmem_core()

20.4.3 __free_pages_bootmem()

20.4.4 __free_pages()

20.4.5 free_hot_cold_page()

20.4.6 __free_pages_ok()

20.5 移交到高端内存空白页伙伴系统——free area()

第21章 初始化以支持CPU热插拔

21.1 初始化cpu_hotplug成员变量——cpu_hotplug_init()

21.2 CPU的联机→脱机转换处理

第22章 激活slab内存分配器——kmem_cache_init()

22.1 slab分配器的概念及结构体

22.2 slab分配器的重要结构体——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.7 malloc_sizes和cache_names

22.8 生成cache——kmem_cache_create()

22.8.1 kmem_cache_zalloc()

22.8.2 calculate_slab_order()

22.8.3 setup_cpu_cache()

22.8.4 enable_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.2 delayacct_init

25.7.3 task_delay_info结构体和delayacct_tsk_init()

25.8 检查写缓冲一致性——check_bugs()

第26章 同步内存与后备存储——page write back

26.1 页回写机制

26.2 激活页回写——pdflush_init()

26.3 pdflush线程

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.4 RCU机制激活完成通知——rcu_scheduler_starting()

32.5 激活内核抢占——preempt_enable_no_resched()

32.6 执行进程调度表——schedule()

32.7 Linux启动万里长征的终点——cpu_idle()

附录

附录A 汇编语言、gas关键词总结

附录B 内核分析常见API

附录C 浅谈ext2文件系统

附录D Linux线程模型

附录E 链接器脚本文件结构

后记

索引


书查询(www.shuchaxun.com)本网页唯一编码:
e177e69a7dc7f6f2d4ea136778fd3fe1#e5a58ffc2f4ebad804fcdda27f2af049#82874633#ARM Linux内核源码剖析_13598348.zip