SA16225055冯金明 原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
时间的力量还是伟大的,课程终归是要结束了(不用再写博客啦!),要不是课程实验的要求,可能一年不能写到7篇博客的,同时估计一年Linux内核代码也看不了多少的!先简单贴一下各个博客的链接的:
简单总结每个章节掌握到的一些知识点:
计算机是如何工作的?
- 存储程序计算机工作模式:冯.诺依曼体系结构
- X86汇编基础:CPU的寄存器(通用寄存器、段寄存器、标志寄存器)、常见汇编指令、堆栈
- 汇编一个简单的C程序分析其汇编指令执行过程
操作系统是如何工作的?
- 函数调用堆栈
- 模拟存储程序计算机工作模型及时钟中断
- 构造一个简单的操作系统内核
- 三大法宝
堆栈:高级语言的起点,函数调用需要堆栈机制
中断机制:多道系统的基础,计算机效率提高的关键
构造一个简单的Linux系统MenuOS
- 关键进程的初始化:sched_init()进程调度初始化函数,0号进程,即idle进程的初始化;rest_init()其他初始化函数,函数内创建1号进程,即init进程!
- Linux内核的启动过程:rest_init()函数可以算是在运行最后的初始化工作,其中就包括创建1号进程以及第一个内核进程等操作。创建完成后,则使用do_fork()来创建新的进程。pid是会进行一个累加的。内核线程调用cpu_startup_entry,再调用其中的cpu_idel_loop函数进入循环,此即为0号进程。从rest_init开始,Linux开始产生进程,在rest_init中,通过init_task产生pid=0的进程,即0号进程(idle进程),它是内核状态下的进程;在rest_init函数中,内核通过kernel_init创建1号进程,它是第一个用户态进程。关于init_task(也就是idle),当运行队列中没有别的就绪进程时,init_task(也就是idle)将会被调用,它的核心是一个while(1)循环,在循环中它将会调用schedule函数以便在运行队列中有新进程加入时切换到该新进程上。
扒开系统调用的三层皮(上)
- 用户态、内核态和中断处理过程
- 系统调用的具体分析以及三层皮:xyz(API),system_call(中断向量),sys_xyz(中断服务程序)
- 使用库函数API和C代码中嵌入汇编代码触发同一个系统调用
扒开系统调用的三层皮(下)
- 分析system_call()中断处理过程:
system_call是Linux中所有系统调用的入口点,每个系统调用都至少需要有一个参数,即由eax传递进入的系统调用号。call *sys_call_table(,%eax,4)函数,就是通过eax传递进来的系统调用号来寻找相信的系统调用处理函数。系统调用本质上是一种特殊的中断,所以它也需要进行现场的保存和结束调用后的恢复。
进程的描述和进程的创建
- 进程描述符task_struct数据结构
- fork()、vfork()和clone()都是通过调用do_fork()来实现进程的创建
- do_fork()、copy_process()和dup_task_struct( )函数的分析
可执行程序的装载
- 可执行文件的创建
- ELF三种主要的目标文件
- 可执行程序的执行环境以及执行过程
进程的切换和系统的一般执行过程
- 进程的切换
- Linux系统的一般执行过程
- 进程调度的时机
- 进程切换代码switch_to分析
课程总结
Linux的内核代码我一直都很感兴趣,但是由于代码量非常的大,纷繁复杂,实在是不知道从哪儿入手。听了孟老师的课,让我对linux内核的工作执行有了深刻的理解,同时也为我打开了一扇读懂读透Linux内核代码的大门!由于老师讲的都是提纲挈领的Linux内核知识,要是真的想真正深入进入,还是需要静下心来,认真分析和理解!希望可以在理解老师所讲内容的基础上,能够真正理解内核源码,能够完全领悟内核源码的精妙之处,借鉴Linux内核源码,习得Linux内核所蕴含的为人之道!