一. 前言
从本文开始,我们进入内存部分的学习。首先会接着前面的任务task_struct
讲解任务空间管理结构体mm_struct
,并简单介绍物理内存和虚拟内存的相关知识,关于详细的基础知识和概念可以参照CSAPP一书,这里不会做过多的赘述,而是默认在已了解其映射关系的基础上进行的学习。在后文中,会继续介绍物理内存的管理以及用户态和内核态的内存映射。
Collecting, sharing and creating knowledge
前文分析到Linux内核正式启动,完成了实模式到保护模式的切换,并做好了各种准备工作。下来就要看开始内核初始化工作了,源码位置位于init/main.c中的start_kernel()
,源码如附录所示。这包括了一系列重要的初始化工作,本文会介绍其中一部分较为重要的,但是详细的介绍依然会留在后文各个模块的源码学习中单独进行。本文的目的在于承接上文给出一个从内核启动到各个模块开始运转的过程介绍,而不是详细的各部分内容介绍。
创建0号进程:INIT_TASK(init_task)
异常处理类中断服务程序挂接:trap_init()
内存初始化:mm_init()
调度器初始化sched_init()
剩余初始化:rest_init()
Linux操作系统内核是服务端学习的根基,也是提高编程能力、源码阅读能力和进阶知识学习能力的重要部分,本文开始将记录Linux操作系统中的各个部分源码学习历程。
关于如何学习源码,个人觉得可以从以下角度入手,有效地提高阅读和学习的效率。(学习语言就不说了,这是基本功。学习IDE推荐Source Insight或者Visual Studio,网站源码阅读推荐woboq)