课程学习总结报告

 

 

 

  课程先建立起内核的大体框架,让我们理解各个子系统的设计理念和构建思想,这些理念让我有一个清晰的脉络,然后,老师给我们一项一项讲解、实践具体的实现方法、函数,我们就了解到这些函数,针对的是哪些设计思想,实现了什么样的功能,达成了什么样的目的,运用起来也就更加得心应手。

 

在我看来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。

中断和异常的硬件处理

  1. 确定与中断和异常相关的联的向量i
  2. 读取idtr寄存器指向的IDT表中的第i项
  3. 从gdtr寄存器中获得GDT的基地址, 并在GDT中查找, 以读取IDT表项中的段选择符标识的段描述符
  4. 确定中断时由授权的发生源发出的
  5. 检查是否发生了特权级的变化, 一般指的是是否由用户态陷入了内核态, 如果由用户态陷入了内核态, 需要使用新的特权级相关的堆栈
  6. 若发生的是故障, 用引起异常的指令地址修改cs和eip的值, 以使得这条指令在异常处理结束后能再次被执行
  7. 在栈中保存eflags, cs, 和eip的 内容
  8. 如果异常产生一个硬件出错吗, 则将他保存在栈中
  9. 装载cs和eip寄存器, 其值分别是IDT表中第i项门中描述符的段选择符和偏移量字段
  10. 中断处理完后执行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内核的世界。这门课不仅教会了我知识,还教会了我学习地方法。从结构入手,就像一个去除了枝枝叶叶的大树的主干,一目了然。继而分析一个个函数,调试跟踪,分析问题的时候更有针对性,更便于找到原因。

我更加的了解了计算机的工作的原理,对进程的切换、系统的调用都有很深入的理解。 最后感谢孟宁老师和李春杰老师的细心讲解

posted @ 2020-07-09 22:50  刘自强  阅读(238)  评论(0编辑  收藏  举报