课程先建立起内核的大体框架,让我们理解各个子系统的设计理念和构建思想,这些理念让我有一个清晰的脉络,然后,老师给我们一项一项讲解、实践具体的实现方法、函数,我们就了解到这些函数,针对的是哪些设计思想,实现了什么样的功能,达成了什么样的目的,运用起来也就更加得心应手。
在我看来linux的重点有:
1.存储程序计算机
2.函数调?堆栈
3.中断和中断上下文切换
4.进程相关
5.系统调用
6.文件系统
1.存储程序计算机
冯·诺依曼计算机由运算器、存储器、控制器、输?设备和输出设备组成
冯·诺依曼体系结构的核?是存储程序计算机。把 CPU 抽象成?个 for 循环,因为它总是在执?next instruction(下?条指令),然后从内存?取下?条指令来执?。从这个?度来看,内存保
存指令和数据,CPU 负责解释和执?这些指令,它们通过总线连接起来。cpu有一个ip寄存器,它负责存储将要执?的下?条指令在存储器中的地址。
2.函数调?堆栈
cs:eip总是指向下一条 的指令地址,当遇到函数调用call指令时,要先保存eip的值,把它压入栈中,然后加入调用函数,把ebp压入栈中,将之前的esp保存的值放到ebp,执行函数操作,然后将ebp的值放回esp,从栈中弹出原来的ebp值
3.中断和中断上下文切换
中断最初?于避免CPU轮询I/O设备,就绪状态发?时让I/O设备主动通过中断信号通知CPU,??提?了CPU在输?输出上的?作效率,这就是硬件中断(外部中断)。后来随着中断适?范围扩?,?如解决机器运?过程出现的异常情况以及系统调?的实现等,这就产?了软件中断(内部中断),也称为异常,软件中断?分为故障(fault)和陷阱(trap)。
当?个中断信号发?时,CPU把当前正在执?的进程X的CS:RIP寄存器和RSP寄存器等都压栈到了?个叫内核堆栈的地?,然后把CS:RIP指向?个中断处理程序的??,做保存现场的?作,然后去执?其他进程?如Y,等重新回来时再恢复现场,即恢复CS:RIP寄存器和RSP寄存器等到CPU上继续执?原进程X。
中断和异常的硬件处理
- 确定与中断和异常相关的联的向量i
- 读取idtr寄存器指向的IDT表中的第i项
- 从gdtr寄存器中获得GDT的基地址, 并在GDT中查找, 以读取IDT表项中的段选择符标识的段描述符
- 确定中断时由授权的发生源发出的
- 检查是否发生了特权级的变化, 一般指的是是否由用户态陷入了内核态, 如果由用户态陷入了内核态, 需要使用新的特权级相关的堆栈
- 若发生的是故障, 用引起异常的指令地址修改cs和eip的值, 以使得这条指令在异常处理结束后能再次被执行
- 在栈中保存eflags, cs, 和eip的 内容
- 如果异常产生一个硬件出错吗, 则将他保存在栈中
- 装载cs和eip寄存器, 其值分别是IDT表中第i项门中描述符的段选择符和偏移量字段
- 中断处理完后执行iret汇编指令
4.进程相关
进程控制块+程序段+数据段=进程实体,进程是个动态概念

从就绪到运行态要进行进程调度,Linux 内核通过 schedule 函数实现进程调度,schedule 函数负责在运?队列中选择?个进程,然后把它切换到 CPU 上执?。
所以调?schedule 函数?次就是进程调度?次 , 有 机 会 调 ? schedule 函 数 的 时 候 就 是 进 程 调 度 的 时 机 。
在中断处理后和中断返回前的时机点,内核线程调用schedule 函数实现进程调度
进程调度要进行上下文切换,进程上下文包括进程的状态,寄存器的值,pcb以及相关的程序和数据。

进程调度有三种策略:普通进程的时间片轮转,实时进程的先进先出,实时进程的时间片轮转
进程的创建是父进程调用fork系统调用实现的,进入——do_fork函数,完成了负责父进程,获取pid,调用waje_up_new_task,将子进程加入就绪队列。子进程
从ret_from_fork返回,相关的进程资源采用写时复制技术共享
5.系统调用
系统调用是特殊的中断,陷入内核态中,一般使用int $0x80和syscall
intint $0x80 CPU压栈关键寄存器,内核保存现场,系统调用完后恢复现场。iret出栈寄存器
syscall用msr寄存器查找系统调用入口
6.文件系统
linux文件控制块叫inode,里面有文件类型,文件长度,iNode号,拥有者uid,文件gid,一些时间戳和权限
系统调用open打开文件返回的是一个文件描述符,用户用这个文件描述符进行文件的读写
课程学习体会
伴随着之前学习的Linux知识的基础,把我带入Linux内核的世界。这门课不仅教会了我知识,还教会了我学习地方法。从结构入手,就像一个去除了枝枝叶叶的大树的主干,一目了然。继而分析一个个函数,调试跟踪,分析问题的时候更有针对性,更便于找到原因。
我更加的了解了计算机的工作的原理,对进程的切换、系统的调用都有很深入的理解。 最后感谢孟宁老师和李春杰老师的细心讲解