zoukankan      html  css  js  c++  java
  • linux及安全第八周总结——20135227黄晓妍

    实验部分

    实验环境搭建

    -rm menu -rf
    git clone https://github.com/megnning/menu.git
    cd menu
    make rootfs
    qemu -kernel ../linux-3.18.6/arch/x86/boot/bzImage -initrd ../rootfs.img -s -S
    gdb
    file ../linux-3.18.6/vmlinux
    target remote:1234
    ![](http://images2015.cnblogs.com/blog/744818/201604/744818-20160417144449910-660272918.png)
    

    设置断点

    我设置的断点依次为:schedule,pick_next_task,context_switch,switch_to。不过这里跟踪不到switch_to。我们先来分析前面四个。

    运行到schedule.

    schedule的作用非常,它是进程调度的主体函数。pick_next_task是它里面重要的选择下一个进程的函数,context_switch是它里面实现进程的切换的函数。switch_to是保存进程上下文的函数。全部都在schedule内部。

    运行到pick_next_task.这个方法的是先调度调度策略函数,选择一种调度策略以后,调度函数来选择下一个运行的进程

    运行到context_switch.它是实现进程切换的函数。

    在context_switch里跟踪到switch_to.

    由于switch_to内部是汇编代码,我们无法继续跟踪,我们找来swtich_to的代码来分析:

    从swtich_to理解进程上下文切换和中断上下文切换:
    中断上下文切换是从用户态陷入内核,保存的是用户态进程的堆栈和状态,以及内核的堆栈和状态,在内核执行完毕以后,弹栈用户态进程的eip,flag等等,返回到用户态进程,继续执行。
    进程上下文切换都发生在内核态,当一个进程时间片使用完,或者有优先级更高的(实时或者普通)进程进入进程就绪队列中,发生抢占时,先调用schedule,由pick_next_task选择下一个进程,swtich_to需要将当下的进程的堆栈和状态压栈保存,然后弹栈下一个进程的堆栈和状态,运行下一个进程。

    总结部分

    进程切换的关键代码switch_to分析

    进程调度与进程调度的时机分析

    进程调度算法多样化的原因
    不同类型的进程有不同的调度需求,所以需要多种调度算法来满足其需求。

    进程分类:

    1. 第一类
    • I/O密集型(频繁进行I/O,要花费大量的时间等待I/O操作的完成)
    • CPU密集型(计算密集型,需要大量的CPU时间进行运算,会导致其他交互进程反应迟钝)
    1. 第二类
    • 批处理进程
    • 实时处理进程
    • 交互式进程

    进程调度策略

    是一组规则,决定什么时候以怎样的方式选择一个新的进程运行

    linux的进程调度

    • 根据优先级排队(优先级的值是调度算法判断的标准,优先级是根据特定的算法计算出的)
    • 优先级是动态的(调度程序会根据进程的行为周期调整进程的优先级,例如,长时间等待,优先级上升;长时间在CPU运行,优先级下降)

    可以设置优先级的系统调用

    进程调度的时机的所有可能

    • 用户态进程只能先被中断,才有进程调度的时机(所以用户态进程只能被动调度)
    • 内核线程可以直接调用schedule()(但是它可能被时钟;中断I/O中断,它可能主动调度,也可能被动调度)

    进程上下文切换相关代码分析

    进程切换

    • 目的:为了控制进程的执行,内核必须由能力挂起正在CPU上执行的进程,并恢复以前挂起的某个进程

    • 与中断的区别:挂起正在执行的进程,要保存的现场和中断不一样。中断前后是在同一个进程上下文中,只是由用户态转向内核态执行;然而进程上下文切换,它是在两个进程之间切换,需要保存以下现场:

      1. 用户地址空间:包括程序代码,数据,用户堆栈
      2. 控制信息:进程描述符,内核堆栈
      3. 硬件上下文(中断虽然也要保存,但是方法不同,进程切换使用switch_to机制)
    • schedule()函数

      • schedule_sched中重要的代码

      • connect_switch如何实现进程的切换

      • switch_to如何实现保存堆栈和内核状态,需要重点理解它的汇编代码

    linux系统的一般执行过程

    linux系统的一般执行分析和特殊情况的分析

    linux系统正在运行,此时正在运行用户态进程X,根据进程调度策略,要将X进程切换成Y进程,那这个切换的过程是怎样的呢?

    • 一般情况
      中断和中断返回。有中断上下文的切换;
      在进程调度中,还有进程上下文的切换
    • 特殊情况
      1. 至少有一方处于内核态
      2. 内核线程主动调度schedule
      3. 创建子进程
      4. 加载新的可执行程序

    内核与舞女

    0~3g用户态可以访问
    0~4g内核态都可以访问
    意思是,其实3g以上的空间,内核态进程都是共享的,用户态进程陷入内核之后,每个进程的数据段,代码段的地址空间都是完全相同的,只有在返回用户态以后才会有所区别。可以将内核比喻成taxi gril。哪一个进程请求,都可以进入内核态,之后又返回自己的用户态;当内核态没有进程的时候,就运行0号进程,自己空转。

    linux系统构架和执行过程概览

    linux操作系统构架概览

    • 什么是操作系统以及操作系统存在的意义是什么

    • linux操作系统结构

    ls——最简单也最复杂的操作

    1. 在控制台输入ls命令
      • 为什么我们敲击键盘就会在终端上显示?涉及I/O中断,系统内部将当前进程中断,然后还要再控制台输出。这又涉及终端控制台设备驱动的概念。
    2. shell程序分析输入的参数,确定这是ls命令
      • 什么是shell?终端解释程序。
    3. shell调用fork来生成shell本身的拷贝
      • 中断解释程序会做什么呢?它会调用系统调用fork生成一个shell本身的拷贝
      • 什么是系统调用?内存保护,内核态用户态相关,本质上是一个中断,int0x80陷入内核。还涉及创建子进程。
      • 系统调用如何实现?中断,陷入内核。
    4. 调用exec系统调用将ls的可执行文件装入内存
      • 设计内存管理模块,进程的地址空间,分页机制,文件系统,可执行文件格式ELF
    5. 从系统调用返回
      • 装载的可执行程序
      • 如何做到正确的返回?修改了原来的exec的系统调用,压入内核栈的ip和sp使他返回的时候能够正确地执行ls程序
    6. shell和ls都得以执行

    从CPU的角度看linux系统的执行

    从内存的角度看Linux系统的执行

  • 相关阅读:
    面向对象程序设计简介(1/2)
    iOS官方Sample大全
    AFN不支持 "text/html" 的数据的问题:unacceptable content-type: text/html
    谈ObjC对象的两段构造模式
    关于self和super在oc中的疑惑与分析 (self= [super init])
    在Xcode中使用Git进行源码版本控制
    NSObject之二
    NSObject之一
    Objective-C Runtime 运行时之六:拾遗
    Objective-C Runtime 运行时之五:协议与分类
  • 原文地址:https://www.cnblogs.com/angelahxy/p/5389036.html
Copyright © 2011-2022 走看看