Linux0.11进程切换和TSS结构】的更多相关文章

TSS 全称为task state segment,是指在操作系统进程管理的过程中,进程切换时的任务现场信息.       X86体系从硬件上支持任务间的切换.为此目的,它增设了一个新段:任务状态段(TSS),它和数据段.代码段一样也是一种段,记录了任务的状态信息.       与其它段一样,TSS也有描述它的结构:TSS描述符表,它记录了一个TSS的信息,同时还有一个TR寄存器,它指向当前任务的TSS.任务切换的时候,CPU会将原寄存器的内容写出到相应的TSS,同时将新TSS的内容填到寄存器中…
想知道内核什么时候给进程重新分配时间片,最好的办法就是阅读源代码(其中已经打了注释) /****************************************************************************/ /* 功能:进程调度. */ /* 先对alarm和信号进行处理,如果某个进程处于可中断睡眠状态,并且收 */ /* 到信号,则把进程状态改成可运行.之后在处可运行状态的进程中挑选一个 */ /* 并用switch_to()切换到那个进程 */ /* 参数…
这是学习哈工大李治军在mooc课操作系统时做的实验记录.原实验报告在实验楼上.现转移到这里.备以后整理之用. 完整的实验代码见:实验楼代码 一.tss方式的进程切换 Linux0.11中默认使用的是硬件支持的tss切换,系统为每个进程分配一个tss结构用来存储进程的运行信息(上下文环境),然后通过CPU的一个长跳转指令ljmp来实现进程的切换,这种方式易于实现,但一者不便于管理多CPU进程,二者效率不佳,故此次实验要将系统中使用的tss切换方式修改为栈切换方式.而由于CPU管理方式的原因,tr寄…
原有的基于TSS的任务切换的不足 进程切换的六段论 1 中断进入内核 2 找到当前进程的PCB和新进程的PCB 3 完成PCB的切换 4 根据PCB完成内核栈的切换 5 切换运行资源LDT 6 利用IRET指令完成用户栈的切换 1. 原有的基于TSS的任务切换的不足 原有的Linux 0.11采用基于TSS和一条指令,虽然简单,但这指令的执行时间却很长,在实现任务切换时大概需要200多个时钟周期.而通过堆栈实现任务切换可能要快,而且采用堆栈的切换还可以使用指令流水的并行化优化技术,同时又使得CP…
以fork()函数为例,分析内核态进程切换的实现 首先在用户态的某个进程中执行了fork()函数 fork引发中断,切入内核,内核栈绑定用户栈 首先分析五段论中的第一段: 中断入口:先把相关寄存器压栈保存,然后call真正的fork系统调用 当前进程被阻塞或时间片到后,使用调度算法进行线程切换 reschedule的展开:其实是把ret_from_sys_call的地址压栈(作用之后就会看到),然后再去进行调度算法 此时的内核栈:??2后是内核当前的esp指针 第五段和调度算法:执行完调度算法后…
准备工作 1.进程的状态有五种:新建(N),就绪或等待(J),睡眠或阻塞(W),运行(R),退出(E),其实还有个僵尸进程,这里先忽略 2.编写一个样本程序process.c,里面实现了一个函数 /* * 此函数按照参数占用CPU和I/O时间 * last: 函数实际占用CPU和I/O的总时间,不含在就绪队列中的时间,>=0是必须的 * cpu_time: 一次连续占用CPU的时间,>=0是必须的 * io_time: 一次I/O消耗的时间,>=0是必须的 * 如果last > c…
1. 背景 进程的创建过程无疑是最重要的操作系统处理过程之一,很多书和教材上说的最多的还是一些原理的部分,忽略了很多细节.比如,子进程复制父进程所拥有的资源,或者子进程和父进程共享相同的物理页面,拥有自己的地址空间,子进程创建后接受统一调度执行等等. 原理性的书籍更多地关注了进程创建过程中各个关键部分的功能,但由于过于抽象,很难理解,因此如果自己能够实际操作,实践这个过程就很重要,可以让那些看起来抽象的概念变的现实而容易理解,比如所谓的父进程的资源,父进程所拥有的物理页面,甚至父进程的地址空间等…
/* * linux/kernel/fork.c * * (C) 1991 Linus Torvalds */ /* 注意:signal.c和fork.c文件的编译选项内不能有vc变量优化选项/Og,因为这两个文件 内的函数参数内包含了函数返回地址等内容.如果加了/Og选项,编译器就会在认为 这些参数不再使用后占用该内存,导致函数返回时出错. math/math_emulate.c照理也应该这样,不过好像它没有把eip等参数优化掉:) */ #include <set_seg.h> /* *…
进程0是由linus写在操作系统文件中的,是预先写死了的.那么进程0以后的进程是如何创建的呢?本篇文章主要讲述进程0创建进程1的过程. 在创建之前,操作系统先是进行了一系列的初始化,分别为设备号.块号.内存大小的设置.内存管理.中断.字符设备.时间.LDT和GDT.缓冲区.硬盘.软盘以及开启之前关闭的中断.由于操作系统通常情况下是运行在用户模式下的,因此还进行的一个很重要的工作就是特权级的切换.具体对应linux0.11代码中main.c文件中的内容. 接下来一个很有意思且很重要的事情就是,调用…
http://blog.163.com/di_yang@yeah/blog/static/86118492201212534924900/ 一直缠绕的两个问题:怎样标识的内核栈与用户栈?如何在内核态堆栈与用户态堆栈之间切换? 用户态堆栈指针:ss和esp: 内核态堆栈指针:ss0和esp0: 二者均位于任务的tss结构中.这里的任务是指除任务0和1之外的普通任务. CPU进行用户态堆栈到内核态堆栈的切换操作时,CPU会从当前任务的任务状态段TSS中取得新堆栈的段选择符和偏移值,即从TSS的ss0…