当前位置:网站首页 > 编程语言 > 正文

文件权限755对文件所有者意味着(文件权限755对文件拥有者而言何义)



用描述符实施段与段之间的隔离和保护,建立在程序之间分工协作的基础上,首先用户程序不能独立运行需要在内核的支持下运行。

内核需要加载和重定位用户程序、为用户程序的每个段创建描述符,将段选择子回填到用户程序的头部中,因为这个原因用户程序只能访问自己的代码段、数据段和栈段。

当然这样并不能有效的防止用户程序访问GDT,如下程序:

 

用户程序虽然不知道5号描述符指向哪个段,但是仍然可以破坏段中的数据,甚至用户程序重新定义一个来替换内核建立的,从而达到破坏的目的。

还有用户程序只要知道内核中例程的和就可以调用例程执行,这可以破坏内核。

系统的多任务如下:
在这里插入图片描述
使用特权级来划分内核和用户程序、任务的共有部分和私有部分之间的隔离,。
在这里插入图片描述
特权指令:只有的程序能够执行
在这里插入图片描述

特权级是以处理器的工作特点和工作方法进行划分的。

处理器不知道当前执行的是哪个程序,但是可以知道是哪个段:
在这里插入图片描述
程序的特权级就是:组成这个程序的所有代码段的特权级。
在这里插入图片描述
处理器正在执行哪个代码段,其特权级就是()。也即是当前正在执行的程序的特权级。

哪么在哪里体现CPL呢?段寄存器如下:
在这里插入图片描述
段选择器:低两位保存。
在这里插入图片描述
也有例外,如下:

 

当设置的位进入保护模式之后,处理器自动处于0特权级,但是这个特权级无法使用的段选择器来指示,因为CS的段选择器中仍然保存着实模式下的逻辑段地址,而不是段选择子。只有执行了指令之后,才会被刷新,用来指示当前特权级。

在引入保护模式和特权级之后,实模式被赋予新的内涵,实模式下的程序始终是的,在进入保护模式之后,处理器只不过是继承额实模式的。

描述符特权级:
在这里插入图片描述
描述符特权级用来描述指定的的特权级,即描述符描述的是一个段,那么DPL就是这个段特权级。对于一个正在执行的代码段,其和当前的一致。

程序是在不同代码段内执行,那么就是目标代码段的。即控制转移只能发生在两个特权级相同的代码段之间。如下,指向、;的必须是0才能从跳转到内执行。

当然也可以从一个转移到一个内执行,需要特殊的方法。但是无论如何都不能从一个转移到一个内执行。

访问数据时的特权级:
在这里插入图片描述
在当前代码段内访问数据段,那么必须那个,即。代码段特权级别低的话表示其可靠性和安全性不高,不能允许其访问高特权级的数据。

上一章代码中,从时,两者特权级均为0,可以跳转。从时,两者特权级均为0,可以跳转。其中执行这些只能在0特权级执行的指令也是合法的。

一个任务由与共同组成,当内核为用户程序创建描述符时,将用户程序的特权级设置为3,而内核部分特权级为0。

在代码中:原先建立描述符时,特权级为0。

 

在这里插入图片描述
同上,将代码段、数据段栈段均改为特权级3。

但是只修改特权级之后程序将不能正常运行,因为当前内核CPL是0,用户程序DPL是3,不允许使用指令从高特权级向低特权级执行。就算能进入用户程序,则当前CPL为3,在用户程序中调用内核中的例程也不被允许,因为内核DPL为0,不能从低特权级代码段向高特权级代码段执行。

调试程序,在内核跳转执行用户程序时停下:
在这里插入图片描述
显示特权级检查没有通过。

处理器原则上不允许在两个不同特权级代码段之间转移。但是符合一定条件是可以的。

方法一:将目标代码段设置为依从的代码段,中即使其特权级较高,也可从低特权级代码段进入。
在这里插入图片描述

  • :表示寄存器的段描述符
  • :表示代码段
  • :表示普通的代码段、表示依从的代码段,一个代码段是依从的表示可以从低特权级代码段进入、但是不能从高特权级代码段进入。从数值上有 >=
    在这里插入图片描述
    上图中右边可以转移到左边的代码段执行。

接上一节。

方法 二:通过门实施转移
在这里插入图片描述
门描述符描述的是一些系统管理单元,比如描述一个任务、描述一个例程(子程序)。

门描述符描述的是一个例程,称为。
在这里插入图片描述
如果高特权级是依从的,可以从向代码段执行;
若不是依从的,则通过调用门也可从向代码段执行;

调用门格式:
在这里插入图片描述

  • :表示系统描述符;
  • :表示调用门、描述的是一个例程(子程序);
  • :表示调用门无效、为1表示有效(调用这样的门会导致处理器产生异常中断);
  • :表示调用门本身的特权级,表示谁有权通过调用门实施控制转移;
  • :保存用栈传递的参数个数,最多个。

调用门涉及三个部分:
在这里插入图片描述
一是:
二是:
三是:
要想穿过调用门,则在有<= <= 。
在这里插入图片描述
上图,当前代码段特权级时不能通过调用门,时能通过,时不能通过。
在这里插入图片描述

  • 通过指令通过调用门之后还,通过之后处理器在目标代码段的特权级上执行,即由低到高。
  • 通过指令通过调用门之后,通过之后处理器在原来的特权级上执行,即不变。

调用一个例程时,可以使用寄存器和栈传递参数,调用者通过调用门之后将参数压栈,返回时从栈中返回参数。

但是通过调用门之后特权级可能改变当前特权级,从低特权级变为高特权级。此时处理器要求栈也必须切换,从低特权级的栈切换到高特权级的栈,还要复制参数,为了防止栈的原因出错。为了知道需要复制几个参数,调用门描述符中需要保存参数的数量,保存在高32位的中,即。

本章程序有:
主引导程序:
内核程序:
用户程序:

进入保护模式,之后就要进行特权级指令检查,指令进入内核执行,需要进行特权级别检查。
在这里插入图片描述
1、上图中下面两行不需要进行特权级检查,虽然需要访问段中的数据,但是在访问之前需要指定段的位置。
2、就如前两行代码,将一个段选择子传入段寄存器时,要检查是否高于等于,即。
3、若通过检查表示会被加载,那么后续的内存访问指令都是合法的,若没有通过检查则DS不可能成功加载,后续指令就没有机会成功执行。
4、特权级检查的典型时机如下:其中特权指令只能在下执行。
在这里插入图片描述
本章程序可以从的内核进入的用户程序执行,也可以在的用户程序中使用的接口例程。

本章程序:
在这里插入图片描述
1、用户程序中,调用门的,内核代码段得,满足条件,可以执行转移。转移只有处理器以执行。
2、在内核的硬盘读写例程中 将数据段的选择子传送给,需要进行特权级检查,由高特权级的代码段可以访问同级或低级的数据段,从数值上即。在本程序中硬盘读写例程中 <= 用户程序数据段的,满足条件通过检查。
在这里插入图片描述
若用户程序通过调用门执行内核的硬盘读写例程时传递的是,那么在将数据段选择子传递给时也可以通过检查,那么用户程序可以通过调用门破坏内核数据段了。

表明只是依靠当和进行特权级检查是不充分的。

在这里要访问数据段的是用户程序,用户程序自己不能访问外部设备,它请求内核硬盘读写例程代替自己访问一个数据段,在内核硬盘读写例程中当前,之前是3,说明真实请求者的信息被隐藏了。

如果能够恢复请求者的身份,知道他是3特权级的用户程序,自然就知道它不能访问0特权级的内核数据段,将数据段选择子的传送到的指令也就不可能执行。这个问题处理器不能解决。

在访问一个数据段之前,需要将段选择子传送到的段选择器,在进行这个操作时选哟特权级检查。段选择子:
在这里插入图片描述
其中()表示请求者的特权级,那么检查如下:
在这里插入图片描述
对于的检查已经内置到处理器中,由处理器固件完成的,是一个例行的操作。因此当程序员意识到请求者不是当前程序或当前代码段,而是一个低特权级的程序,那么在硬盘读写例程中有:
在这里插入图片描述
此时就可检查出请求者的特权级低于内核数据段特权级,在数值上有,不满足条件,指令终止,处理器产生一个异常中断。

在程序中:

 

假定已经为这个例程创建调用门,调用门的特权级是3,这个例程可以从特权级3的用户程序调用。
在这里插入图片描述
在的就是进入当前例程前请求者的特权级,将其取出传送给数据段选择子的字段,即可修改请求者的特权级。使用指令修改。
在这里插入图片描述
指令比较两个操作数的低2位,若,则修改,使其与保持一致,同时标志寄存器的0标志位。否则不改变,标志寄存器的0标志位。
在这里插入图片描述
程序最后,指令表示由被调用者来调整栈平衡,传入3个参数,一个参数4个字节,共12个字节。

绝大多数时刻,请求者就是当前代码段或者当前程序,此时只需要将的字段设置成就可以了。在程序中:

 

1、此时当前特权级,是从实模式继承来的;
2、请求特权级位与选择子中,其中设置的请求特权级为;
3、转移的目标位置是初始代码段,其中为。
在这里插入图片描述
因此在此条指令执行时,,可以通过特权级检查。

进入保护模式设置数据段:

 

在这里插入图片描述
1、此时;
2、请求特权级在选择子,即请求特权级;
3、目标数据段是4G字节数据段,其描述符中;
能够通过特权级检查。

接下来设置栈段:

 

在这里插入图片描述
1、此时;
2、请求特权级在选择子,即请求特权级;
3、目标数据段是栈段,其描述符中;
能够通过特权级检查。

进入内核之后使用指令在内核中转移是允许的,因为和相同,都是,可以直接调用。但是用户程序的,所以要为那些供用户程序使用的例程创建调用门。

在内核的核心数据段中定义了符号地址检索表,其中有例程的名字、例程所在段内偏移、例程所在段的选择子。现在分别为这些例程创建调用门,并且把他们的改为。

创建调用门的代码如下:

 

其中调用们的描述符:
在这里插入图片描述
安装调用门之后GDT布局:
在这里插入图片描述

接上一节,本节对代码段进行测试:

 

在这里插入图片描述

  • 1、DS指向内内核数据段,偏移指向一个地址,地址处存放的是一个偏移和一个选择子;
  • 2、处理器使用选择子到GDT中取出描述符,发现是一个调用门描述符,包含一个代码段选择子和段内偏移;
  • 3、处理器将代码段选择子传送到CS的选择器部分,将段内偏移传送到EIP;
  • 4、处理器使用CS选择器中的选择子访问GDT,将取出的描述符存放到CS描述符高速缓存器;
  • 5、处理器使用CS描述符高速缓存器 加上 EIP中的偏移 转移到目标例程开始执行。

在这里地址处指定的偏移量和选择子中,只是使用了选择子部分。即在通过调用门实施控制转移时,在指令中提供的偏移量会被忽略。 但是在指令中偏移量还是要加上。如下:
在这里插入图片描述
若指定的选择子是一个调用门,那么指令中指定的偏移量不会被使用,但是在书写时不能不写,但是可以写一个任意值。

通过调用门实施控制转移时的特权级检查。
在这里插入图片描述
在这里插入图片描述

接上一节,本节具体看代码。

其中用户程序调用内核例程和过程:
在这里插入图片描述
特权级检查:
在这里插入图片描述

用指令通过调用门实施控制转移可以改变程序的当前特权级。比如从特权级3的用户程序用指令通过调用门进入特权级0的内核之后,当前特权级也会送3变成0。
在这里插入图片描述
问题在于通过调用门转移的时候,栈的切换时处理器自动进行的,处理器如何知道该切换到哪一个栈呢,如何知道栈在哪里呢?
在这里插入图片描述
因为通过调用门转移时,是从低特权级转移到高特权级中,特权级3是最低的,不可能从更低的特权级转移到特权级3中,所以TSS中也就不需要存储特权级3的栈段选择子和栈指针。

在用户程序中:

 

指令执行时,当前,目标例程位于内核的公共例程段,内核的公共例程段的描述符特权级,因此进入目标例程时需要对栈进行切换。

切换之前的栈是用户程序自己的栈。若转移之前需要通过栈传递参数则存在用户程序自己的栈中,此处并未使用栈传递参数,而是通过寄存器传递参数。
在这里插入图片描述
1、一旦处理器发现要对栈进行切换,而且目标代码段的特权级是0;
2、就立即到当前任务的中,取出特权级0的栈段选择子、和栈指针;
3、并分别传送到栈寄存器、栈指针寄存器。
4、选择器的选择子发生改变,处理器立即到描述符表()中取出描述符;
5、取出后传送到描述符高速缓存器中,至此新的栈段就可以使用了。
在这里插入图片描述
切换到新栈之后,处理器立即压入旧栈的和,这样做是为了将来从调用门返回时,可以返回到用户程序原来的栈中。其中段选择子是16位的,压入时用0扩展至32位。接着处理器从旧栈中将传递的参数(在调用门的描述符中记录了参数的数量)传递到新栈中。在这个程序中使用寄存器传递参数,所以这里的参数部分是没有的。

复制完参数之后,处理器再将控制转移前的和压栈,这样做是为了能够返回到原来的程序,也就是调用者那里。

栈切换过程是由处理器自动进行的,现在处理器就可以执行目标例程了。

当例程返回时:
在这里插入图片描述
从被调用程序的栈中返回,如此一来就可以返回到原来的调用者哪里执行原来的程序,并切换会原来的旧栈。

栈的切换是由处理器固件自动进行的,当前栈是由和的当前内容指示的,要切换到的新栈位于当前任务的中,处理器知道如何找到它。在栈切换前处理器与要检查新栈是否有足够的空间完成本次控制转移。

控制转移和栈切换的过程如下:
在这里插入图片描述
如果通过调用门的控制转移是使用指令发起的,则转移后不在返回,而且没有特权级的变化,也不需要切换栈;
相反如果通过调用门的控制转移是使用指令发起的,那么可以使用远转移指令返回到调用者。

返回时,处理器从栈中弹出调用者的和,不管是从相同的特权级返回还是从不同的特权级返回,为了安全处理器都会进行特权级检查,控制返回的全部过程如下:
在这里插入图片描述
特权级检查不是在实际访问时进行的,而是在将选择子带入段寄存器时进行的,因此当控制从低特权级的程序通过调用门进入高特权级的程序之后,加入高特权级的程序使用指令将一个高特权级的数据段选择子带入时,如果能够通过特权级检查是没有问题的。

在返回低特权级的程序之后,低特权级的程序依然能够使用指令来访问高特权级的数据段,儿不会进行特权级检查,这是很危险的。为了解决这个问题在执行指令时,处理器要检查数据段寄存器,根据他们找到相应的段描述符,要是有任意一个段描述符的DPL高于调用者的特权级也就是返回后的新CPL,那么处理器将会把数值0传送到该段寄存器(0是一个特殊的段选择子,处理器允许带入而且不会引发异常),但是后续使用这样的段寄存器访问内存一定会引发处理器异常中断。
在这里插入图片描述
中的等是静态的,除非软件修改它们,处理是不会修改它们的。当处理器通过调用门进入的代码段时,处理器会使用和切换到的栈段,在此之后栈指针可能会因为压栈出栈而改变,但是返回时并不会更新到中的,下次通过调用门进入的代码段时,用的依然是静态的的值。

上一节介绍了通过调用门转移控制和返回的全过程,据此知道必须要创建,并登记在当前任务的任务状态段中,对于每一个栈包括栈的线性基地址、栈段选择子、初始栈指针。先把这些信息保存到TCB最后再来填写TSS。

在程序中,处理完SALT之后,从栈中取得TCB的线性基地址,之后就可以创建特权级0、1、2的栈段了:

 

创建之后任务控制块的结构如下:
在这里插入图片描述
创建完之后,先创建描述符,并将其安装在中,之后创建任务状态段:

 

之后从TCB中取出3个特权级栈的选择子以及初始栈指针,并填写到中:

 

之后就是创建描述符,并在中等级描述符:

 

之后就是指令返回到调用者。

接上一节,返回到内核的调用者之后,加载任务寄存器以及局部描述符表寄存器:

 

这两条指令执行之后表明当前正在一个任务中执行。现在是在任务的全局部分执行,并且应该转移到任务的私有部分(用户程序)执行。

在用户程序中每个段的描述符特权级,以前使用指令完成转移,但是当前程序特权级CPL=0,从高特权级使用或指令转移到低特权级是不允许的。

通过模拟从调用门返会已进入低特权级的用户程序中执行,在栈中压入以下部分:
在这里插入图片描述
代码如下:

 

在这里插入图片描述
之后进入用户程序执行,执行完之后返回;

 

在这里插入图片描述
但是执行时,,条件不成立,不能使用指令返回,这里改成即可,不过指令会在栈中压入返回地址。不过在用户程序终止后,其占用的资源都会被收回,包括栈段,这种情况下,压入数据和不压入数据是一样的。

Virtual Box运行:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Bochs虚拟机
在这里插入图片描述

到此这篇文件权限755对文件所有者意味着(文件权限755对文件拥有者而言何义)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • Ubuntu镜像站同步(ubuntu系统镜像工具)2025-02-11 21:54:04
  • 游戏拆包是什么意思(游戏拆包对游戏有什么影响)2025-02-11 21:54:04
  • 二维码登录(steam怎么扫描二维码登录)2025-02-11 21:54:04
  • 换国内驾照流程(更换国内驾照)2025-02-11 21:54:04
  • 拆包机厂家(拆包机操作规程)2025-02-11 21:54:04
  • 锁表的原因(导致锁表的原因)2025-02-11 21:54:04
  • 十大最强法则玄幻小说(玄幻小说中最强法则)2025-02-11 21:54:04
  • 颜色编码转换器(颜色编号转换)2025-02-11 21:54:04
  • ip1180打印机清零方法(1118打印机清零)2025-02-11 21:54:04
  • latex文字换行对齐(latex文本换行对齐)2025-02-11 21:54:04
  • 全屏图片