一步步编写操作系统 60 cpu的IO特权级2 什么是驱动程序

用户程序可以在由操作系统加载时通过指定整个eflags设置,操作系统如何设置自己的IOPL呢,即使内核IOPL为0也得写进去eflags寄存器中才生效。可惜的是,没有直接读写eflags寄存器的指令,不过可以通过将栈中数据弹出到eflags寄存器中来实现修改。可以先用pushf指令将eflags整体压入栈,然后在栈中修改相应位,再用popf指令弹出到eflags寄存器中。另外一个可利用栈的指令是iretd,用iretd指令从中断返回时,会将栈中相应位置的数据当成eflags的内容弹出到eflags寄存器中。所以可以改变IOPL的指令只有popf和iretd指令,依然是只有在0特权下才能执行。如果在其它特权级下执行此指令,处理器也不会引发异常,只是没任何反应。

接下来看看IO位图是怎么回事。

假如,数值上CPL <= IOPL,程序既可以执行IO特权指令,又可以操作所有的IO端口。倘若数值上CPL > IOPL,程序也不是完全无法进行任何IO操作,有点奇怪是不,似乎和咱们的逻辑不符,其实这样是有道理的。

之前说过,IOPL是所有IO端口的开关,不过,这个开关还留有余地,如果将开关打开,便可以访问全部65536个端口,如果开关被关上,即数值上CPL > IOPL,则可以通过IO位图来设置部分端口的访问权限。也就是说,先在整体上关闭,再从局部上打开。这有点像设置防火墙的规则,先默认为全部禁止访问,想放行哪些端口再单独打开。

处理器为什么允许这么做呢?原因是为了提速。

如果所有IO端口访问都要经过内核的话,由低特权级转向高特权级时是需要保存任务上下文环境的,这个过程也是要消耗处理器时间,随着端口访问多起来,时间成本还是很可观的。这一典型的应用就是硬件的驱动程序,它位于特权级1。

什么是驱动程序?

驱动程序就是通过in、out等IO指令直接访问硬件的程序,它为上层程序提供对硬件的控制访问,相当于硬件的代理,程序员通过它就免去了学习硬件控制的相关知识,简化了程序设计。

所以说,驱动程序肯定是要直接控制IO端口的,尽管它可以像linux那样位于0特权级,但它位于1特权级时,依然可以直接操作硬件端口。

即使是在3特权级下,也要考虑某些需要快速反应的场合,比如某个应用程序需要快速的以硬件交互,所以处理器允许通过I/O位图来为3特权级程序打开某些端口的控制。这些规则同样适用于2特权级,也就是说在任意特权级下,处理器都可以通过I/O位图为相应特权级的程序开启特定的端口。

欲知I/O位图是怎么回事,咱们先把位图的概念明确。

位图就是bit map,map就是映射,建立的是某种对应关系,像地图那样,图上某个区域代表实际地理范围,bit就是位,bit map就是用一个bit映射到某个实际的对象。位图这种结构的操作单位就是bit,所以位图其实就是一串二进制01数字,对位图的操作也就是读写相应的位,处理器中对内存的访问是以字节为单位,不能直接操作位,所以对于操作位图,简单说来就是先将该位所在的字节读到内存,若是想将该位置为1,可以用1对该位进行或’运算,若想将该位清0,可以用0对该位进行’与’运算,以后咱们少不了操作位图,到时候再实践。

intel处理器最大支持65536个端口,它允许任务通过I/O位图来开启特定端口,位图中的每一bit代表相应的端口,比如第0个bit表示第0个端口,第65535个bit表示第65535个端口,65536个端口号占用的位图大小是63356/8=8192字节,即8KB。I/O位图中如果相应bit被置为0,表示相应端口可以访问,否则为1的话,表示该端口禁止访问。如图

再次声明,I/O位图只是在数值上CPL > IOPL,即当前特权级比IOPL低时才有效,若当前特权级大于等于IOPL,任何端口都可直接访问不受限制。

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

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

相关文章

详解惯性导航论文 RINS-W: Robust Inertial Navigation System on Wheels

本文介绍一篇惯性导航定位论文 RINS-W&#xff0c;论文发表于 IROS2019。在本论文中作者提出了仅使用一个IMU进行长时间惯性导航的方法。方法主要包括两个部分&#xff1a; 检测器使用循环神经网络来检测IMU的运动状况&#xff0c;如零速或零横向滑移&#xff1b;使用Invarian…

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

I/O位图是位于TSS中的&#xff0c;它可以存在也可以不存在&#xff0c;它只是用来设置对某些特定端口的访问&#xff0c;没有它的话便默认为禁止访问所有端口。正是由于它可有可用&#xff0c;所以TSS的段界限TSS limit&#xff08;即实际大小-1&#xff09;并不固定。当TSS中不…

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

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

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

题干&#xff1a; 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

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

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

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

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

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

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

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

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 …