课程学习总结报告(代码片段)

slm- slm-     2022-12-02     516

关键词:

课程学习总结报告

Linux之进程

  概述:进程是Linux进行资源分配和调度的基本单位,进程也被看做是程序的一次执行过程,当持久化在磁盘上的二进制代码被载入内存时,Linux操作系统为其分配了用户栈和内核栈,同时使用task_struct这种数据结构对进程进行描述,task_struct是Linux操作系统感知进程存在的数据结构,具体描述了进程号,进程状态,进程的调度策略和调度信息,进程打开文件表,进程链表,父子进程的关系等信息。Linux根据这个数据结构找到进程对应的用户栈和内核栈,并根据cs,ip,ss,sp,ebp等寄存器信息,执行这个进程。

技术图片

 

 

   进程调度:有了进程的概念,Linux就可以执行磁盘中持久化的二进制代码了。为了提高cpu利用率,提高计算机的并发性,引入了进程的调度这个概念,这相当于Linux虚拟化了多个“平行空间”,每个进程都有自己独立的用户栈和内核栈,Linux内核根据调度策略,在一定的时机对进程进行调度。进程调度时机包括:时间片用完,中断返回,进程状态发生变化,系统调用返回。

  进程的调度策略:Linux系统采用优先级调度的策略,又分成实时进程和非实时进程,实时进程指需要及时处理的进程,优先级范围是0~99。100~139是非实进程的优先级范围。实时进程的优先级高于非实时进程。同一优先级对列按FIFO或者RR(时间片轮转)进行调度。Linux进程调度采用了可运行对列机制

 技术图片

        进程调度之可运行对列工作原理:每个可运行对列有三个属性,进程数量,位图,进程对列,通过位图可以找到当前优先级最高的对列。可运行度量维护两个对列,活跃对列和过期对列。总是从活跃对列里根据调度策略选择一个进程执行,进程执行完毕后,如果当前进程是实时进程,则继续加入活跃对列中,如果是非实时进程的非批处理进程,则加入过期对列。如果活跃对列空,则将过期对列的内容负值到活跃对列中继续执行。这种机制的优点在于避免优先级低的进程出现饥饿的现象.

 Linux之系统调用

  为了屏蔽硬件操作的细节,增强系统的安全性,增强用户程序的可移植性,Linux操纵系统划分了用户态和内核态,对应的内存空间被划分成用户空间和内核空间。内核态的权限高于用户态,即内核态下,cs:ip可以指向任意位置,而用户态下,cs:ip的活动范围只能是自己的空间。为了使用户调用操作系统底层服务,如中断,时钟,异常等,需要采取一种机制,这种机制就是系统调用。

  从软件的角度看,通过int 0x80指令或者syscall指令可以触发系统调用。首先,当linux进入内核态时,先保存此时的上下文环境,如果是硬件中断触发的系统调用,保存的是中断上下文,如果是用户程序触发的系统调用,保存用户进程上下文。所谓的上下文是内核保存的,用于系统调用返回的参数信息。然后,通过系统调用号,找到对应的系统调用处理函数的首地址,建立函数堆栈,修改cs:ip的值并执行处理函数。处理函数执行完毕后,根据保存的上下文信息恢复现场返回用户态。

Linux之中断

  中断的作用:中断可分成外部中断和内部中断,外部中断用于处理外部设备的I/O请求,也叫做硬件中断;内部中断用于处理故障,陷入,错误。也叫做软件中断。它们的作用都是为了改变cpu当前正在运行的指令流去执行其他任务。中断机制能够提高I/O效率,系统调用就是一种特殊的中断。中断按是否可屏蔽分成可屏蔽中断和不可屏蔽中断,可屏蔽中断的向量可以通过对中断控制器的 编程来改变。

  中断之硬件处理过程

技术图片

         中断之异常处理:异常处理有一个标准的结构,由三部分组成 1. 在内核态堆栈中保存大多数寄存器的内容 2. 调用C语言的函数 3. 通过ret_from_exception()从异常处理程序退出 。当异常发生时,如果控制单元 没有自动地把一个硬件错误代 码插入到栈中,相应的汇编语 言片段会包含一条pushl $0指 令,在栈中垫上一个空值,如果 错误码已经被压入堆栈,则没有 这条指令。然后,把异常处理 函数的地址压进栈中;函数的名字由异常处理程序名与do_ 前缀组成。 然后调用error_code,该函数的主要功能:(1)按照pt_regs结构定义的堆栈数据格式完成相应 的入栈操作,进一步完成现场的保存。(2) 把堆栈地址中的do_handler_name()函数的地址 装入edi寄存器中,并在这个位置写入fs值,使栈 结构进一步与pt_regs结构完全一致。(3) 最后执行call *%edi指令。
        中断的一般处理流程
        在内核态堆栈保存IRQ的值和寄存器的内容

common_interrupt:
  SAVE_ALL 
  movl %esp,%eax 
  call do_IRQ jmp 
  $ret_from_intr

   do_irq工作原理:

技术图片

  内封装了一个irq_desc数组,根据中断向量号找到对应的中断服务例程,全部执行一遍,判断具体哪个设备发生了中断,就执行这个设备的中断服务程序。

系统性总结

         Linux的启动过程包括启动参数的传递,根文件系统的挂载,通过start_kernel完成了文件系统,中断,时钟,内存管理,设备管理等模块的初始化工作,保存了中断描述符表地址等信息,并初始化了0号进程。当调用一个程序时,首先使用execve系统调用对其进行加载,基本原理是读取命令行参数和环境变量,fork一个子进程,传递命令行参数和环境变量,如果是动态链接,内核返回到.intp处执行动态链接器进行动态链接。execve的结果就是加载一个可执行程序,这样一个基本的应用程序就能运行了程序中可能涉及对设备的操作,linux用设备文件来感知设备,用户像使用普通文件一样打开一个设备文件,内核感知到这是一个设备文件时,就能根据设备号,找到该设备对应驱动程序,Linux将它们封装成进程打开文件表的一项并返回fd给用户,用户就能根据fd索引到对应的驱动程序进行设备的操作了。函数是可执行程序的基本功能模块,Linux使用函数调用堆栈这种机制对函数进行第调用,基本操作就是保存当成函数的ebp,用此时esp的位置作为新函数的ebp,基于原原来的空间进行函数空间生长,待切换的函数执行完毕后,切换回原函数的堆栈继续执行。进程调度是提高cpu吞吐率的一个重要措施,也是一种多任务处理的方式,Linux采取了基于优先级的调度策略,基于可运行对列进行调度。进程的调度发送生在内核态,通过schedule进行调度,调度 的结果是完成进程的切换,进程切换的基本思路就是保存原进程的cs:ip,ebp等寄存器信息,同时加载新进程的寄存器信息,完成用户堆栈和内核堆栈的切换。

  上面是我对Linux工作机制的粗浅理解,没有面面俱到,但也有了一个宽泛认识。孟老师和李老师讲课认真负责,理论联系实践,深入浅出讲解了Linux的底层原理,对我以后做应用开发有很大的指导性作用,希望这门课越办越好。

课程学习总结报告(代码片段)

课程学习总结报告Linux之进程  概述:进程是Linux进行资源分配和调度的基本单位,进程也被看做是程序的一次执行过程,当持久化在磁盘上的二进制代码被载入内存时,Linux操作系统为其分配了用户栈和内核栈,同时使用task_s... 查看详情

课程学习总结报告(代码片段)

一、基础知识1、Liunx汇编主要寄存器:EAX、EBX、ECX、EDX、EBP、ESI、EDI、EIP、ESP(其中ESP是堆栈栈顶寄存器,EBP是堆栈基址指证针,EIP寄存器不能直接使用和修改。调用call时会修改EIP指针。EBP和ESP总指向同一个堆栈,EBP指向栈底... 查看详情

《密码安全新技术》课程总结报告(代码片段)

《密码安全新技术》课程总结报告课程学习内容总结第一次课网络(Web)安全与内容安全本次讲座的学习内容主要为两方面:1.Web应用安全SQL注入HavijPangolin1.反射型XSS2.存储型XSSApache解析漏洞Nginx解析漏洞2.隐私安全用户轨迹:移动... 查看详情

课程学习总结报告(代码片段)

@目录Linux概念模型Linux系统启动用户态和内核态进程管理和调度文件管理例子讲解例子LED灯心得体会与改进建议Linux概念模型在Linux系统分析这门课中,我们主要学习了中断,系统调用,程序加载执行,进程管理,文件系统,计时... 查看详情

课程学习总结报告(代码片段)

一、Linux系统模型  其中最重要的部分是内核,向上为系统调用和应用程序提供支持,向下对硬件资源和驱动程序进行管理。 二、传统I/O操作读写流程  1.用户进程向CPU发起read系统调用读取数据,由用户态切换为内... 查看详情

课程学习总结报告(代码片段)

Linux内核主要由以下几个功能:进程管理、文件系统、IO体系结构和设备驱动程序、内存管理等。一.进程管理在Linux中,进程是系统资源分配的基本单位,也是使用CPU运行的基本调度单位。它实现了对进程的控制和调度。进程管... 查看详情

课程学习总结报告(代码片段)

目录一、linux系统概念模型1.概述2.函数调用函数调用过程概述函数调用中的硬件操作函数调用中的软件操作3.中断和异常中断和异常的区别与联系:中断上下文中断和异常的硬件级处理中断和异常的软件级处理4.系统调用5.进程管... 查看详情

课程学习总结报告(代码片段)

从存储程序计算机到冯诺依曼体系结构存储程序计算机的主要思想是将程序存放在计算机存储器中,然后按存储器中的存储程序的首地址执行程序的第一条指令,以后就按照该程序中编写好的指令执行,直至程序执行结束。冯诺... 查看详情

第九周课程总结&实验报告(代码片段)

第九周课程总结&实验报告(七)实验任务详情:要求:(1)总票数1000张;(2)10个窗口同时开始卖票;(3)卖票过程延时1秒钟;(4)不能出现一票多卖或卖出负数号票的情况。实验代码:packageproject7;classMyThreadimplementsRunna... 查看详情

第九周课程总结&实验报告(代码片段)

实验内容:源代码:主类:packageexercise;publicclassTrainStationTicketSalesimplementsRunnableprivateintticket=1000;publicvoidrun()for(inti=0;i<1000;i++)this.sale();ticket--;publicsynchronizedvoidsale()if(ticket>=0)tryThread.sleep(100);catch(InterruptedExceptione)e.printStackTrace();... 查看详情

第九周课程总结&实验报告(代码片段)

课程总结1、继承Thread类创建线程:Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法... 查看详情

第八周课程总结&实验报告(代码片段)

实验报告六编写一个类,在其main()方法中创建一个一维数组,在try字句中访问数组元素,使其产生ArrayIndexOutOfBoundsException异常。在catch子句里捕获此异常对象,并且打印“数组越界”信息,加一个finally子句,打印一条信息以证明... 查看详情

第八周课程总结&实验报告(代码片段)

第八周课程总结&实验报告(六)一、实验目的(1)理解异常的基本概念;(2)掌握异常处理方法及熟悉常见异常的捕获方法。二、实验要求(1)练习捕获异常、声明异常、抛出异常的方法、熟悉try和catch子句的使用(2)掌... 查看详情

第七周课程总结及实验报告(代码片段)

(一)设计一个类层次,定义一个抽象类--形状,其中包括有求形状的面积的抽象方法。继承该抽象类定义三角型、矩形、圆。分别创建一个三角形、矩形、圆存对象,将各类图形的面积输出。注:三角形面积s=sqrt(p(p-a)(p-b)*(p-c))其... 查看详情

第七周课程总结&实验报告(代码片段)

第七周课程总结&实验报告(五)实验四类的继承实验目的理解抽象类与接口的使用;了解包的作用,掌握包的设计方法。实验要求掌握使用抽象类的方法。掌握使用系统接口的技术和创建自定义接口的方法。了解Java系统包的... 查看详情

第八周课程总结&实验报告(代码片段)

第八周课程总结&实验报告(六)实验六 Java异常实验目的理解异常的基本概念;掌握异常处理方法及熟悉常见异常的捕获方法。实验要求练习捕获异常、声明异常、抛出异常的方法、熟悉try和catch子句的使用。掌握自定义... 查看详情

第七周课程总结&实验报告(代码片段)

第七周课程总结一、接口的实际应用接口在实际中更多的作用是用来制定标准的。抽象类和接口的的关系No.区别点抽象类接口1定义包含一个抽象方法的类抽象方法和全局常量的集合2组成构造方法、抽象方法、普通方法、常量、... 查看详情

第七周课程总结及实验报告(代码片段)

实验报告(一)抽象类的使用1.设计一个类层次,定义一个抽象类--形状,其中包括有求形状的面积的抽象方法。继承该抽象类定义三角型、矩形、圆。分别创建一个三角形、矩形、圆存对象,将各类图形的面积输出。注:三角... 查看详情