首页 > 其他分享 >一个操作系统的设计与实现——第22章 64位任务

一个操作系统的设计与实现——第22章 64位任务

时间:2024-09-01 10:26:03浏览次数:12  
标签:__ 操作系统 22 任务 64 TSS

22.1 64位TSS与TSS描述符

想要实现任务,就需要先安装好TSS与TSS描述符。

64位TSS如下图所示:

如图所示,64位TSS的大小不变,还是104字节。64位CPU淘汰了硬件任务切换和数据段寄存器,因此,64位TSS的组成与32位TSS完全不同,其已不具备保存寄存器的功能,其中的大部分字节用于中断栈表(Interrupt Stack Table,IST),这个功能在我们的操作系统中没有使用。在我们的操作系统中,TSS的作用是取得0特权级栈,这与32位操作系统一样。

64位TSS描述符与中断门类似:在32位TSS描述符的基础上增加了8字节,用于存放TSS地址的高32位,如下图所示:

22.2 实现64位任务

想要实现任务加载,就需要先实现硬盘驱动。硬盘驱动的实现位于本章代码22/HD.h22/HD.s中,其实现思路与32位操作系统一致,这里不再赘述。

想要实现任务切换,就需要先实现带关中断功能的任务队列。任务队列的实现位于本章代码22/Queue.h22/Queue.hpp中,其实现思路与32位操作系统一致,这里不再赘述。

接下来,请看本章代码22/Mbr.s

第155行,在GDT中增加TSS描述符,其索引值为7。TSS固定放置在0xffff800000092000处。

接下来,请看本章代码22/Task.h

第7~14行,定义了TCB。我们需要关注此结构体部分成员的偏移量:

  • __tcbNode中有两个指针,所以__CR3的偏移量是0x10
  • __RSP0的偏移量是0x18
  • __taskQueue的偏移量是0x20

这些偏移量稍后将用在汇编语言中。

第16~23行,声明了任务队列,以及任务的各类接口。

接下来,请看本章代码22/Task.hpp

第10行,定义了任务队列和退出队列。

__tssInit函数用于安装TSS、TR以及IA32_GS_BASE

第14行,将TSS清零。TSS只有104字节,但这里写的是128字节,这样做的目的是:将TSS拓展到128字节,多出的字节保留给后续章节使用。

第15行,填写TSS的IO位图基址字段,如果这个值大于等于TSS限长,则IO位图不存在。

第17行,加载TR。

TSS在0xffff800000092000处,在任务切换时,我们需要访问TSS,并安装新的RSP0。TSS的地址是64位的,因此在访问前需要先使用mov指令。不过,还有更方便的办法:将fs/gs的段基址直接设定为0xffff800000092000,然后基于fs/gs访问TSS。

fs/gs的段基址可由IA32_FS_BASEIA32_GS_BASE这两个MSR设定,其编号分别为0xc00001000xc0000101,将edx:eax拼成一个64位的地址即可。在我们的操作系统中,选用的是gs

第18行,将IA32_GS_BASE设定为0xffff800000092000

__kernelTaskInit函数用于安装内核任务的TCB。TCB的__RSP0成员在任务切换时设定,__vBitmap成员用于3特权级任务,因此这两个成员无需设定。

taskInit函数是主函数。

getTCB函数用于获取当前TCB。TCB与0特权级栈位于同一页,因此,只需要将RSP0向下对齐到页边界即可。

__getRFLAGS函数用于获取一个打开IF位rflags。该函数在伪造栈时使用。

loadTaskPL0loadTaskPL3函数用于加载任务,其实现思路与32位操作系统一致,这里不再赘述。

需要注意的是:与32位操作系统不同,新操作系统的外壳程序不再具备等待任务的功能,任务在运行期间的行为类似于Linux的后台任务。因此,不再有shellQueueloadTaskPL3函数的末尾也不再立即进行任务切换。

deleteTask函数用于回收exitQueue中的TCB。

接下来,请看本章代码22/Task.s

taskExit函数用于任务退出。

第13行,回收任务内存空间中的所有内存,在我们的操作系统中,这部分内存包括任务的ELF文件要求的内存,以及任务的3特权级栈。

第15~19行,将任务的TCB加入exitQueue

第21行,跳转至__nextTask。这个地址位于Int.s,作用是从taskQueue中取出一个新的TCB,并切换到新任务。

接下来,请看本章代码22/Int.s

intTimer函数现在用于任务切换。

第79~81行,计算当前任务的TSS。

第83行,将rsp保存到TSS的__RSP0成员中。

第85~87行,将TSS加入TSS的__taskQueue成员所指定的任务队列中。

第89行,声明了taskExit函数使用的__nextTask标签。

第91~93行,从taskQueue中取出一个新的TSS。

第95~96行,安装新任务的PML4。

第98行,安装新任务的栈。

第100~101行,将新任务的0特权级栈安装到TSS中。这里使用了先前设定的IA32_GS_BASE

第103~119行,从中断返回到新任务。

22.3 编译与测试

本章代码22/Test.c用于测试3特权级任务。我们虽然已经实现了任务退出函数,但还没有为其安装系统调用,因此任务是不能退出的。

本章代码22/Makefile增加了Task.sHD.sTest.c的编译与链接命令。

本章代码22/Kernel.c测试了loadTaskPL3deleteTask函数。由于3特权级任务什么都不能做,因此读者可在bochsdbg中观察测试结果。

标签:__,操作系统,22,任务,64,TSS
From: https://www.cnblogs.com/yingyulou/p/18391064

相关文章

  • 一个操作系统的设计与实现——第25章 多处理器(上):多处理器同步原语
    25.1多处理器同步原语的实现原理当计算机中存在不止一个CPU时,基于关中断的同步原语就失效了。这是因为每个CPU的中断是独立的,关闭一个CPU的中断并不会影响其他CPU。从本质上说,中断由rflags控制,但rflags在每个CPU中都有一个,因此,只有找到一个共享区域,才能实现多CPU间的同步原语。......
  • 一个操作系统的设计与实现——第24章 64位文件系统,键盘驱动与外壳程序
    24.164位文件系统想要实现文件系统,就需要一个超级块和一个文件系统位图。在我们的操作系统中,超级块位于98号扇区,文件系统位图位于99号扇区,文件从100号扇区开始存放。本章代码24/FS.h定义了FCB,一个FCB的大小是32字节,一个扇区可以存放16个FCB,其中,最后一个FCB改为存放魔数,这些FCB......
  • 操作系统基础——内存管理
    ###内存管理####1.**分页(Paging)**1.**定义**:-分页是一种内存管理技术,将物理内存分成固定大小的块,称为“页框”(PageFrame),同时将逻辑内存分成相同大小的块,称为“页”(Page)。2.**页表(PageTable)**:-页表是一个数据结构,用于存储逻辑地址到物理地址的映射关系。-每......
  • Metasploit Pro 4.22.3-2024082201 (Linux, Windows) - 专业渗透测试框架
    MetasploitPro4.22.3-2024082201(Linux,Windows)-专业渗透测试框架Rapid7Penetrationtesting,releaseAug22,2024请访问原文链接:https://sysin.org/blog/metasploit-pro-4/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org世界上最广泛使用的渗透测试框架......
  • 处事22计、心态24条、伤心50句、礼仪73、学会长大20!
    处事22计、心态24条、伤心50句、礼仪73、学会长大20!处事22计1.看穿但不说穿。很多事情,只要自己心里有数就好了,没必要说出来。2.高兴,就笑,让大家都知道。悲伤,就假装什么也没发生。3.在不违背原则的情况下,对别人要宽容,能帮就帮,千万不要把人逼绝了,给人留条后路……4.快乐最重......
  • 用MATLAB 画一个64QAM的星座图
    由于QAM采用幅度和相位二维调制,其频谱效率大大提高,而且不同点的欧式距离也要大于调幅AM调制方式,QAM也是LTE和5GNR首选的调制方式,本期教大家画一个64QAM的星座图。如下:首先产生一个64QAM的调制数据,幅度归一化SymbolAlphabet=[    complex(3, 3)    complex(......
  • ThinkPHP5 5.0.22/5.1.29 远程代码执行漏洞(5-rce)
    漏洞原理该漏洞存在两种利用方式控制器名未过滤导致rce该漏洞出现的原因在于ThinkPHP5框架底层对控制器名过滤不严,从而让攻击者可以通过url调用到ThinkPHP框架内部的敏感函数,进而导致getshell漏洞核心类Request远程代码执行filter[]为回调函数,get[]或route[]或server[R......
  • 2024-2025-1 20221328 RocEDU.信息安全系统设计 1-1 Markdown学习(选做)
    一、向AI提问AI的回答:1.深入浅出的讲解Markdown及其详细语法Markdown是一种轻量级标记语言,其设计初衷是为了让人们能够使用易读易写的纯文本格式编写文档,并转换成有效的HTML(标准通用标记语言下的一个应用)文档。Markdown的语法简洁明了,比HTML更加简单易用,广泛应用于写作、博客......
  • STM32--硬件读写W25Q64
    声明:我是跟着B站江科大的视频的学习过程中记录下来作者的文案,记录下来是为了方便自己日后复习。如果你也是跟着江科大的视频学习的,可以一起学习。我把其中一些白话进行了修改,并且添加了自己的一些理解。我只有一些pyhon基础,所以可能有错误,学起来也比较吃力,就把自己的一些理解......
  • Markdown学习20221418曾庆林
    一、我掌握的内容1.Markdown及其基本的语法(标题,有序列表,代码)2.线下工具vscode二、我没有掌握的内容1.markdown详细语法(斜体,无序列表,链接,引用,分割线,表格)2.线上工具3.插入公式,绘图,格式转换4.ChatGPT等AIGC的提示词工程中的应用三、实践斜体*列表百度![图片]()终......