linux模式切换,进程切换
内核态和用户态的切换:
用户态到内核态的转换:1、进行系统调用,2、异步中断,3、外部硬件中断
检查特权级别的变化:当异常发生在用户态,而异常处理函数则必须运行在内核态,则此时必须调用内核态的堆栈(系统调用必然是发生特权级的变化),步骤是,将进程的TSS段中的esp0和ss0赋值给esp,ss寄存器
于是乎,当进程由用户态进入内核态时,必发生中断,因为内核态的CPL优先级高,所以要进行栈的切换。那么就会读tr寄存器以访问该进程(现在还是用户态)的TSS段。随后用TSS中内核态堆栈段ss0和栈指针esp0装载SS和esp寄存器,这样就实现了用户栈到内核栈的切换了。同时,内核用一组mov指令保存所有寄存器到内核态堆栈上,这也包括用户态中ss和esp这对寄存器的内容。

最后将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,开始执行中断处理程序,这时就转到了内核态的程序执行了。
进程切换:
这里再次强调一下,每个进程都有一个thread_struct结构的字段thread,用于保留进程的一部分硬件上下文:
这里再次强调一下,每个进程都有一个thread_struct结构的字段thread,用于保留进程的一部分硬件上下文:
struct thread_struct {
struct desc_struct tls_array[GDT_ENTRY_TLS_ENTRIES];
unsigned long esp0;
unsigned long sysenter_cs;
unsigned long eip;
unsigned long esp;
unsigned long fs;
unsigned long gs;
unsigned long debugreg[];
unsigned long cr2, trap_no, error_code;
union i387_union i387;
struct vm86_struct __user * vm86_info;
unsigned long screen_bitmap;
unsigned long v86flags, v86mask, saved_esp0;
unsigned int saved_fs, saved_gs;
unsigned long *io_bitmap_ptr;
unsigned long io_bitmap_max;
};
待会我们就将看到,其实里边最有用的就是eip和esp两个字段,分别表示保存的指令和堆栈栈顶的偏移地址。但这里不包括ss寄存器的值,因为所有的切换都在内核态,那么只用为内核态的堆栈基址ss0保存一次就行了,你们这些进程切来切去,我都不便应万变,把它保存在每个CPU所对应的那个TSS段中。这里也得出了一个很重要的结论,为了提高效率,所有内核态的进程堆栈段基地址都是相同的。
thread字段存放的都是内核栈的esp和eip,然后_switch_to()宏,此时已经进入要切换进来进程的内核栈中,把已经切换进来的进程的thread.esp0装入本地cpu的esp0字段
切换前:被切换进程的内核栈,压入ebp,eflag,然后把被切换进程内核栈的esp赋值给本进程的thread.esp。
切换进来的进程,把本进程的thread.ESP赋值给esp,此时便切换到本进程中,但是局部变量没有完成切换,(向prev->thread.eip存入标记为1的地址。当被替换的进程重新恢复执行时,进程执行我们下面标记为1的那条指令:)这里的prev变量依旧属于被切换的进程。
5. 宏把next->thread.eip的值(绝大多数情况下是上面所述标记为1的地址)压入next的内核栈:
pushl next->thread.eip
注意体会,当next执行完了以后的函数后,会回到这个栈的位置,执行eip对应的那条指令。
6. 跳到__switch_to()函数:
jmp __switch_to
7. 如干程序执行后,当A将再次获得CPU时,它执行一些保存eflags和ebp寄存器内容内容的指令,这两条指令的第一条指令被标记为1:
1:
popl %ebp
popfl

linux模式切换,进程切换的更多相关文章
- Linux学习笔记(16)Linux前后台进程切换(fg/bg/jobs/ctrl+z)
关键词:Linux前后台进程切换,linux进程切换 fg.bg.jobs.&.ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的一.& ...
- linux内核——进程切换宏switch_to
该宏有三个参数:prev, next, last.它们都是局部变量. prev:输入参数,变量值为旧进程描述符的地址. next:输入参数,变量值为新进程描述符的地址. last:输出参数,用来记录该 ...
- Linux前后台进程切换
(1).Linux前台进程与后台进程的区别 前台进程:是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随之消失. 后台进程:也叫守护进程(Daemon),是运行在后台的 ...
- 关于Linux前后台进程切换
前言: 当使用SSH远程登录服务器时,对于运行时间较长的程序(如Caffe的训练可能需要十几个小时), SSH可能会在很长时间后断掉,导致程序没运行完就中断了. 为了解决这个问题,需要将在服务器运行的 ...
- Linux进程切换代码分析
朱宇轲 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这次我们来分析L ...
- linux进程解析--进程切换
为了控制进程的执行,linux内核必须有能力挂起正在cpu上运行的进程,换入想要切换的进程,也就是恢复以前某个挂起的进程,这就是linux的进程切换. 1进程切换的时机 一般来说,进程切换都是发生在 ...
- Linux内核分析——理解进程调度时机跟踪分析进程调度与进程切换的过程
20135125陈智威 +原创作品转载请注明出处 +<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验 ...
- Linux内核分析之理解进程调度时机跟踪分析进程调度与进程切换的过程
一.原理分析 1.调度时机 背景不同类型的进程有不同的调度需求第一种分类I/O-bond:频繁的进行I/O:通常会花费很多时间等待I/O操作的完成CPU-bound:计算密集型:需要大量的CPU时间进 ...
- linux内核学习之四:进程切换简述
在讲述专业知识前,先讲讲我学习linux内核使用的入门书籍:<深入理解linux内核>第三版(英文原版叫<Understanding the Linux Kernel>),不过 ...
随机推荐
- X509 文件扩展名
编码 (也用于扩展名) .DER = 扩展名DER用于二进制DER编码的证书.这些证书也可以用CER或者CRT作为扩展名.比较合适的说法是“我有一个DER编码的证书”,而不是“我有一个DER证书”. ...
- DDD学习笔录——简介DDD的战术模式、问题空间和解空间
DDD的战术模式 DDD的战术模式(也称为模型构造块)是一个帮助创建 用于复杂有界上下文的有效模型的 模式集合. 也就是我们常说的设计模式. 问题空间 问题空间将问题域提炼成更多可管理的子域,是真对于 ...
- struts1.2里的ActionMessages的使用
转自:https://blog.csdn.net/oswin_jiang/article/details/4582187
- windows python-mysql 安装
https://www.cnblogs.com/gbx-bo/p/5993190.html
- adb pull 和 adb push
1. 操作单个文件 通过adb push,则可将文件添加到SD卡中.如果想在push的时候修改文件名称的话,只需要修改push的第二个参数改成完整路径(目录+文件名),如/sdcard/test-0. ...
- springmvc 初始化参数绑定(使用属性编辑器) 来处理类型转换问题
处理一种日期格式 处理器中的写法: index.jsp中的写法: 处理多种日期格式: 处理器的写法: 自定义的属性编辑器: index.jsp的写法:
- [Elasticsearch2.x] 多字段搜索 (三) - multi_match查询和多数字段 <译>
multi_match查询 multi_match查询提供了一个简便的方法用来对多个字段执行相同的查询. NOTE 存在几种类型的multi_match查询,其中的3种正好和在“了解你的数据”一节中提 ...
- SpringBoot05 数据操作01 -> JPA的基本使用、基本使用02
前提: 创建一个springboot项目 创建一个名为springboottest的MySQL数据库 1 jar包准备 jpa的jar包 mysql驱动的jar包 druid数据库连接池的jar包 l ...
- GUI编程01
1 tkinter TkInter是标准的Python GUI库.的Python与Tkinter的结合提供了一个快速和容易的方法来创建GUI应用程序. Tkinter的提供了一个强大的面向对象的接口T ...
- oracle获取列的备注和数据类型
select column_name, data_type, data_precision, data_scale, nvl((select t_s.comments from all_col_com ...