Linux内核学习总结
Linux内核学习总结
张忻 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
对Linux系统的理解及学习Linux内核的心得
Linux是一个多进程的操作系统,所以,其他的进程必须等到正在运行的进程空闲CPU后才能运行。当正在运行的进程等待其他的系统资源时,Linux内核将取得CPU的控制权,并将CPU分配给其他正在等待的进程,这就是进程切换。内核中的调度算法决定将CPU分配给哪一个进程。
Linux系统有一个进程控制表(process table),一个进程就是其中的一项。进程控制表中的每一项都是一个task_struct结构,在task_struct结构中存储各种低级和高级的信息,包括从一些硬件设备的寄存器拷贝到进程的工作目录的链接点。进程控制表既是一个数组,又是一个双向链表,同时又是一个树,其物理实现是一个包括多个指针的静态数组。系统启动后,内核通常作为某一个进程的代表。一个指向task_struct的全局指针变量current用来记录正在运行的进程。
刚开始,我认为主要的问题在于你知道不知道,而不是理解不理解,某个子系统的实现采用了某种策略、方法,而在学习中需要做的就是知道有这么一回事儿,然后才是理解所描述的策略或者方法。但是经过老师讲解后,才发现理解更重要。
学完课程后,能在自己的脑海中建立起内核的大体框架,理解各个子系统的设计理念和构建思想,这些理念和思想会从宏观上呈献给你清晰的脉络,就像一个去除了枝枝叶叶的大树的主干,一目了然;当然,肯定还会涉及到具体的实现方法、函数,但是此时接触到的函数或者方法位于内核实现的较高的层次,是主(要)函数,已经了解到这些函数,针对的是哪些设计思想,实现了什么样的功能,达成了什么样的目的。至于该主函数所调用的其它的辅助性函数就等同于枝枝叶叶了,不必太早就去深究。此时,也就初步建立起了内核子系统框架和代码实现之间的关联,关联其实很简单,比如一看到某个函数名字,就想起这个函数是针对哪个子系统的,实现了什么功能。
Linux内核分析博客链接和知识汇总
- 学习链接总结
LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS
LINUX内核分析第四周学习总结——扒开应用系统的三层皮(上)
LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下)
LINUX内核分析第八周学习总结——进程的切换和系统的一般执行过程
- 学习知识总结
1.计算机是如何工作的?
存储程序计算机工作模型
X86汇编基础
汇编一个简单的C程序分析其汇编指令执行过程
2.操作系统是如何工作的?
函数调用堆栈
借助Linux内核部分源代码模拟存储程序计算机工作模型及时钟中断
在mykernel基础上构造一个简单的操作系统内核
3.构造一个简单的Linux系统MenuOS
构造一个简单的Linux系统
4.扒开系统调用的三层皮(上)
(一)用户态、内核态和中断处理过程
(二)系统调用概述
系统调用概述和系统调用的三层皮
(三)使用库函数API和C代码中嵌入汇编代码触发同一个系统调用
使用库函数API获取系统当前时间
C代码中嵌入汇编代码的方法(复习)
使用C代码中嵌入汇编代码触发系统调用获取系统当前时间
5.扒开应用系统的三层皮(下)
(一)给MenuOS增加time和time-asm命令
(二)使用gdb跟踪系统调用内核函数sys_time
(三)系统调用在内核代码中的工作机制和初始化
1. 系统调用在内核代码中的工作机制和初始化
2. 简化后便于理解的system_call伪代码
3. 简单浏览system_call和iret之间的主要代码
6.进程的描述和进程的创建
进程的描述
- 进程描述符task_struct数据结构(一)
- 进程描述符task_struct数据结构(二)
进程的创建
- 进程的创建概览及fork一个进程的用户态代码
- 理解进程创建过程复杂代码的方法
- 浏览进程创建过程相关的关键代码
- 创建的新进程是从哪里开始执行的?
- 使用gdb跟踪创建新进程的过程
7.可执行程序的装载
(一)预处理、编译、链接和目标文件的格式
1.可执行程序是怎么得来的
2.目标文件的格式ELF
3.静态链接的ELF可执行文件和进程的地址空间
(二)可执行程序、共享库和动态加载
1.装载可执行程序之前的工作
2.装载时动态链接和运行时动态链接应用举例
(三)可执行程序的装载
1.可执行程序的装载相关关键问题分析
2.sys_execve的内部处理过程
3.使用gdb跟踪sys_execve内核函数的处理过程
4.可执行程序的装载与庄生梦蝶的故事
5.浅析动态链接的可执行程序的装载
8.进程的切换和系统的一般执行过程
(一)进程切换的关键代码switch_to分析
1.进程进度与进程调度的时机分析
2.进程上下文切换相关代码分析
(二)Linux系统的一般执行过程
1.Linux系统的一般执行过程分析
2.Linux系统执行过程中的几个特殊情况
3.内核与舞女
(三)Linux系统架构和执行过程概览
1.Linux操作系统架构概览
2.最简单也是最复杂的操作——执行ls操作
3.从CPU和内存的角度看Linux系统的执行
总结部分:学习《Linux内核分析》课程中最大的收获?学习完《Linux内核分析》课程后您最大的遗憾是什么?
慕课上完了,但是内核学习却才开始。这几周的博客和作业,一直认真地写,对知识多少有些掌握但一直不够清晰。讨论中才知道自己的基础薄弱。课上我们分析的是linux-3.18.6内核源码,其精妙的数据结构和算法简直让人叹为观止。课堂我们也只是查看了部分核心源码,希望在今后我可以学习更多。简单,漂亮的内核,我们没有理由不去学习。 linux内核,主要包括进程管理、内存管理、设备驱动、文件系统,从分析内核了解到整个系统是如何工作的,如何控制管理资源分配,进程切换并执行。各种策略和结构让系统运行时更有效率。只有懂得其中的基本工作机制才能够有效的裁剪内核,再重新编译内核,生成高效、可移植的内核模块。
最大的收获是让我对内核有了进一步的认识,对于源码能够自己去搜索查看,能通过阅读部分核心源码来验证老师所说的理论。之前的学习就像盲人摸象,不能联系到一起,学的很零碎。通过这次课,就像老师所说的,有时候我们可以先动脑想一下系统是如何操作如何管理的,然后再看源码验证纠正自己的想法,这样的内核学习方式更加有效,毕竟内核源码博大精深,想要研究透彻不是一朝一夕可以做到的。
总结下我这次课程的学习,我觉得遗憾是还有好多不足,慕课结束了,到现在还没有把所有的知识点串起来,没能很好的形成一条主线,还需要多花时间理一理,能够有更清晰的思路才能更好的学习好内核。