Linux操作系统分析课程总结报告

一.Linux的一般执行过程

中断的执行过程

当中断产生时,引脚线电位为高电平,产生一个唯一的中断信号。


1)    通过这个中断信号确定与中断相关的中断向量i
2)    读中断向量寄存器idtr得到中断向量表的基地址,找到其中第i项,找到中断处理程序所在段的段选择符和段内偏移
3)    读gdtr寄存器获取全局描述符表基地址,在全局描述符表中根据上面获得的段选择符获取段描述符,段描述符中指出了中断处理程序的所在段(至此才获得中断处理程序的地址)
4)    比较优先级,只允许高优先级的程序中断低优先级的程序
5)    检查是否由用户态陷入内核态,如果发生了状态的转换,就要更新堆栈,装在新堆栈的ss和esp寄存器,分别为新的栈段和栈指针(完成堆栈切换)
6)    在内核栈中保存旧的ss和esp,CPU上下文,cs和eip,eflags等(保存堆栈和CPU上下文),保存硬件出错码。
7)    用上面获取到的中断处理程序的段描述符和段内偏移装载cs和eip,准备运行中断处理程序
8)    中断处理结束后按相反的顺序恢复现场,返回到被中断程序继续执行

进程创建过程

通过硬编码的方式初始化系统中的第一个进程init_task,也就是0号进程,再通过do_fork()系统调用复制0号进程创建1号进程init进程,他是所有用户进程的祖先,和2号进程kthreadd进程,他是所有内核进程的祖先。一个进程调用fork()函数创建出一个子进程,fork()函数调用do_fork()系统调用,do_fork()调用_do_fork()函数,_do_fork()函数先调用copy_process()函数,copy_process()函数首先调用dup_task_struct函数复制父进程的task_struck进程描述符,再对pid,堆栈等关键特性信息进行修改,之后调用wake_up_new_task()函数将创建的子进程放入就绪队列等待CPU,之后父进程的do_fork系统调用返回。
其中子进程是从ret_from_fork()函数开始执行。

进程切换过程

当A进程运行到一半触发系统调用或被中断时,进行中断上下文的切换,之后执行ISR中断服务例程,在中断处理结束后,返回前,是进程调度的时机,使用_schedule()函数进行进程切换,进程切换的本质是上下文的切换。

_schedule()函数首先从CPU任务队列中取出当前进程的标识符记为prev进程。然后通过进程调度算法确定下一个要被换上的进程,记为next进程。之后,检查next如果和prev进程不一样,调用context_switch()函数进行上下文切换,next进程进入CPU运行。

在context_switch()中调用switch_to()进行寄存器和堆栈的切换,switch_to()会调用_switch_to_asm()函数,在_switch_to_asm()的中进行了从prev内核堆栈到next内核堆栈的切换,在最后不使用ret指令,而是通过jmp指令跳转到_switch_to()函数,在_switch_to()函数的结尾调用return返回,因为在_switch_to_asm()中进行了堆栈的切换,因此_switch_to()返回后,回到的是next进程的内核堆栈,而不是prev进程的内核堆栈

系统调用执行过程

系统调用本质也是中断,与中断执行过程相似。

二. 课程收获

当初选这门课程是希望通过这门课程能精通Linux操作系统系统,但是linux 的庞大超出了我的想象,我尽我可能去学习本门课程,从未逃课每节课认真听讲,学到了一部分Linux内核皮毛,其中给我留下最深的内容是孟宁老师讲的,C程序转换成汇编程序之后执行过程中堆栈的变化,linux中的进程的创建,linux进程的切换,linux中断的执行,明白了什么是容器技术,对虚拟机的原理也更清楚了一些。在李春杰老师讲述的内容中,涉及大量的内核源码,也算是见识到了linux的庞大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值