`

linux 经典进程切换实现代码

阅读更多
extern _inline void switch_to(int n)
{
unsigned short __tmp;
__tmp = (unsigned short)_TSS(n);

_asm {
  mov ebx, offset task
  mov eax, n
  mov ecx, [ebx+eax*4]
  cmp ecx, current/* 任务n 是当前任务吗?(current ==task[n]?) */
  je l1 /* 是,则什么都不做,退出。*/
  xchg ecx,current/* current = task[n]; */
  /*执行长跳转,造成任务切换 (头大了很长时间,多多包涵)*/
  mov ax, __tmp
  mov word ptr ds:[lcs],ax
  _emit 0xea
  _emit 0  // ip
  _emit 0
  _emit 0
  _emit 0
lcs: _emit 0  // cs
  _emit 0
// 在任务切换回来后才会继续执行下面的语句。
  cmp last_task_used_math,ecx /* 新任务上次使用过协处理器吗?*/
  jne l1
  clts/* 新任务上次使用过协处理器,则清cr0 的TS 标志。*/
}
l1: ;
}

上面这段函数就是linux用来切换任务的函数。

刚开始阅读时,对红色的这段非常不理解。

在查阅了一些资料后,终于恍然大悟

资料:

jmp far F000:E05B 翻成机器 码就是 0xEA 0x5B 0xE0 0x00 0xF0

_emit指令就是直接将后面的1字节内容输出。

根据资料,我就知道了

_emit 0xEA就是jmp

紧跟在jmp后面的4字节就是IP(偏移值),再接下来的2字节就是段选择符。

mov word ptr ds:[lcs],ax。就是将ax的内容移动到上面提到的cs中,而此时ax内的内容就是tss中当前任务的cs值



分享到:
评论

相关推荐

    重庆理工大学操作系统基于Linux0.11内核的实践

    在Linux0.11的环境下完成基于内核栈切换的进程切换、地址映射与共享、终端设备的控制、proc文件系统的实现中的三个及以上实验项目。 在Linux四项任务中成功完成了四项:基于内核栈切换的进程切换,终端设备的控制,...

    实现进程切换的简单os代码

    模仿Linux的初始化,用nasm 实现。

    操作系统使用C语言链表实现进程管理

    用C语言链表实现进程转换,阻塞变就绪,就绪变执行,执行变阻塞三种状态的转换

    linux 内核源代码分析

    4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章 文件系统 5.1 概述 5. 2 从路径名到目标节点 5. 3 访问权限与文件安全性 5. 4 文件系统的安装和...

    linux内核源代码 0.00版本 最适合把玩操作系统的同学

    linux内核源代码 0.00版本 最适合把玩操作系统的同学 linux最老的源码,只是实现在两个进程间切换。

    深入分析Linux内核源码.chm

    5.4 进程切换 第六章 Linux内存管理 6.1 Linux的内存管理概述 6.2 Linux内存管理的初始化 6.3 内存的分配和回收 6.4 地址映射机制 6.5 请页机制 6.6 交换机制 6.7 缓存和刷新机制 6.8 进程的创建和执行 第七章 进程...

    Professional Linux Kernel Architecture

    进程管理和调度:深入探讨Linux内核中的进程管理机制和调度算法,包括进程的创建、上下文切换、优先级调度等。 内存管理:解释Linux内核中的虚拟内存管理机制、页面置换算法和内存分配器,包括页面映射、内存回收、...

    深入分析Linux内核源码

    5.3.2 Linux进程调度时机 5.3.3 进程调度的依据 5.3.4 进程可运行程度的衡量 5.3.5 进程调度的实现 5.4 进程切换 5.4.1 硬件支持 5.4.2 进程切换 第六章 Linux内存管理 6.1 Linux的内存管理概述 6.1.1 ...

    Linux2.6内核标准教程(共计8-- 第1个)

    4.6 进程切换过程分析 183 4.6.1 选取合适进程 183 4.6.2 完成上下文切换 184 4.7 空闲进程的初始化 187 4.7.1 空闲进程的内核态栈 187 4.7.2 空闲进程的内存描述符 188 4.7.3 空闲进程的硬件上下文 ...

    Linux2.6内核标准教程(共计8--第6个)

    4.6 进程切换过程分析 183 4.6.1 选取合适进程 183 4.6.2 完成上下文切换 184 4.7 空闲进程的初始化 187 4.7.1 空闲进程的内核态栈 187 4.7.2 空闲进程的内存描述符 188 4.7.3 空闲进程的硬件上下文 ...

    Linux2.6内核标准教程(共计8--第8个)

    4.6 进程切换过程分析 183 4.6.1 选取合适进程 183 4.6.2 完成上下文切换 184 4.7 空闲进程的初始化 187 4.7.1 空闲进程的内核态栈 187 4.7.2 空闲进程的内存描述符 188 4.7.3 空闲进程的硬件上下文 ...

    IO复用服务器linux C语言开发的包含客户端

    代码解析: 1,服务与客户端以两种格式进行数据发送,一个是以char数组,一...但线程不可过多,CPU频繁切换时会更消耗时间。而且线程经常销毁与创建也是特别消耗资源的。 2,应该引用进守护进程。 (可供初学者读用)

    Linux2.6内核标准教程(共计8--第3个)

    4.6 进程切换过程分析 183 4.6.1 选取合适进程 183 4.6.2 完成上下文切换 184 4.7 空闲进程的初始化 187 4.7.1 空闲进程的内核态栈 187 4.7.2 空闲进程的内存描述符 188 4.7.3 空闲进程的硬件上下文 ...

    Linux2.6内核标准教程(共计8--第7个)

    4.6 进程切换过程分析 183 4.6.1 选取合适进程 183 4.6.2 完成上下文切换 184 4.7 空闲进程的初始化 187 4.7.1 空闲进程的内核态栈 187 4.7.2 空闲进程的内存描述符 188 4.7.3 空闲进程的硬件上下文 ...

    嵌入式Linux下广告机项目源码.zip

    广告机除了循环播放视频以外,还需要实现网络...主进程里等待mplayer进程视频播放完毕完成新视频切换,在主线程里还有一个线程,用来检测服务器是否有新的视频文件需要更新,然后在合适的时间进行定时下载视频文件。

    Linux RCU机制详解

    Linux RCU机制详解 一:前言 ...4:读者在持有rcu_read_lock()的时候,不能发生进程上下文切换.否则,因为写者需要要等待读者完成,写者进程也会一直被阻塞. 以下的代码是基于linux kernel 2.6.26 。。。

    linux内核 0.11版本源码 带中文注释

    * 是啊,是啊,下面这段程序很差劲,但我不知道如何正确地实现,而且好象它还能运行。如果有 * 关于实时时钟更多的资料,那我很感兴趣。这些都是试探出来的,以及看了一些bios 程序,呵! */ #define CMOS_...

    操作系统课设-进程互斥与调度

    4、输入a/i/o,切换为输入模式,输入代码。 5、按ESC退出输入模式,按shift+:wq,保存退出。 6、输入gcc ./zhanghaohao1.c与gcc ./zhanghaohao2.c编译。 五、程序代码 1、用lockf()来给每一个进程加锁,以实现进程...

    Linux高性能服务器编程

    内容简介《Linux高性能服务器编程》是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐释了编写高性能Linux服务器应用的方法、...

Global site tag (gtag.js) - Google Analytics