linux内核C阶段分析(二)

上一章我们看到setup_nr_cpu_ids();

 

我们继续往下看:

 

setup_per_cpu_areas 是为了对内核的内存管理(mm)进行初始化而调用的函数之一

 

smp_prepare_boot_cpu();arch-specific boot-cpu钩子不知道干啥的后面可以看一下

 

build_all_zonelists(NULL);建立节点和内存区域之间的关系

 

page_alloc_init();内存初始化

 

printk(KERN_NOTICE "Kernel command line: %s\n", boot_command_line);

 

parse_early_param();解析早期参数

 

 

parse_args("Booting kernel", static_command_line, __start___param,

                 __stop___param - __start___param,

                 -1, -1, &unknown_bootoption);参数的解析

 

 

jump_label_init();这边是个空函数,不做处理

 

setup_log_buf(0);函数负责设置 printk 缓冲区 

 

pidhash_init(); 4种PID的hash表初始化

 

vfs_caches_init_early(); Linux文件子系统( VFS)的初始化

 

sort_main_extable();Linux异常表

 

trap_init();主要用来处理硬件异常处理中断向量

 

mm_init();从bootmem迁移到伙伴系统,slab分配器也会建立。

 

sched_init();在启动任何中断(例如计时器中断)之前设置调度程序。完整的拓扑设置在smp_init()时完成——但同时我们仍然有一个功能正常的调度器。

 

preempt_disable();禁用抢占——在第一次使用cpu_idle()之前,早期的启动调度是非常脆弱的。

 

 

idr_init_cache(); idr初始化创建IDR机制的内存缓存对象。所谓的IDR就是整数标识管理机制(integerIDmanagement)

 

perf_event_init(); perf是内置于Linux内核源码树中的性能剖析工具

 

rcu_init();RCURead-Copy Update)是数据同步的一种方式,在当前的Linux内核中发挥着重要的作用。

 

radix_tree_init(); Linux基数树(radix tree)是将指针与long整数键值相关联的机制,它存储有效率,并且可快速查询,用于指针与整数值的映射(:IDR机制)、内存管理等。

 

early_irq_init();早期中断初始化

 

init_IRQ();初始化中断

 

 

prio_tree_init();linux中的优先搜索树的实现

 

init_timers();时钟系统初始化

 

hrtimers_init();Linux内部时钟处理机制

 

softirq_init();软中断初始化

 

timekeeping_init();Linux时间子系统

 

time_init();执行init_timers() softirq_init()time_init()函数,分别初始系统的定时器机制,软中断机制以及系统日期和时间。

 

profile_init();初始化-系统时间

 

call_function_init();

 

 

local_irq_enable();屏蔽当前CPU上的所有中断

 

kmem_cache_init_late();完善slab分配器的缓存机制

 

 

入侵警报!这是早期。我们在完成PCI设置等之前就启用了控制台,而console_init()必须意识到这一点。但我们确实希望尽早输出,以防出现问题。

 

console_init();linux初始化过程中,除非启用了early console,否则直到console_init调用之前是没有任何输出的,它们的输出都放在__log_buf这个缓冲内的,在console_init调用时再将这个缓冲区内的数据一次性输出。

 

lockdep_info();Linux 死锁检测模块

 

irqs启用时需要运行这个,因为它想要自我测试[/]-irqs开启/关闭锁反转bug:

 

locking_selftest();锁定自检

 

 

page_cgroup_init();

 

debug_objects_mem_init();

 

kmemleak_init();内存泄漏检测

 

setup_per_cpu_pageset();前面所用per_cpu管理结构都是临时静态分配的。现在per_cpu机制已经启动,所以重新动态分配一个per_cpu管理结构并初始化。

 

numa_policy_init();(内存分配策略)

 

sched_clock_init();执行sched_clock_init之前,获取的调度时钟时间都是0,执行sched_clock_init之后,取得的调度时钟时间都是有非零值的。

 

calibrate_delay();函数可以计算出cpu在一秒钟内执行了多少次一个极短的循环,最终计算出来的值赋给变量loop_per_jiffs

 

pidmap_init();pid哈希链表

 

anon_vma_init();

 

 

thread_info_cache_init();thread_info就保存了特定体系结构的汇编代码段需要访问的那部分进程的数据

 

cred_init();任务系统初始化

 

fork_init(totalram_pages); 0号进程idle进程启动,这是系统唯一不通过do_fork创建的进程

 

proc_caches_init();构创建高速缓存内存

 

buffer_init();

 

key_init();

 

security_init();初始化LSM,

 

dbg_late_init();文件系统初始化

 

vfs_caches_init(totalram_pages);

 

signals_init();信号量相关

 

page_writeback_init();填充rootfs可能需要页面回写

 

 

proc_root_init();proc文件系统

 

cgroup_init();这个函数就是初始化cgroup所需要的参数的。cgroup最初是在2006年由google的一名工程师提出的,目的是把一些共同目标的进程放在一个组里面,而这个组里面的进程能共享指定数额的资源。而后就有了cgroup这个概念了。

 

cpuset_init();Cpuset子系统的实现是通过在内核代码加入一些hook代码。

 

taskstats_init_early();Security模块

 

delayacct_init();

 

check_bugs();

 

acpi_early_init(); /* before LAPIC and SMP init */LAPICSMP init之前ACPI表示高级配置和电源管理接口

 

sfi_init_late();

 

ftrace_init();ftraceFunction Trace的意思,最开始主要用于记录内核函数运行轨迹;随着功能的逐渐增加,演变成一个跟踪框架。

 

rest_init();rest_init中调用kernel_thread函数启动了2个内核线程,分别是:kernel_initkthreadd调用schedule函数开启了内核的调度系统,从此linux系统开始转起来了。

 

至此linux系统开始运行,下一张,咱们开始单个系统去分析,在linux学习中如浩瀚海洋,某一部分看不明白其实不用细究,关键是用得到的东西去学习,各种子系统,别人是如何实现的,程序的设计思想是什么。咱们下周见

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本PDF电子书包含上下两册,共1576页,带目录,高清非扫描版本。 作者: 毛德操 胡希明 丛书名: Linux内核源代码情景分析 出版社:浙江大学出版社 目录 第1章 预备知识 1.1 Linux内核简介. 1.2 Intel X86 CPU系列的寻址方式 1.3 i386的页式内存管理机制 1.4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2.9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址映射 2.12 系统调用brk() 2.13 系统调用mmap() 第3章 中断、异常和系统调用 3.1 X86 CPU对中断的硬件支持 3.2 中断向量表IDT的初始化 3.3 中断请求队列的初始化 3.4 中断的响应和服务 3.5 软中断与Bottom Half 3.6 页面异常的进入和返回 3.7 时钟中断 3.8 系统调用 3.9 系统调用号与跳转表 第4章 进程与进程调度 4.1 进程四要素 4.2 进程三部曲:创建、执行与消亡 4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章 文件系统 5.1 概述 5.2 从路径名到目标节点 5.3 访问权限与文件安全性 5.4 文件系统的安装和拆卸 5.5 文件的打开与关闭 5.6 文件的写与读 5.7 其他文件操作 5.8 特殊文件系统/proc 第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6.5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程间通信 7.1系统调用socket() 7.2函数sys—socket()——创建插口 7.3函数sys—bind()——指定插口地址 7.4函数sys—listen()——设定server插口 7.5函数sys—accept()——接受连接请求 7.6函数sys—connect()——请求连接 7.7报文的接收与发送 7.8插口的关闭 7.9其他 第8章设备驱动 8.1概述 8.2系统调用mknod() 8.3可安装模块 8.4PCI总线 8.5块设备的驱动 8.6字符设备驱动概述 8.7终端设备与汉字信息处理 8.8控制台的驱动 8.9通用串行外部总线USB 8.10系统调用select()以及异步输入/输出 8.11设备文件系统devfs 第9章多处理器SMP系统结构 9.1概述 9.2SMP结构中的互斥问题 9.3高速缓存与内存的一致性 9.4SMP结构中的中断机制 9.5SMP结构中的进程调度 9.6SMP系统的引导 第10章系统引导和初始化 10.1系统引导过程概述 10.2系统初始化(第一阶段) 10.3系统初始化(第阶段) 10.4系统初始化(第三阶段) 10.5系统的关闭和重引导
第1章 预备知识 1. 1 Linux内核简介 1. 2 Intel X86 CPU系列的寻址方式 1. 3 i386的页式内存管理机制 1. 4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2. 9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址映射 2.12 系统调用brk() 2.13 系统调用mmap() 第3章 中断、异常和系统调用 3.1 X86 CPU对中断的硬件支持 3. 2 中断向量表IDT的初始化 3. 3 中断请求队列的初始化 3. 4 中断的响应和服务 3. 5 软中断与Bottom Half 3.6 页面异常的进入和返回 3. 7 时钟中断 3. 8 系统调用 3. 9 系统调用号与跳转表 第4章 进程与进程调度 4.1 进程四要素 4.2 进程三部曲:创建、执行与消亡 4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章 文件系统 5.1 概述 5. 2 从路径名到目标节点 5. 3 访问权限与文件安全性 5. 4 文件系统的安装和拆卸 5.5 文件的打开与关闭 5. 6 文件的写与读 5.7 其他文件操作 5. 8 特殊文件系统/proc 第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6. 5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章 基于socket的进程间通信 7.1 系统调用socket() 7.2 函数sys—socket()——创建插口 7.3 函数sys—bind()——指定插口地址 7.4 函数sys—listen()——设定server插口 7.5 函数sys—accept()——接受连接请求 7.6 函数sys—connect()——请求连接 7.7 报文的接收与发送 7.8 插口的关闭 7.9 其他 第8章 设备驱动 8.1 概述 8.2 系统调用mknod() 8.3 可安装模块 8.4 PCI总线 8.5 块设备的驱动 8.6 字符设备驱动概述 8.7 终端设备与汉字信息处理 8.8 控制台的驱动 8.9 通用串行外部总线USB 8.10 系统调用select()以及异步输入/输出 8.11 设备文件系统devfs 第9章 多处理器SMP系统结构 9.1 概述 9.2 SMP结构中的互斥问题 9.3 高速缓存与内存的一致性 9.4 SMP结构中的中断机制 9.5 SMP结构中的进程调度 9.6 SMP系统的引导 第10章 系统引导和初始化 10.1 系统引导过程概述 10.2 系统初始化(第一阶段) 10.3 系统初始化(第阶段) 10.4 系统初始化(第三阶段) 10.5 系统的关闭和重引导

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值