一步步编写操作系统 61 任务状态段 TSS

I/O位图是位于TSS中的,它可以存在也可以不存在,它只是用来设置对某些特定端口的访问,没有它的话便默认为禁止访问所有端口。正是由于它可有可用,所以TSS的段界限TSS limit(即实际大小-1)并不固定。当TSS中不包括I/O位图时,TSS只有104字节大小。话说回来了,当处理器执行某些IO指令时,若当前特权级比IOPL低,处理器就会认为也许只是给当前任务单独放行了某些端口,于是它就到TSS中找I/O位图,如果I/O位图不存在,即所有端口都禁止访问,于是处理器就会抛异常。

读到这里,有两个问题要解决:

  1. 处理器到TSS中哪里去找I/O位图呢?
  2. 怎样证明I/O位图不存在?

在TSS结构中,有一项是“I/O位图在TSS中的偏移地址”, 它在TSS中偏移102字节的地方,占2个字节空间,就是图5-47的左上角,此处用来存储I/O位图的偏移地址,即此地址是I/O位图在TSS中以0为起始的偏移量。如果某个TSS存在I/O位图的话,此处用来保存它的偏移地址,示意如图

如图所示,TSS中如果有I/O位图的话,它将位于TSS的顶端,这就是TSS的实际尺寸并不固定的原因,当包括I/O位图时,其大小是“I/O位图偏移地址”+8192+1字节,结尾这个1字节是I/O位图中最后的0xff,说来话长,一会再解释。若不包括I/O位图,其大小则为最小尺寸104字节。由于I/O位图偏移地址并不固定,可以大于等于104,所以在TSS中偏移102字节和I/O位图之间可能会有空闲区域。

您看,既然I/O位图位于TSS内,那它的地址必须是在TSS的尺寸范围之内,即地址的范围是在TSS偏移(104 ~ TSS 段界限limit)之间,如果偏移地址不在此范围,即大于等于TSS 段界限limit(TSS尺寸大小-1),则表明没有I/O位图。

现在来说下为什么在IO位图的结尾有个0xff。

在计算机系统硬件中,IO端口是按字节来编址的,意思是说一个端口只能读写1个字节的数据。如果对一个端口连续读写多个字节,实际上是从以该端口号为起始的多个端口一并读进来的。举个例子,比如in指令可以读取16位端口数据,即一次读取2字节,假设端口0x234是16位端口:

in ax,0x234

这相当于

in al,0x234
in ah,0x235

处理器在进行端口读写时,若当前特权级CPL低于IO特权级IOPL时,如果有I/O位图的话,处理器会在I/O位图中检查端口相应的bit是否为0。若在某个端口中读取多个字节,处理器必然会检查连续的多个端口在I/O位图中对应的多个bit,这些bit必须都得为0 才允许访问它们。

连续的多个bit也许会跨字节,比如端口0x234对应的bit在前一个字节的最后一位,0x235对应的bit在后一个字节的第0位,这样处理器必须将这两个字节都读进来处理。

大多数情况下跨字节都没问题,但当第1个bit在位图的最后一个字节时就会出问题,处理器要读进多个字节,所以,第2个bit所在的字节就越界了,该字节已经不属于位图范围。

为解决这个问题,处理器要求位图的最后一字节必须是0xFF,此字节有两个作用:

第一,处理器允许I/O位图中不映射所有的端口, 即I/O位图长度可以不足8KB,但位图的最后一字节必须为0xFF。如果在位图范围外的端口,处理器一律默认禁止访问。这样一来,如果位图最后一字节的0xFF属于全部65536个端口范围之内,字节各位全为1表示禁止访问此字节代表的全部端口,这并没什么过错。

第二,如果该字节已经超过了全部端口的范围,它并不用来映射端口,只是用来做为位图的边界标记,用于跨位图最后一个字节时的“余量字节”。避免越界访问TSS外的内存。

这就是位图中最后一字节必须为0xFF的原因。

您看I/O位图我说的这么热闹,其实咱们不用它,这里的介绍完全是为了让大伙了解IO访问的工作原理,只会有益无害。

到了这里,特权级就讲完了,本章也结束了,友情提示,我知道本章内容有点多,您已经很累了,现在所说的是结束语,所以可以略过这里不看啦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重读经典:《Deep Residual Learning for Image Recognition》

ResNet论文逐段精读【论文精读】这是李沐博士论文精读的第二篇论文,这次精读的论文是ResNet。ResNet 是 CVPR2016 的最佳论文,目前谷歌学术显示其被引用数已经达到了90000。 ResNet论文链接为:https://arxiv.org/abs/1512.03385。 1.第一遍 …

【CodeForces - 1131F 】Asya And Kittens(并查集,思维)

题干: Asya loves animals very much. Recently, she purchased nn kittens, enumerated them from 11 and nn and then put them into the cage. The cage consists of one row of nncells, enumerated with integers from 11 to nn from left to right. Adjacent…

详解道路标记数据集 CeyMo: See More on Roads -- A Novel Benchmark Dataset for Road Marking Detection

本文介绍一个新的道路标记检测数据集,论文收录于 WACV2022。Ceymo数据集总共包含2887张图片,标注了11类共4706个道路标记实例,图片分辨率为 192010801920\times108019201080。其中,对于每一个道路标记实例,作者采用了三…

动手学无人驾驶(7):车道线检测

最近在研究视觉语义地图,需要进行车道线检测,发现这篇车道线检测论文效果蛮好的 (Ultra Fast Structure-aware Deep Lane Detection)。论文作者在知乎上已经介绍过了:https://zhuanlan.zhihu.com/p/157530787&#xff…

Coursera自动驾驶课程第16讲:LIDAR Sensing

在第15讲《Coursera自动驾驶课程第15讲:GNSS and INS Sensing for Pose Estimation》 我们学习了自动驾驶定位中常用的两种传感器:IMU(惯性测量单元) 和GNSS(全球导航卫星系统)。 本讲我们将学习自动驾驶汽…

DB、ETL、DW、OLAP、DM、BI关系结构图

在此大概用口水话简单叙述一下他们几个概念: (1)DB/Database/数据库——这里一般指的就是OLTP数据库,在线事物数据库,用来支持生产的,比如超市的买卖系统。DB保留的是数据信息的最新状态,只有一…

Tarjan 算法 常用模板

可以求每个点属于第几个强连通分量&#xff1a;https://blog.csdn.net/dellaserss/article/details/8267192 int Tarjan(int u){int v;dfn[u]low[u]Index;stack[Top]u;Instack[u]1;for(int i0;i<G[u].size();i){vG[u][i];if(!dfn[v]){Tarjan(v);low[u]min(low[u],low[v]);}…

【HDU - 5012】Dice(模拟,bfs)

题干&#xff1a; There are 2 special dices on the table. On each face of the dice, a distinct number was written. Consider a 1.a 2,a 3,a 4,a 5,a 6 to be numbers written on top face, bottom face, left face, right face, front face and back face of dice A. S…

重读经典:《Generative Adversarial Nets》

GAN论文逐段精读【论文精读】这是李沐博士论文精读的第五篇论文&#xff0c;这次精读的论文是 GAN。目前谷歌学术显示其被引用数已经达到了37000。GAN 应该是机器学习过去五年上头条次数最多的工作&#xff0c;例如抖音里面生成人物卡通头像&#xff0c;人脸互换以及自动驾驶中…

一步步编写操作系统 62 函数调用约定

由于我们要将c语言和汇编语言结合编程啦&#xff0c;所以一定会存在汇编代码和c代码相互调用的问题&#xff0c;有些事情还是要提前交待给大家的&#xff0c;本节就是要给大家说下函数调用规约中的那些事儿。 函数调用约定是什么&#xff1f; 调用约定&#xff0c;calling co…

重读经典:《An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale》

ViT论文逐段精读【论文精读】这次李沐博士邀请了亚马逊计算机视觉专家朱毅博士来精读 Vision Transformer&#xff08;ViT&#xff09;&#xff0c;强烈推荐大家去看本次的论文精读视频。朱毅博士讲解的很详细&#xff0c;几乎是逐词逐句地讲解&#xff0c;在讲解时把 ViT 相关…

给不会调用C++STL库中二分函数lower_bound,upper_bound,binary_search同学的一些话!

lower_bound算法返回第一个大于等于给定值所在的位置。设置两个指针start和last&#xff0c;其中start指向数组的起始位置&#xff0c;last指向数组末尾位置之后的位置。当start和last指向相同位置时循环结束。mid指向[start,last)区间的中间位置&#xff0c;当中间位置元素值大…

详解IMU标定经典论文:A Robust and Easy to Implement Method for IMU Calibration without External Equipments

本文介绍一篇 关于IMU 标定的经典论文&#xff0c;论文收录于 ICRA14&#xff0c;在论文中作者介绍了如何不适用外部设备标定 IMU 加速度和角速度偏差、尺度系数、轴偏移参数。 论文链接&#xff1a;https://readpaper.com/paper/2021503353、https://readpaper.com/paper/221…

重读经典:《Momentum Contrast for Unsupervised Visual Representation Learning》

MoCo 论文逐段精读【论文精读】这次论文精读李沐博士继续邀请了亚马逊计算机视觉专家朱毅博士来精读 Momentum Contrast&#xff08;MoCo)&#xff0c;强烈推荐大家去看本次的论文精读视频。朱毅博士和上次一样讲解地非常详细&#xff0c;几乎是逐词逐句地讲解&#xff0c;在讲…

【HRBUST - 1623】Relation(思维模拟,拆解字符串)

题干&#xff1a; 一天&#xff0c;ikki在看书的时候发现书上有个类似于家谱状的插图&#xff0c;突然ikki想到了一个有趣的现象&#xff1a;有时候用某个人一连串 的关系描述另一个人的时候&#xff0c;最后可能还是他本身。例如&#xff1a;小明的爸爸的爸爸和小明的爷爷是同…

一步步编写操作系统 67 系统调用的实现1-2 68

接上文&#xff1a; 系统调用的子功能要用eax寄存器来指定&#xff0c;所以咱们要看看有哪些系统调用啦&#xff0c;在linux系统中&#xff0c;系统调用是定义在/usr/include/asm/unistd.h文件中&#xff0c;该文件只是个统一的入口&#xff0c;指向了32位和64位两种版本。在a…

【HDU - 6662】Acesrc and Travel(树形dp,博弈dp)

题干&#xff1a; Acesrc is a famous tourist at Nanjing University second to none. During this summer holiday, he, along with Zhang and Liu, is going to travel to Hong Kong. There are nnspots in Hong Kong, and n−1n−1 bidirectional sightseeing bus routes …

一步步编写操作系统 69 汇编语言和c语言共同协作 70

由于有了上一节的铺垫&#xff0c;本节的内容相对较少&#xff0c;这里给大家准备了两个小文件来实例演示汇编语言和c语言相互调用。 会两种不同语言的人&#xff0c;只是掌握了同一件事物的两种表达方式。人在学习一种新语言时&#xff0c;潜意识里是建立了语言符号与事物形象…

一步步编写操作系统 71 直接操作显卡,编写自己的打印函数71-74

一直以来&#xff0c;我们在往屏幕上输出文本时&#xff0c;要么利用bios中断&#xff0c;要么利用系统调用&#xff0c;这些都是依赖别人的方法。咱们还用过一个稍微有点独立的方法&#xff0c;就是直接写显存&#xff0c;但这貌似又没什么含量。如今我们要写一个打印函数了&a…