一、课程概述
课程的主要内容为Linux源码阅读、编译调试和启动,可执行程序工作原理,进程的创建和切换,进程管理,中断和异常,linux驱动管理,linux文件系统,linux时钟和定时测量等。
下面分别对本次Linux课程进行总结
下面对各个模块分别做一些总结,其中会穿插该模块与其他模块的关系。
1、系统调用过程
系统调用陷入内核态,从用户态堆栈转换到内核态堆栈,然后把相应的CPU关键的现场栈顶寄存器、指令指针寄存器、标志寄存器等保存到内核堆栈,保存现场。系统调用入口的汇编代码还会通过系统调用号执行系统调用内核处理函数,最后恢复现场和系统调用返回将CPU关键现场栈顶寄存器、指令指针寄存器、标志寄存器等从内核堆栈中恢复到对应寄存器中,并回到用户态int $0x80或syscall指令之后的下一条指令的位置继续执行
2、进程创建过程
进程创建可以通过fork,vfork,clone三个系统调用实现,它们都是通过do_fork函数实现进程创建的,在do_fork函数中,以ret_from_fork函数为执行起点,复制父进程的内存堆栈和数据,并修改某些参数实现子进程的定义和初始化,创建子进程的工作完成后,通过sys_call exit函数退出并pop父进程的内存堆栈,实现新进程的创建工作。fork创建的新进程是和父进程(除了PID和PPID)一样的副本,包括真实和有效的UID和GID、进程组合会话ID、环境、资源限制、打开的文件以及共享内存段。根据代码的分析,do_fork中,copy_process管子进程运行的准备,wake_up_new_task将子进程加入到就绪队列等待调度执行。
3、时钟
主要用于时间片的计时,进程运行时间。和操作系统的墙上时间,即显示的年月日具体。
Linux在启动时首先会去读RTC,RTC是存储在单独的一个结构里,有单独的供电。在系统关闭的情况下,也在进行计时。Linux启动过程中会注册时钟源。根据优先级来选择具体的时钟源,优先级为(pit、tsc)。根据优先级选择具体的时钟源。选择时钟源后会定期产生时钟中断(与中断的关系)。产生时钟中断的过程中会减去当前进程时间片。若当前时间片用完则会调用切换函数。此外也会去更新墙上时间。
4、中断
中断处理流程总结:
(1) 发生中断后,CPU执行异常向量vector_irq的代码;
(2)在vector_irq里面,最终会调用中断处理C程序总入口函数asm_do_IRQ();
(3)asm_do_IRQ()根据中断号调用irq_des[NR_IRQS]数组中的对应数组项中的handle_irq();
(4)handle_irq()会使用chip的成员函数来设置硬件,例如清除中断,禁止中断,重新开启中断等;
(5)handle_irq逐个调用用户在action链表中注册的处理函数。
==> 中断体系结构的初始化,就是构造irq_desc[NR_IRQS]这个数据结构;用户注册中断就是构造action链表;用户卸载中断就是从action链表中去除对应的项。
5、
Linux总结
在Linux系统分析这门课程中,通过内核源代码和知识点结合的方式学习Linux,在实验中通过自己动手运行和调试内核,知晓了操作系统内核的结构和设计原理,一个操作系统是如何运作起来的,系统的各个功能之间是如何分工协作的,这让课程不仅仅是停留在理论阶段,学完之后加深了对操作系统的理解。