当前位置: 首页 > news >正文

一、7.协同式任务切换与抢占式任务切换

image-20230804143704820

使用TSS来在任务切换时保护现场和恢复现场

image-20230804144504435

内核任务:单纯由内核组成的任务,和其他用户程序组成其他任务

内核任务的创建

;为内核任务创建任务控制块TCB
mov ecx, 0x46
call sys_routine_seg_sel:allocate_memory
call append_to_tcb_link ;将此TCB添加到TCB链上
mov esi, ecx;为内核任务的TSS分配内存空间
mov ecx, 104 ;为内核任务的TSS分配内存
call sys_routine_seg_sel:allocate_memory
mov [es:esi+0x14], ecx ;在内核TCB中保存TSS基地址;在内核任务的TSS中设置必要的项目 
mov word [es:ecx+96],0             ;没有LDT。处理器允许没有LDT的任务。
mov word [es:ecx+102],103          ;没有I/O许可位图。0特权级事实上不需要。
mov word [es:ecx+0],0              ;反向链=0,不使用硬件任务切换,不产生任务链
mov dword [es:ecx+28],0            ;登记CR3(PDBR)
mov word [es:ecx+100],0            ;T=0;不需要0、1、2特权级堆栈。0特级不会向低特权级转移控制。

IO许可位图:

image-20230804152320777

当任务的CPL特权级高于(数值小于)他的EFLAGS中的IOPL字段,那么这个任务可以访问任何硬件端口,0特权级可访问任何硬件端口

修改IOPL:需要先把EFLAGS/FLAGS压栈,在栈中修改,然后出栈

image-20230804153010489

在16位操作尺寸下也可以压入32位的EFLAGS,只需要使用PUSHFD翻转操作数尺寸即可,但在32位操作尺寸下PUSHF和PUSHFD作用相同

POPF同理

PUSHF/PUSHFD和POPF/POPFD的执行不受特权级限制,但是标志寄存器压栈后IOPL字段的读写状态受特权级影响,若CPL不为0,则栈中的IOPL类似只读状态

image-20230804155508870

当然也不是说一旦CPL特权级低于IOPL,所有硬件端口就禁止访问

image-20230804160548500

image-20230804160514454

TSS描述符中的段界限包含了IO许可位映射区的大小

任务切换

image-20230804162532218

协同式任务切换

		;创建内核任务的TSS描述符,并安装到GDT中 mov eax,ecx                        ;TSS的起始线性地址mov ebx,103                        ;段长度(界限)mov ecx,0x00408900                 ;TSS描述符,特权级0call sys_routine_seg_sel:make_seg_descriptorcall sys_routine_seg_sel:set_up_gdt_descriptormov [prgman_tss+0x04],cx           ;保存程序管理器的TSS描述符选择子 ;任务寄存器TR中的内容是任务存在的标志,该内容也决定了当前任务是谁。;下面的指令为当前正在执行的0特权级任务“程序管理器”后补手续(TSS)。ltr cx        ;现在可认为内核任务正执行中

创建用户程序

		mov ecx,0x46call sys_routine_seg_sel:allocate_memorycall append_to_tcb_link            ;将此TCB添加到TCB链中 push dword 50                      ;用户程序位于逻辑50扇区push ecx                           ;压入任务控制块起始线性地址 call load_relocate_program ;主动发起任务切换     
initiate_task_switch: ;主动发起任务切换pushadpush dspush esmov eax, core_data_seg_selmov es, eaxmov eax, mem_0_4_gb_seg_selmov ds, eaxmov eax, [es:tcb_chain]; 搜索状态为忙(当前任务)的节点.b0:cmp word [eax+0x04], 0xffffcmove esi, eaxjz .b1;从当前节点继续搜索就绪任务的节点.b1:mov ebx, [eax]or ebx, ebxjz .b2 ;到表尾也没找到,就从头找cmp word [ebx+0x04], 0x0000cmove edi, ebx ;找到就绪节点,edi=节点线性地址jz .b3mov eax, ebxjmp .b1.b2:mov ebx, [es:tcb_chain].b20:cmp word [ebx+0x04], 0x0000cmove edi, ebxjz .b3mov ebx, [ebx]or ebx, ebxjz .return ;表中不存在空闲任务,返回jmp .b20;就绪任务的节点已找到,准备切换.b3:not word [esi+0x04] ;将忙状态的节点改为就绪not word [edi+0x04] ;将就绪节点改为忙jmp far [edi+0x14] ;任务切换.return:pop espop dspopadretf
;用户任务进行任务切换
call far [fs:InitTaskSwitch];用户任务退出
call far [fs:TerminateProgram]
terminate_current_task: ;终止当前任务;注意,执行此例程时,当前任务仍在运行中。此例程其实也是当前任务的一部分 mov eax, core_data_seg_selmov es, eaxmov eax, mem_0_4_gb_seg_selmov ds, eaxmov eax, [es:tcb_chain] ;eax=首节点的线性地址;搜索状态为忙(当前任务)的节点.s0:cmp word [eax+0x04]jz .sl ;找到忙节点,eax=节点的线性地址mov eax, [eax] jmp .s0;将状态为忙的节点改成终止状态.s1:mov word [eax+0x04], 0x3333;搜索就绪状态的任务mov ebx, [es:tcb_chain] ;ebx=链表首节点线性地址.s2:cmp word [ebx+0x04], 0x0000jz .s3 ;已找到就绪节点,ebx=节点的线性地址mov ebx, [ebx]jmp .s2;就绪任务的节点已经找到,准备切换到该任务.s3:not word [ebx+0x04]jmp far [ebx+0x14]

抢占式任务切换

抢占式任务切换需要依赖硬件中断

中断与异常是并列关系

image-20230804201353006

异常根据发生原因可分为:

image-20230804201741720

异常根据性质可分为:
image-20230804201939590

image-20230804205133862

实模式下直接访问IVT获取中断处理代码地址

保护模式下需要获取描述符

image-20230804204551718

image-20230804204753037

image-20230804205735725

image-20230804205749878

创建并安装中断门

general_interrupt_handler:                  ;通用的中断处理过程push eaxmov al,0x20                        ;中断结束命令EOI out 0xa0,al                        ;向从片发送 out 0x20,al                        ;向主片发送pop eaxiretd;-------------------------------------------------------------------------------
general_exception_handler:                  ;通用的异常处理过程mov ebx,excep_msgcall flat_4gb_code_seg_sel:put_stringhlt
;-------------------------------------------------------------------------------
rtm_0x70_interrupt_handle:                  ;实时时钟中断处理过程pushadmov al,0x20                        ;中断结束命令EOIout 0xa0,al                        ;向8259A从片发送out 0x20,al                        ;向8259A主片发送mov al,0x0c                        ;寄存器C的索引。且开放NMIout 0x70,alin al,0x71                         ;读一下RTC的寄存器C,否则只发生一次中断;此处不考虑闹钟和周期性中断的情况call sys_routine_seg_sel:initiate_task_switch ;请求任务切换popadiretd
		mov ecx, core_data_seg_selmov ds, ecx ;ds指向核心数据段mov ecx, mem_0_4_gb_seg_selmov es, ecx ;es指向4G数据段;创建中断描述符表IDT;其余为保留或硬件使用的中断向量mov eax,general_exception_handler  ;公共异常处理代码在段内偏移地址mov bx,flat_4gb_code_seg_sel       ;代码所在段的选择子mov cx,0x8e00                      ;中断门高32位部分的低16位,0特权级call flat_4gb_code_seg_sel:make_gate_descriptor ;构建门描述符mov ebx,idt_linear_address         ;中断描述符表的线性地址xor esi,esi.idt0:mov [es:ebx+esi*8],eaxmov [es:ebx+esi*8+4],edxinc esicmp esi,19                         ;安装前20个异常中断处理过程jle .idt0;除了0~20是公共的中断门,还有32~255为为保留或硬件使用的中断向量mov eax,general_interrupt_handler  ;门代码在段内偏移地址mov bx,flat_4gb_code_seg_sel       ;门代码所在段的选择子mov cx,0x8e00                      ;32位中断门,0特权级call flat_4gb_code_seg_sel:make_gate_descriptormov ebx,idt_linear_address         ;中断描述符表的线性地址.idt1:mov [es:es:ebx+esi*8],eaxmov [es:ebx+esi*8+4],edxinc esicmp esi,255                        ;安装普通的中断处理过程jle .idt1;设置实时时钟中断处理过程mov eax,rtm_0x70_interrupt_handle  ;门代码在段内偏移地址mov bx,flat_4gb_code_seg_sel       ;门代码所在段的选择子mov cx,0x8e00                      ;32位中断门,0特权级call flat_4gb_code_seg_sel:make_gate_descriptormov ebx,idt_linear_address         ;中断描述符表的线性地址mov [es:ebx+0x70*8],eaxmov [es:ebx+0x70*8+4],edx

image-20230805085932089

加载中断描述符表寄存器IDTR

image-20230805093051632

pidt             dw  0dd  0
		;准备开放中断mov word [pidt],256*8-1            ;IDT的界限mov dword [pidt+2],idt_linear_addresslidt [pidt]                        ;加载中断描述符表寄存器IDTR

8259A主片默认使用0x08 ~ 0x0F中断向量号,但是处理器已经把0x08 ~ 0x0F设置成异常了,向量号冲突,需要重新设置

初始化命令字ICW1 ~ 4可发给主片和从片,先把ICW1发给主片的0X20和从片的0XA0,根据其内容决定让主片(0X21)和从片(0XA1)是否期待后续

image-20230805094805019

image-20230805095025403

image-20230805095510587

image-20230805095638974

 		;设置8259A中断控制器mov al,0x11out 0x20,al                        ;ICW1:边沿触发/级联方式mov al,0x20out 0x21,al                        ;ICW2:起始中断向量mov al,0x04out 0x21,al                        ;ICW3:从片级联到IR2mov al,0x01out 0x21,al                        ;ICW4:非总线缓冲,全嵌套,正常EOImov al,0x11out 0xa0,al                        ;ICW1:边沿触发/级联方式mov al,0x70out 0xa1,al                        ;ICW2:起始中断向量mov al,0x04out 0xa1,al                        ;ICW3:从片级联到IR2mov al,0x01out 0xa1,al                        ;ICW4:非总线缓冲,全嵌套,正常EOI;设置和时钟中断相关的硬件 mov al,0x0b                        ;RTC寄存器Bor al,0x80                         ;阻断NMIout 0x70,almov al,0x12                        ;设置寄存器B,禁止周期性中断,开放更out 0x71,al                        ;新结束后中断,BCD码,24小时制in al,0xa1                         ;读8259从片的IMR寄存器and al,0xfe                        ;清除bit 0(此位连接RTC)out 0xa1,al                        ;写回此寄存器mov al,0x0cout 0x70,alin al,0x71                         ;读RTC寄存器C,复位未决的中断状态sti                                ;开放硬件中断

中断和异常处理时的特权级保护:

  1. 不检查RPL
  2. 不检查门的DPL,除了int nint3into
  3. 中断描述符描述的目标代码段的特权级必须高于等于当前代码特权级

image-20230805100446208

中断和异常发生时的栈切换过程

image-20230805101307699

与任务切换类似,都是在任务的TSS中找到中断处理过程段的对应特权级的栈寄存器然后压栈各种寄存器保护现场

有些异常产生时,处理器会在栈中压入错误代码

image-20230805102150426

image-20230805102725397

image-20230805103348728

相关文章:

一、7.协同式任务切换与抢占式任务切换

使用TSS来在任务切换时保护现场和恢复现场 内核任务:单纯由内核组成的任务,和其他用户程序组成其他任务 内核任务的创建 ;为内核任务创建任务控制块TCB mov ecx, 0x46 call sys_routine_seg_sel:allocate_memory call append_to_tcb_link ;将此TCB添加…...

JavaScript实践:用Canvas开发一个可配置的大转盘抽奖功能

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已…...

yay无法更新问题解决

背景 更新yay后,yay安装软件捞出问题,查的github上的都不靠谱。因此需要把yay的版本固定下,正常的11版本是可用的 解决方案 sudo pacman -S --needed git base-devel git clone https://aur.archlinux.org/yay.git cd yay makepkg -si # 注…...

C语言 — 动态内存管理(动态内存函数)

前言 本期分为三篇介绍动态内存管理相关内容,关注博主了解更多 博主博客链接:https://blog.csdn.net/m0_74014525 本期介绍动态内存函数,函数如何使用、函数格式、在使用在所需要的注意点及C/C程序的内存开辟区域 系列文章 第一篇&#xff…...

Visual ChatGPT:Microsoft ChatGPT 和 VFM 相结合

推荐:使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 什么是Visual ChatGPT? Visual ChatGPT 是一个包含 Visual Foundation 模型 (VFM) 的系统,可帮助 ChatGPT 更好地理解、生成和编辑视觉信息。VFM 能够指…...

基于java理发店预约系统微信小程序设计与实现

摘要 多姿多彩的世界带来了美好的生活,行业的发展也是形形色色的离不开技术的发展。作为时代进步的发展方面,信息技术至始至终都是成就行业发展的重要秘密。不论何种行业,大到国家、企业,小到团体、个人都在多方位的结合信息化技术…...

【软件测试】大厂测工都是这样学习的,你get到了吗?

有不少的软件测试工程师站在“十字路口”迷茫、无助,找不到自己的方向。一切的迷茫都是因为想得太多而做的太少!每位软件测试行业从业者都能意识到目前自己面临的窘境,但能及时作出改变,顺应时代变化的人还是太少。多数人明明“泰…...

如何使用ONLYOFFICE+ffmpeg来给视频文件打马赛克

如何使用ONLYOFFICEffmpeg来给视频文件打马赛克 我这里之前写过很多关于ONLYOFFICE使用、安装的系列图文,也写过很多关于ffmpeg使用的图文,那么这次继续,把这两个开源软件放在一起,能碰撞出什么火花般的功能来。 这就是给视频文…...

003-依赖注入、属性赋值源码分析

目录 引入作用代码分析InstantiationAwareBeanPostProcessor#postProcessProperties()AutowiredAnnotationBeanPostProcessor查找注入点元数据给注入点注入属性 引入 之前我们了解到BeanDefinition到Bean,经历了 实例化属性赋值初始化 3个步骤现在详细分析下属性赋…...

Elasticsearch 商业启示

上月的“红帽事件”,说明开源软件的“客服模式”行不通,那么,开源软件如何赚钱呢?既不能卖软件,又不能卖支持服务,该怎么办呢?我现在的看法是,只剩下一种模式是可行的,开…...

C++/Qt 读写文件

之前写过两篇跟文件操作相关的博客,有兴趣也可以看一下: C语言读写文件 Qt关于文件路径的处理 先讲一些关于基础文本文件和二进制文件的读写操作,后续将会整理C/Qt关于ini、xml、json、xlsx相关文件的读写操作。 C 相比于C语言使用FILE文…...

linux服务器之-nethogs命令

文章目录 NetHogs 工具安装安装依赖包安装epel源安装Nethogs 使用 NetHogs 工具 NetHogs是一个小型的net top工具,不像大多数工具那样拖慢每个协议或者是每个子网的速度而是依照进程进行带宽分组。 安装 安装依赖包 yum install libpcap libpcap-devel epel-rel…...

《每天5分钟玩转kubernetes》读书笔记

笔记 概念 Pod是脆弱的,但应用是健壮的。 kubelet运行在Cluster所有节点上,负责启动Pod和容器。kubeadm用于初始化Cluster。kubectl是k8s命令行工具。通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。 …...

【RabbitMQ】golang客户端教程4——路由(使用direct交换器)

路由 在上一教程中,我们构建了一个简单的日志记录系统。我们能够向许多接收者广播日志消息。 在本教程中,我们将向它添加一个特性-我们将使它能够只订阅消息的一个子集。例如,我们将只能将关键错误消息定向到日志文件(以节省磁盘…...

Shell脚本学习-for循环结构2

案例:通过脚本实现仅sshd、rsyslog、crond、network、sysstat服务在开机时自启动。 Linux系统在开机的服务通常工作在文本模式3级别,因此只需要查找3级别以上的开启的服务即可。查看命令: chkconfig --list |grep 3:on [rootvm1 ~]# chkco…...

vue 老项目 npm install 报错Python,c++等相关错误

​​​ 老项目npm install 下载依赖包报错 解决方法: //下载python 1、 npm install --global --production windows-build-tools//配置环境 : 也可暂时不用配置,能用就不用配置(npm config set python "D:\Python27\python.exe&q…...

【c语言初级】c++基础

文章目录 1. C关键字2. 命名空间2.1 命名空间定义2.2 命名空间使用 3. C输入&输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.2 C函数重载的原理--名字修饰采用C语言编译器编译后结果 1. C关键字 C是在C的基础之上,容纳进去了面向对象编程思想…...

idea打开传统eclipse项目

打开传统web项目 1.打开后选择项目文件 2.选择项目结构 3.设置jdk版本 4.导入当前项目模块 5.选择eclipse 6. 设置保存目录 7.右键模块,添加spring和web文件 8. 设置web目录之类的,并且创建打包工具 9.如果有本地lib,添加为库 最后点击应用&…...

全国各城市-财政收入-一般预算收入-各项税收-个人所得税(1999-2020年)

个人所得税是一项反映国家财政状况和个人经济水平的重要数据。通过对全国各城市个人所得税数据的研究,可以提供研究者参考的有益信息。首先,个人所得税数据反映了不同城市居民的收入水平。通过对不同城市的个人所得税数据进行比较,可以了解不…...

【动态网页抓取】 :用Python抓取所有内容的指南

一、说明 您在抓取动态网页内容时是否得到了糟糕的结果?不仅仅是你。对于标准抓取工具来说,爬网动态数据是一项具有挑战性的任务(至少可以说)。这是因为当发出HTTP请求时,响应程序的某些部分JavaScript在后台运行&…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息&#xff0…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

C++ 设计模式 《小明的奶茶加料风波》

👨‍🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...