期中总结
于佳心 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
计算机是如何工作的?
冯诺依曼体系结构:存储程序计算机,存储程序与程序控制
X86汇编基础:mov,push,pop,call,ret
汇编一个简单的C程序分析其汇编指令执行过程:汇编代码执行过程在堆栈中的变化
操作系统是如何工作的?
函数调用堆栈
三个法宝:
1.存储程序计算机工作模型
2.函数调用堆栈
3.中断
操作系统的两把剑:
1.中断上下文切换
2.进程上下文切换
建立框架:
pushl %ebp
movl %esp,%ebp
拆除框架:
movl %ebp,%esp
popl %ebp
ret
借助Linux内核部分源代码模拟存储程序计算机工作模型及时钟中断
CPU和内核代码共同实现了保存现场和恢复现场
在mykernel基础上构造一个简单的操作系统内核
C代码宏嵌入汇编代码的写法
asm(
汇编语句模板;
输出部分;
输入部分;
破坏描述部分);
构造一个简单的Linux系统MenuOS
idle是0号进程,关于0号进程和1号进程,所谓道生一(start_kernel....cpu_idle),一生二(kernel_init和kthreadd),二生三(即前面0、1和2三个进程),三生万物(1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先)
扒开系统调用的三层皮(上)
用户态、内核态和中断处理
中断处理是从用户态进入内核态主要的方式
系统调用概述和系统调用的三层皮
系统调用是特殊的中断
三层皮:
1.API
2.中断向量
3.中断服务程序
扒开系统调用的三层皮(下)
给MenuOS增加time和time-asm命令
在MenuOS中添加命令的过程分四步:
1.更新menu代码到最新版
2.在main函数中增加MenuConfig
3.增加对应函数
4.make rootfs
使用gdb跟踪系统调用内核函数sys_time
系统调用在内核代码中的工作机制和初始化
进程的描述和进程的创建
进程的描述
进程的三大功能
1.进程管理
2.文件管理
3.内核系统
进程的状态变化
进程的创建
在fork中,两个进程,fork系统调用在父子进程个返回一次
子进程 pid=0
父进程 pid=子进程的id
新进程是从ret_ from_ fork开始执行
可执行程序的装载
预处理、编译、链接和目标文件的格式
格式:
三种文件
1.可重定位文件
2.可执行文件
3.共享Object文件
两个链接器:链接编辑器,动态链接器
庄周(调用execve的可执行程序)入睡(调用execve陷入内核),醒来(系统调用execve返回用户态)发现自己是蝴蝶(被execve加载的可执行程序)
庄子和蝴蝶:你可以装载我,我可以装载你
进程的切换和系统的一般执行过程
进程的调度时机与进程的切换
不同类型的进程有不同的调度需求
第一种分类:
I/0-bound:频繁的进程I/0,通常会花费很多时间等待I/O操作的完成
CPU-bound:计算密集型,需要大量的CPU时间进行运算
第二种分类:批处理进程,实时进程,交互性进程(shell)
Linux系统的一般执行过程
最一般的情况:正在运行的用户态进程X切换到运行用户态进程Y的过程
-
正在运行的用户态进程X
-
发生中断——save cs:eip/esp/eflags(current) to kernel stack,then load cs:eip(entry of a specific ISR) and ss:esp(point to kernel stack).
-
SAVE_ALL //保存现场
-
中断处理过程中或中断返回前调用了schedule(),其中的switch_to做了关键的进程上下文切换
-
标号1之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行)
-
restore_all //恢复现场
-
iret - pop cs:eip/ss:esp/eflags from kernel stack
-
继续运行用户态进程Y
几种特殊情况
通过中断处理过程中的调度时机,用户态进程与内核线程之间互相切换和内核线程之间互相切换,与最一般的情况非常类似,只是内核线程运行过程中发生中断没有进程用户态和内核态的转换;
内核线程主动调用schedule(),只有进程上下文的切换,没有发生中断上下文的切换,与最一般的情况略简略;
创建子进程的系统调用在子进程中的执行起点及返回用户态,如fork;(next_ip=ret_from_fork)
加载一个新的可执行程序后返回到用户态的情况,如execve;
关于《Linux内核分析》
这是一本关于Linux内核的书:内核的目标,为达到目标所进行的设计以及设计的实现
从内核出发
内核有独一无二的特质,它实施自己的规则和奖罚措施,拥有整个系统的最高管理权
读书笔记链接:一二章
系统调用
描述了系统调用到底是什么,与库函数和API又怎样的关系
Linux程序如何实现系统调用,执行系统调用的连锁反应:陷入内核,传递系统调用号和参数,执行正确的系统调用函数,并把返回值带回用户空间
如何增加系统调用
读书笔记链接:第五章
调试
内核的调试:调试过程起始是一种寻求实现与目标偏差的行为
内核内置的调试架构,调试程序,记录日志,git二分法查找
读书笔记链接:第十八章
进程管理
操作系统中的核心概念:进程
进程的一般特性,进程与线程之间的关系,Linux如何存放和表示进程(task_struct,thread_info),如何创建进程(通过fork(),实际上最终是clone()),如何把新的执行映像装入到地址空间(exec()系统调用族),如何表示进程的层次关系,父进程如何收集后代的信息(wait()系统调用族),进程最终如何消亡(强制,或者调用exit())
读书笔记链接:第三章
链接
《深入理解计算机系统》中的内容
读书笔记链接:类似的第七章笔记
进程调度
进程调度程序是内核重要的组成部分
新CFS调度程序:适合众多可运行的进程,具有伸缩性,在调度周期和吞吐量之间求得平衡,满足各种负载的要求
进程调度所遵循的基本原则、具体实现、调度算法、牧犬Linux内核所使用的接口
读书笔记链接:第四章
学习心得:连续十周的学习之路充满坎坷,不过总算是坚持下来了,学得时候都自认为很明白,但是学完一周之后就会忘得差不多,看来及时复习还是必要的,所以又认真的总结了一遍,并辅以《Linux内核分析》教程,顿时感觉知识点捋顺了许多,为了不让辛苦学到的知识消失,还是需要定时复习一下