博客链接汇总 及 期末总结

1:反汇编一个简单的C程序:

    http://www.cnblogs.com/yg137565645/p/5207791.html

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

    http://www.cnblogs.com/yg137565645/p/5247528.html

3:跟踪分析Linux内核的启动过程:

    http://www.cnblogs.com/yg137565645/p/5250891.html

4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用:

    http://www.cnblogs.com/yg137565645/p/5296445.html

5:system_call中断处理过程:

    http://www.cnblogs.com/yg137565645/p/5322765.html

6:分析Linux内核创建一个新进程的过程:

    http://www.cnblogs.com/yg137565645/p/5340874.html

7:Linux内核如何装载和启动一个可执行程序:

    http://www.cnblogs.com/yg137565645/p/5362881.html

8:理解进程调度时机跟踪分析进程调度与进程切换的过程:

    http://www.cnblogs.com/yg137565645/p/5388646.html

 

----------------------------------------------------------------------------------------

期末总结

 

***计算机是如何工作的

  计算机:计算机实现很复杂的功能,计算和处理大量的数据,实际上是通过不断地重复大量既定的简单的操作

  程序:告诉计算机操作的步骤、输入的数据、如何存放处理后的结果。计算机会尽可能忠实地按照程序的顺序将每一个操作步骤的指令取出,变成机器语言,通过软硬件协同工作

  汇编语言:汇编语言是机器语言的一种翻译。现在编译器功能强大,汇编语言真正用的时候并不多,但能够看懂汇编语句,在分析程序真正执行的流程、单步调试程序的方面都有很大帮助

***操作系统是如何工作的

简单模拟内核代码
主要包括:

  函数调用堆栈

  函数堆栈框架

  内核的初始化、中断、进程上下文切换过程的简述以及基于时间片轮转的多道程序模拟

操作系统三个法宝:

  存储程序计算机

  函数调用堆栈

  中断机制
  操作系统两把宝剑:中断上下文、进程上下文的切换

  操作系统核心功能:进程调度和中断机制,通过与硬件的配合实现多任务处理,再加上上层应用软件的支持,最终变成可以使用户可以很容易操作的计算机系统
  多进程的Linux操作系统:进程必须等到正在运行的进程空闲CPU后才能运行
  进程切换:当正在运行的进程等待其他的系统资源时,Linux内核将取得CPU的控制权,并将CPU分配给其他正在等待的进程。进程切换机制中包含esp的切换、堆栈的切换

***构造一个简单的Linux系统MenuOS

start_kernel函数的最后一句是rest_init();

这个进程在内核启动时就一直存在,是0号进程,0号进程是最终的idle进程(rest_init)

这个0号进程创建了1号进程和其他的服务线程

道生一(start_kernel-->cpu_idle),一生二(kernel_init和kthreadd),二生三(即前面0、1和2三个进程),三生万物(1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先)

 

***扒开系统调用的三层皮(上)

系统调用:即便是最简单的程序,在进行输入输出等操作时也会需要调用操作系统所提供的服务,也就是系统调用。Linux下的系统调用是通过中断(int 0x80)来实现的

传递参数:在执行int 80指令时,寄存器 eax 中存放的是系统调用的功能号,而传给系统调用的参数则必须按顺序放到寄存器 ebx,ecx,edx,esi,edi 中,当系统调用完成之后,返回值可以在寄存器 eax 中获得。Linux 采用的是 C 语言的调用模式,这就意味着所有参数必须以相反的顺序进栈,即最后一个参数先入栈,而第一个参数则最后入栈。
用户态、内核态和中断处理过程
使用库函数API和C代码中嵌入汇编代码触发同一个系统调用
使用库函数API获取系统当前时间
使用C代码中嵌入汇编代码触发系统调用获取系统当前时间

***扒开应用系统的三层皮(下)

给MenuOS增加time和time-asm命令
使用gdb跟踪系统调用内核函数sys_time
系统调用在内核代码中的工作机制和初始化

系统调用就是特殊的一种中断
系统调用:

  SAVE_ALL保存现场。

  确定中断信息,将系统调用号通过eax传入,通过sys_call_table查询到调用的系统调用,然后跳转到相应的程序进行处理。

  处理中断。

  RESTORE_ALL恢复系统调用时的现场,iret返回用户态。

***进程的描述和进程的创建

进程的描述:进程描述符task_struct数据结构

从系统调用的角度理解fork():一次调用两次返回(fork系统调用在父进程和子进程各返回一次,子进程中返回的是0,父进程中返回值是子进程的pid)

Linux通过复制父进程来创建一个新进程,通过调用do_fork来实现并为每个新创建的进程动态地分配一个task_struct结构
执行起点与内核堆栈保证一致:设置子进程的ip之前:childregs = current_pt_regs();将父进程的regs参数赋值到子进程的内核堆栈,其中存放了SAVE_ALL中压入栈的参数
新进程的开始:copy_thread()中:p->thread.ip = (unsigned long) ret _from _fork;将子进程的 eip 设置为ret_from _fork的首地址,子进程从ret_from_fork开始执行的

进程的创建:

    进程的创建概览及fork一个进程的用户态代码

    理解进程创建过程复杂代码的方法

    浏览进程创建过程相关的关键代码

    创建的新进程是从哪里开始执行的?

    使用gdb跟踪创建新进程的过程
可执行程序的装载
------------------

关于程序的加载过程和ELF文件格式。主要包括得到一个可执行程序过程、ELF文件格式的结构和静态链接、可执行程序的静态加载过程和动态加载过程

execve执行的时候陷入到内核态,用execve中加载的程序把当前正在执行的程序覆盖掉,当系统调用返回的时候也就返回到新的可执行程序起点
预处理、编译、链接和目标文件的格式:

    可执行程序是怎么得来的

    目标文件的格式ELF

    静态链接的ELF可执行文件和进程的地址空间
    可执行程序、共享库和动态加载:

    装载可执行程序之前的工作

    装载时动态链接和运行时动态链接应用举例
  可执行程序的装载:

    可执行程序的装载相关关键问题分析

    sys_execve的内部处理过程

    使用gdb跟踪sys_execve内核函数的处理过程

    可执行程序的装载与庄生梦蝶的故事

    浅析动态链接的可执行程序的装载

***进程的切换和系统的一般执行过程

进程调度算法:根据分类不同,调度的设计原则也不同
进程的切换:切换地址空间、切换内核堆栈、切换内核控制流程和一些必要的寄存器保存和恢复
调度时机:内核线程可以直接调用schedule()进行进程切换(主动),也可以在中断处理过程中进行调度(被动)。用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度
内核的使用:32位x86系统下,每个进程的地址空间有4G,用户态0-3G,3G以上仅内核态可以访问。所有进程3G以上是共享的,在内核中代码段,堆栈段都是相同的,回到用户态才不同。进程进入内核就都一样,没有进程陷入内核就执行0号进程。内核可以看作各种中断处理过程和内核线程的集合

 

--------------------------------------------------------------------------------------------------------

总结:

   通过一学期的学期,我学到了跟多,从以前对linux的不了解,到现在对linux的熟练与理解,很感谢老师的耐心讲解,老师设置的实验也让我在实践中增长了许多的经验,在实验中,出现了许多问题,在与同学的讨论和查资料中,我一步步解决了这些问题,从中也收获了特别多的经验,最后, linux大法好!

posted @ 2016-05-01 13:28  Mccartney  阅读(207)  评论(0编辑  收藏  举报