期中总结

                                                        期中总结

一、MOOC学习笔记链接:

第一周:计算机是如何工作的? http://www.cnblogs.com/hzy20/p/5222640.html

第二周:操作系统是如何工作的? http://www.cnblogs.com/hzy20/p/5248061.html

第三周:构造一个简单的Linux系统OS http://www.cnblogs.com/hzy20/p/5270121.html

第四周:扒开系统调用的三层皮(上) http://www.cnblogs.com/hzy20/p/5293348.html

第五周:扒开系统调用的三层皮(中) http://www.cnblogs.com/hzy20/p/5325751.html

第六周:扒开系统调用的三层皮(下) http://www.cnblogs.com/hzy20/p/5348340.html

第七周:可执行程序的装载  http://www.cnblogs.com/hzy20/p/5369986.html

第八周:进程的切换和系统的一般执行过程  http://www.cnblogs.com/hzy20/p/5402239.html

 

二、学习总结:

1.计算机是如何工作的:

   计算机的执行指令都是机器语言,通过汇编语言和高级语言编出来的程序通过计算机内的编译程序,将程序编译成计算机

可执行的文件来进行工作,交换数据。

    计算机在实际工作工程中要涉及大量的跳转指针操作。计算机通常是顺序执行一条一条的指令,如果有必要就通过寄存器

跳转到特定的地址,再执行,然后通过一系列机制返回原有的地址,继续顺序执行。计算机里,内存保存指令和数据,CPU

负责解释和执行这些指令。

 

2.操作系统是如何工作的:

  操作系统有“两把剑”,为中断上下文和进程上下文的切换,有了这两把剑,操作系统便能够有序地管理进程。

  多道程序中断发生时,cpu把当前的进程中断,,然后指向中断处理程序的入口。操作系统会判断何时进行进程切换、什么

条件下进行切换。因为是时间片轮转,所以需要设置时间片的大小,时间片用完时设置一下调度标志。例如循环1000万次才

有一次机会判断一下是否需要调度,如果是的话就进行切换。

 

3.构造一个简单的Linux系统OS:

对Linux系统启动过程的理解:有一个全局变量init_task,即手工创建的PCB,0号进程,即最终的idle进程。Kernelthread

是0号进程,它创建了1号进程kernelinit,以及它的一些服务的内核线程,这样整个系统启动起来了。

 

4.扒开系统调用的三层皮

(1)系统调用的三层皮:

① xyz,sysytem_call和sysytem_xyz中断向量0x80与system_call绑定起来

②系统调用号将xyz与sys_xyz关联起来了(使用eax)

(2)系统调用的工作机制

   诸多系统调用可以看作按照序号排好顺序的黑箱,知道了一个系统调用的号,按照其API或者汇编格式的调用方法,就可以使用

这个黑箱的功能,完成一定的任务。而黑箱的内容正是系统给我们提供的服务,帮我们从硬件操作中抽离出来,提高系统的安全性。

(3)对系统调用处理过程的理解:

    系统调用是操作系统提供给软件开发人员的惟一接口,开发人员可利用它使用系统功能。系统调用对用户屏蔽操作系统的具体

动作而只提供有关的功能。

    为了实现系统调用,还必须为实现各种系统调用功能的子程序编造入口地址表,每个入口地址都与相应的系统子程序名对应起来。

然后,由陷阱处理程序把陷阱指令中所包含的功能号与该入口地址表中的有关项对应起来,从而有系统调用功能号驱动有关系统子程

序执行。

    由于在系统调用处理结束后,用户程序还需利用系统调用的返回结果继续执行,因此,在进入系统调用处理之前,陷阱处理机构还

需保存处理机现场。再者,在系统调用处理结束之后,陷阱处理机构还要恢复处理机现场。在操作系统中,处理机的现场一般被保护

在特定的内存区或寄存器中。

(4)进程的创建:

通过调用do_fork来实现进程的创建;
复制父进程PCB--task_struct来创建一个新进程,要给新进程分配一个新的内核堆栈;
③修改复制过来的进程数据,比如pid、进程链表等等执行copy_process和copy_thread
创建成功。
 
5.可执行程序的装载
Linux内核装载和启动一个可执行程序:

① 创建新进程

②新进程调用execve()系统调用执行指定的ELF文件

③调用内核的入口函数sys_execve(),sys_execve()服务例程修改当前进程的执行上下文;

当ELF被load_elf_binary()装载完成后,函数返回至do_execve()在返回至sys_execve()。

ELF可执行文件的入口点取决于程序的链接方式。

   多进程、多用户、虚拟存储的操作系统出现以后,可执行文件的装载过程变得非常复杂。引入了进程的虚拟地址空间;

然后根据操作系统如何为程序的代码、数据、堆、栈在进程地址空间中分配,它们是如何分布的;最后以页映射的方式

将程序映射进程虚拟地址空间。

 

6. 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

 

三、学习体会

  我们对于这门课程的学习主要分三个阵线:网易云上的MOOC课程的学习、课本的自学、课堂老师的讲授。

  第一,通过网课老师形象生动的讲述和描述一些专业词汇,从理论知识入手,间或辅以实验,是我更形象的理解了讲授的内容。

从打开电脑进程初始化到启动进程到进程切换,完整的梳理了我们平时使用计算机中各个应用程序之间如何协同操作,让我更加

了解计算机的工作原理。

  第二,在阅读《Linux内核设计与实现》这本书的过程中,我还做了笔记,使我理解了好多具体的内容,丰富了知识的存取。

  第三,课堂上老师会及时对网课进行总结梳理、答疑解惑,不懂得地方着重讲解,更加强化。

  经过Linux内核分析这门课程一直以来的的学习,发现好多以前一知半解的东西渐渐能够理解,虽然还是在摸索,但是至少在

学习的道路上再次向前一步。

 

 

郝智宇  无转载   《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

posted on 2016-04-24 21:15  hzy_dky  阅读(116)  评论(0编辑  收藏  举报