上下文切换分为两种情况

  1. 用户程序陷入到内核,再从内核返回
  2. 两个应用程序之间的上下文切换

用户程序陷入到内核

用户程序陷入到内核通过中断INT指令,在xv6中系统调用的号为64

操作系统在初始化的时候会建立IDT表以及GDT表

通过INT找到IDT中的项,通过IDT中的项找到GDT中的项,最后定位到代码。

在执行陷入指令的时候首先会到trapasm.S中的alltraps中,将trapframe存入到应用程序的内核栈中。将esp的地址存入栈中作为trap函数的输入,然后调用trap。注意trapframe中有的字段会自动存入,比如int指令会通过CPU存入ss,esp,eflags,cs,eip,errorcode,trapno。系统调用号存在寄存器eax中。应用程序在初始化的时候操作系统会为每个应用程序保留一个内核栈,其中TSS断记录内核栈的一些信息比如内核栈的入口地址esp0。

系统调用将返回值存入到寄存器eax中。返回的时候通过trapret将原来的状态返回。最后一条指令iret回到用户程序。

两个应用程序之间的上下文切换

两个应用程序不能直接进行上下文切换,必须通过内核进行上下文切换。上下文切换通过proc中的数据结构context进行的。上下文切换的过程首先从 shell用户栈->shell程序的内核栈->scheduler的内核栈->cat的内核栈->cat的用户程序。记住第一运行的程序为shell

由于shell没有返回值,因此程序会卡在红色线的地方。注意在shell中调用fork会释放ptable.lock锁

CPU在每一个时钟中断的时候会调用

yield中会调用

注意此时锁已经释放了,

让出当前进程的CPU资源。将上下文切换到scheduler的上下文,由于上下文切换了因此下一条指令跳转到了scheduler的swtch下一条指令(还记得上面提到的卡在scheduler中的swtch,因此已经将swtch的返回eip地址压入栈中)。然后通过for循环找要runable的进程进行切换cpu->scheduler到要切换的进程上下文切换,到此就可以运行要执行的进程了。

应用程序第一次创建的时候,在返回值设置为trapret。context指向forkret因此在scheduler第一次swtch到forkret函数,在forkret函数中调用执行结束后执行trapret进行从内核栈返回到用户栈。

XV6上下文切换的更多相关文章

  1. XV6操作系统代码阅读心得(二):进程

    1. 进程的基本概念 从抽象的意义来说,进程是指一个正在运行的程序的实例,而线程是一个CPU指令执行流的最小单位.进程是操作系统资源分配的最小单位,线程是操作系统中调度的最小单位.从实现的角度上讲,X ...

  2. XV6调度

    调度 任何操作系统都可能碰到进程数多于处理器数的情况,这样就需要考虑如何分享处理器资源.理想的做法是让分享机制对进程透明.通常我们对进程造成一个自己独占处理器的假象,然后让操作系统的多路复用机制(mu ...

  3. XV6第一个进程

    第一个进程 本章通过第一个进程的创建来解释 xv6 是如何开始运行的,让我们得以一窥 xv6 提供的各个抽象是如何实现和交互的.xv6 尽量复用了普通操作的代码来建立第一个进程,避免单独为其撰写代码. ...

  4. XV6源代码阅读-同步机制

    Exercise1 源代码阅读 锁部分:spinlock.h/spinlock.c以及相关其他文件代码 // Mutual exclusion lock. struct spinlock { uint ...

  5. XV6源代码阅读-进程线程

    Exercise1 源代码阅读 1.基本头文件:types.h param.h memlayout.h defs.h x86.h asm.h mmu.h elf.h types.h:仅仅是定义uint ...

  6. XV6学习(16)Lab net: Network stack

    最后一个实验了,代码在Github上. 这一个实验其实挺简单的,就是要实现网卡的e1000_transmit和e1000_recv函数.不过看以前的实验好像还要实现上层socket相关的代码,今年就只 ...

  7. xv6学习笔记(4) : 进程调度

    xv6学习笔记(4) : 进程 xv6所有程序都是单进程.单线程程序.要明白这个概念才好继续往下看 1. XV6中进程相关的数据结构 在XV6中,与进程有关的数据结构如下 // Per-process ...

  8. xv6的作业翻译——作业1 - shell和系统调用

    Xv6的lecture LEC 1 Operating systems   L1: O/S overview L1:O/S概述   * 6.828 goals 6.828的目标   Understan ...

  9. xv6课本翻译之——第0章 操作系统接口

    Chapter 0 第0章 Operating system interfaces 操作系统接口 The job of an operating system is to share a comput ...

随机推荐

  1. 题解报告:poj 2631 Roads in the North(最长链)

    Description Building and maintaining roads among communities in the far North is an expensive busine ...

  2. Contextual Action bar(2) 简介,启动,各函数介绍

    一.Context Action Bar简介 它是一个ActionBar,有各种操作项,但它不是始终显示的ActionBar,它需要上下文才显示.样式如下: 二.Context Action Bar的 ...

  3. 1051 - Good or Bad DFS 记忆化搜索

    http://lightoj.com/volume_showproblem.php?problem=1051 对于每个位置,设dfs(cur, one, two)表示前i个字母,拥有辅音字母one个, ...

  4. RHEL 6.5----haproxy实现负载均衡

    主机名 IP master 192.168.30.130 node-1 192.168.30.131 node-2 192.168.30.132 在master上安装 [root@master ~]# ...

  5. RHEL 6.5----rsync+inotify数据同步服务

    Rsync特性: 可以镜像保存整个目录树和文件系统: 可以保持原文件的权限.时间.软硬链接等: 安装简单. 传输特点: 速度快:rsync首次同步会复制同步全部内容,以后只传输修改过的文件: 压缩传输 ...

  6. salt-stack系列报错

    master启动报错 实验环境为: [root@master salt]# cat /proc/version Linux version 3.10.0-327.el7.x86_64 (mockbui ...

  7. php数组与字符串转换

    1.将字符串转换成数组的几个函数: (1)explode(separate,string) 示例:$str = "Hello world It's a beautiful day" ...

  8. 华容道 noip2013 70分搜索

    题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 ...

  9. lock和synchronized的同步区别与选择

    1. lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现:(具体实现上的区别在<Java虚拟机>中有讲解底层的CAS不同,以前有 ...

  10. JavaScript——数组的indexOf()方法在IE8中的兼容性问题

    昨天在工作中遇到一个问题:数组的indexOf()方法在IE8中无效. 如以下代码在IE8中报错“对象不支持“indexOf”属性或方法”: var arr = [1,2,3]; var index ...