计算机系统——程序的机器级表示

  • 程序的机器级表示
  • 程序编码
    • 机器级代码
    • 关于格式的注解
  • 数据格式
  • 访问信息
    • 操作数指示符
    • 数据传送指令
    • 压入和弹出栈数据
  • 算术和逻辑操作
    • 加载有效地址
    • 一元和二元操作
    • 移位操作
    • 特殊的算术操作符
  • 控制
    • 条件码
    • 访问条件码
    • 跳转指令
    • 跳转指令的编码
    • 用条件控制来实现条件分支
    • 用条件传送来实现条件分支
    • 循环
    • switch 语句
  • 过程
    • 运行时栈
    • 转移控制
    • 数据传送
    • 栈上的局部存储
    • 寄存器中的局部存储空间
    • 递归过程
  • 数组分配和访问
    • 基本原则
    • 指针运算
    • 嵌套的数组
    • 定长数组
    • 变长数组
  • 异质的数据结构
    • 结构
    • 联合
    • 数据对齐
  • 在机器级程序中将控制与数据结合起来
    • 理解指针
    • 应用:使用GDB调试器
    • 内存越界引用和缓冲区溢出
    • 对抗缓冲区溢出攻击
      • 栈随机化
      • 栈破坏检测
      • 限制可执行代码区域
    • 支持变长栈帧
  • 浮点代码
    • 浮点传送和转换操作
    • 过程中的浮点代码
    • 浮点运算操作
    • 定义和使用浮点常数
    • 在浮点代码中使用位级操作
    • 浮点比较操作
    • 对浮点代码的观察结论

程序的机器级表示

表述基于 x86-64 ,它是现在笔记本电脑和台式机中最常见处理器的机器语言,也是驱动大型数据中心和超级计算机的最常见处理器的机器语言。

程序编码

gcc 命令调用一整套的程序,将源代码转化成可执行代码。

机器级代码

计算机系统使用了多种不同形式的抽象, 利用更简单的抽象模型来隐藏实现的细节。
两种抽象尤为重要:

  • 第一种是由指令集体 系结 构或指令 集架构 O ns t ruet ion Set Arehiteeture, IS A)
    来定义机器级程序的格式和行为,它定义了处理器状态、指令的格式,以及每条指令对状态的影响。
  • 第二种抽象是 , 机器级程序使用的内存地址是虚拟地址,提供的内存模型看上去是一个非常大的字节数组。

x86-64 的机器代码 和原始的 C 代码差别非常大。一些通常对 C 语言程序员隐藏的处理器状态都是可见的:

 - 程序计数器(通常称为 " PC" , 在 x86-64 中用%rip 表示)给出将要执行的下一条指令在内存中的地址。- 整数寄存器文件包含 16 个命名的位置, 分别存储 64 位的值。- 条件码寄存器保存着最近执行的算术或逻辑指令的状态信息。- 一组向量寄存器可以存放一个或多个整数或浮点数值。

程序内存包含:程序的可执行机器代码,操作系统需要的一些信息,用来管理过程调用和返回的运行时栈,以及用户分 配的内存块(比如说用 ma l l o c 库函数分配的)。

关于格式的注解

使用gcc编译文件生成 .s 的汇编文件。
命令格式如下,例:

linux> gee -Og -S mstore.e

汇编代码中以’.'开头的行是指导汇编器,链接器工作的伪指令。

带解释的汇编代码如下:
在这里插入图片描述

通常我们只会给出与讨论内容相关的代码行。
每一行的左边都有编号供引用,
右边是注释,简单地描述指令的效果以及它与原始 C 语言代码中的计算操作的关系。

数据格式

Intel 用术语 ” 字( word )" 表示 16 位数据类型。
称 32 位数为“ 双字( double words)",
称 64 位数为“ 四字( quad words )"。

x86-64 指令集同样包括完整的针对字节、字和双字的指令。
在这里插入图片描述

浮点数主要有两种形式 :单精度( 4 字节)值, 对应于 C 语言数据类型 float ; 双精度(8 字节)值, 对应于 C 语言数据类型 double。

大多数 GCC 生成的汇编代码指令都有一个字符的后缀, 表明操作数的大小。

访问信息

一个 x86-64 的中央处理单元( CPU ) 包含一组 16 个存储 64 位值的通用目 的寄存器。
这些寄存器用来存储 整数数据和指针。

在这里插入图片描述

指令可以对这 16 个寄存器的低位字节中存放的不同大小的数据进行操作。
字节级操作可以访问最低的字节, 
16 位操作可以访问最低的 2 个字节,
32 位操作可以访问最低的 4 个字节,
而 64 位操作可以访问整个寄存器。

操作数指示符

大多数指令有 一个或多个操作数( operand ) , 指示出执行一个操作中要使用的源数据值,以及放置结果的目的位置。

各种不同的操作数的可能性被分为三种类型。

第一种类型是立即数( immediate )  , 用来表示常数值。
第二种类型是寄存器 ( register )  , 它表示某个寄存器的 内容,16 个寄存器的低位 1 字节、2 字节、4 字节或 8 字节中的一个作为操作数, 这些字节数分别对应于 8 位、16 位、32 位或 64 位。
第三类操作数是内存引用,它会根据计算出来的地址(通常称为有效地址)访问某个内存位置 。

在这里插入图片描述

数据传送指令

最简单形式的数据传送指令-—— MOV 类。

这些指令把数据从源位 置复制到目的位置,不做任何变化。
这些指令都 执行同样的操作; 主要区别在于它们操作的数据大小不同;
movb 、 movw、 movl   和movq   分别是 1 、2、 4 和 8 字节。

在这里插入图片描述
下面的 MOV 指令示例给出了源和目的类型的五种可能的组合。
记住, 第一个是源操作数,第二个是目的操作数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

压入和弹出栈数据

栈是一种数据结构,可以添加或者删除值,不过要遵循 ” 后进先出" 的原则。通过 push 操作把数据压入栈中 , 通过 pop 操作删除数据;
它具有一个属性: 弹出的值永远是最近被压入而且仍然在栈中的值。栈可以实现为一个数组,总是从数组的一端插入和删除元素。这一端被称为栈顶。

在这里插入图片描述

pushq 指令的功能是 把数据压入到栈上,
而 popq 指令是弹出数据。
这些指令都只有一个操作数 一一压入的数据源和弹出的 数据目的。

将一个四字值压入栈中,首先要将栈指针减 8 , 然后将值写到新的栈顶地址。
因此,指令 pushq %rbp 的行为等价于下面两条指令:

subq  $8,%rsp 				Decrement stack pointer 
movq %rbp, (%rsp)           Store %rbp on stack

弹出一个四字的操作包括从栈顶位置读出数据, 然后将栈指针加 8。因此,指令 popq%rax 等价于下面两条指令 :

movq (%rsp),%rax          Read 7.rax from stack
addq $8,%rsp              Increment stack pointer

算术和逻辑操作

在这里插入图片描述

加载有效地址

加载有效地 址(load effective address ) 指令 leaq 实际上是 movq 指令的变形。

它的指令形式是从内存读数据到寄存器,但实际上它根本就没有引用内存。
它的第一个操作数看上去是一个内存引用,
但该指令并不是从指定的位置读入数据,而是将有效地址写人到目的操作数。

一元和二元操作

一元操作,只有一个操作数,既是源又是目的。
这个操作数可以是一个寄存器, 也可以是一个内存位置。

二元操作, 其中, 第二个操作数既是源又是目的 。
注意,源操作数是第一个,目的操作数是第二个。

移位操作

移位操作,先给出移位量,然后第二项给出的是要移位的数。
可以进行算术和逻辑右移。
移位量可以 是一个立即数, 或者放在单字节寄存器%c1 中。(这些指令很特别, 因为只允 许以这个特定的寄存器作 为操作 数。)
原则上来说, 1 个字节的移位量使得移位量的编码范围 可以达到 2^8 - 1 = 255 。

特殊的算术操作符

在这里插入图片描述

控制

机器代码 提供两种基本的 低级机制来实现有条件的行为:测试数据值,然后根据测试的结果来改变控制流或者数据流。

与数据相关的控制流是实现有条件行为的更一般和更常见的方法。

条件码

除了整数寄存 器, CPU 还维护着一组单个位的条件码( condition code ) 寄存器, 它们描述了最近的算术或逻辑操作的属性。

最常用的条件码有:

CF: 进位标志。最近的操作使最高位产生了进位。可用来检查无符号操作的溢出 。
ZF: 零标志。最近的操作得出的结果为 0 。
SF: 符号标志。最近的操作得到的结果为负数。
OF: 溢出标志。最近的操作导致一个补码溢出	正溢出或负溢出。

在这里插入图片描述

访问条件码

条件码通常不会直接读取,常用的使用方法有三种:

 1) 可以根据条件码的某种组合, 将一个字节设 置为 0 或者 1 ,2) 可以条件跳转到程序的某个其他的部分,3) 可以有条件地传送数据。

在这里插入图片描述
某些底层 的机器指令可能有多个名字, 我们称之为“同义名( synonym ) " 。

跳转指令

跳转( jump ) 指令会导致执行切换到程序中一个全新的位置。
在汇编代码中,这些跳转的目的地通常用一个标号(label) 指明。

在这里插入图片描述
表中所示的其 他跳转指令都是有条件的它们根据条件码的某种组合,或者跳转, 或者继续执行代码序列中下一条指令。
这些指令的名字和跳转条件与 SET 指令的名字和设置条件是 相匹配的(参见图 3-1 4 ) 。
同 SET 指令一样 , 一些底层的机器指令有多个名字。条件跳转只能是直接跳转。

跳转指令的编码

在汇编代码中,跳转目标用符号标号书写。汇编器,以及后来的链接器,会产生跳转目标的适当编码。
跳转指令有几种不同的编码, 但是最常用都是 PC 相对的 ( PC- relative ) 。
也就是, 它们会将目标指令的地址与紧跟在跳转指令后面那条指令的地址之间的差作为编码。
这些地址偏移量可以编码为 1 、2 或 4 个字节。第二种编码方法是 给出“绝对“地址,用 4 个字节直接指定 目标。
汇编器和链接器会选择适当的跳转目的编码。

用条件控制来实现条件分支

将条件表达式 和语句从 C 语言翻译成机器代码 , 最常用的方式是结合有条件和无条件跳转。

在这里插入图片描述

用条件传送来实现条件分支

实现条件操作的传统方法是通过使用 控制的条件转移。当条件满足时,程序沿着一条执行路 径执行, 而当条件不满足时 , 就走另一条路径。

一种替代的策略是使用数据的条件转移。
这种方法计算一个条件操作的两种结果 , 然后再根据条件是否满足从中选取一个。
只有在一些受限制的情况中,这种策略才可行,但是如果可行,就可以用一条简单的条件传送指令来实现它,条件传送指令更符合现代处理器的性能特性 。

在这里插入图片描述
处理器通过使用 流水线 ( pipelining) 来获得高性能 , 在流水线中 , 一条指令的处理要经过一系列的阶段,每个阶段执行所需操作的一小部分(例如,从内存取指令、确定指令类型、从内存读数 据、执行算术运算、向内存写数据, 以及更新程序计数器)。
这种方法通过重叠连续指令的步骤来获得高性能, 例如, 在取一条指令的同时, 执行它前面一条指令的算术运算。要做到这一点,要求能够事先确定要执行的指令序列,这样才能保持流水线中 充满了待执行的指令当机器遇到条件跳转(也称为“分 支")时, 只有当分支条件求值完成之后,才能决定分支往哪边走。
处理器采用非常精密的分支预测逻辑来猜测每条跳转指令是否会执行只要它的猜测还比较可靠(现代微处理器设计试图达到 90 %以上的成功率), 指令流水线中就会充满着指令。
另一方面, 错误预测一个跳转, 要求处理器丢掉它为该跳转指令后所有指令己做的工作,然后再开始用从正确位置处起始的指令去填充流水线 。

在这里插入图片描述

循环

C 语言提供了多种循环结构, 即 do-while 、 while 和 for 。
汇编中没有相应的指令存在, 可以用条件测试和跳转组合起来实现循环的效果。

do-while 循环

do-while 语句的通用形式如下:dobody-statement while (test-expr);这个循环 的效果就是重复执行 body-statement , 对 test-expr 求值, 如果求值的结果为非零, 就继续循环。翻译成如下所示的条 件和 go t o 语句:loop:body-statementt = test-expr;if (t)goto loop;

在这里插入图片描述

while 循环

while 语句的通用形式如下:while (test-expr) body-statement与 do-while 的不同之处在于,在第一次执行 body-statement 之前, 它会对 test-expr 求值, 循环有可能就中止了。

将 while 循环翻译成机器代码的方法:

第一种翻译方法,我们称之为 跳转到中间 ( jump to middle), 它执行一个无条件跳转跳到循环结尾处的测试, 以此来执行初始的测试。
把通用的 while 循环格式翻译 到 goto 代码:goto test; loop:body-statement test:t = test-expr;if (t)goto loop;第二种翻译方法,我们称之为 guarded-do , 首先用条件分支,如果初始条件不成立就跳过循环, 把代码变换为 do-while 循 环 。
用如下模板来表达这种方法, 把通用的 while 循环格式翻译成 do-while 循环:t = test-expr;if	(!t)goto done;dobody-statement while (test-expr) ;done:
相应地, 还可以 把它翻译成 goto 代码如下:t = test-expr;if	(! t)goto done; loop:body-statementt = test-expr;if	(t)goto loop;done:

for 循环

for 循环的通用形式如下 :for (init-expr;  test-expr;  update-expr)
body-statement

这样一个循环的行为与下面这段使 用 wh il e 循环的代码的行为一样:

init-expr;
while (test-expr) 
{ body-statement update-exp;

跳转到中间策略会得到如下 go to 代码:

	init-expr; goto test;
loop:body-statement update-expr;
test:t=test-expr; if (t)goto loop;

而 guarded-do 策略得到 :

	init-expr;t = test-expr; if(!t)goto done;
loop :body-statement update-expr;t = test-expr;if (t)goto loop;
done:

switch 语句

switch ( 开关)语句可以根据一个整数索引值进行多重分支( multiway branching ) 。
通过使用跳转表( jump table ) 这种数据结构使得实现更加高效。

在这里插入图片描述

过程

过程是软件中一种很重要的抽象。

它提供了一种封装代码的方式,用一组指定的参数和一个可选的返回值实现了某种功能。

设计良好的软件用过程作为抽象机制,隐藏某个行为的具体实现,同时又提供清晰简洁的接口定义,说明要计算的是哪些值,过程会对程序状态产生什么样的影响。

过程的形式多样:
函数( function) 、方法( method) 、子例程( sub ro utine) 、处理函数( handler) 等等。

为了讨论方便,假设过程p 调用过程 Q , Q 执行后返回到 P。

这些动作包括下面一个或多个机制:
传递控制。
传递数据。
分配和释放内存。

运行时栈

程序可以用栈来管理它的过程所需要的存储空间,栈和程序寄存器存放着传递控制和数据、分配内存所需要的信息。

在这里插入图片描述

转移控制

在这里插入图片描述

这些指令在程序OBJDUMP 产生的反汇编输出中被称为 callq 和 retq 。添加的后缀' q ' 只是为了强调这些是 x86- 64 版本的调用和返回, 而不是 IA 32 的。
在 x86-64 汇编代码中, 这两种版本可以互换。

call 指令有一个目标,即指明被调用过程起始的指令地址。

数据传送

当调用一个过程时,除了要把控制传递给它并在过程返回时再传递回来之外,过程调用还可能包括把数据作为参数传递, 而从过程返回还有可能包括返回一个值。

x86-64中,大部分过程间的数据传送是通过寄存器实现的。

寄存器的使用是有特殊顺序的,寄存器使用的名字取决于要递的数据类型的大小。
在这里插入图片描述

栈上的局部存储

有些时候,局部数据必须存放在内存中,常见的情况包括:
- 寄存器不足够存放所有的本地数据。
- 对一个局部变蜇使用 地址运算符'&' ,因此必须能够为它产生一个地址。
- 某些局部变量是数组或结构,因此必须能够通过数组或结构引用被访问到。

寄存器中的局部存储空间

寄存器组是唯一被所有过程共享的资源。

虽然在给定时刻只有一个过程是活动的,我们仍然必须确保当一个过程(调用者)调用另一个过程(被调用者)时,被调用者不会覆盖调用者稍后会使用的寄存器值。

根据惯例, 寄存器%rbx 、%rbp 和 %r12~ %r15 被划分为被调用者保存寄存器。

所有其他的寄存器,除了栈指针%rsp , 都分类为调用者保存寄存器。这就意味着任何函数都能修改它们。

递归过程

递归调用一个函数本身与调用其他函数是一样的。
栈规则提供了一种机制,每次函数调用都有它自己私有的状态信息(保存的返回位置和被调用者保存寄存器的值)存储空间。

如果需要,它还可以提供局部变量的存储。栈分配和释放的规则很自然地就与函数调用-返回的顺序匹配。
这种实现函数调用和返回的方法甚至对更复杂的 情况也适用 ,包括相互递归调用(例如, 过程 P 词用 Q , Q 再调用 p ) 。

在这里插入图片描述

数组分配和访问

C语言中的数组是一种将标量数据聚集成更大数据类型的方式。

C 语言的一个不同寻常的特点是可以产生指向数组中元素的指针,并对这些指针进行运算。
在机器代码中,这些指针会被翻译成地址计算。

基本原则

对于数据类型 T 和整型常数 N , 声明如下:

T A[N];

起始位置表示为环。这个声明有两个效果。
首先 , 它在内存中分配一个 L • N 字节的连续
区域, 这里 L 是数据类型 T 的大小(单位为字节)。
其次 , 它引入了标识符 A , 可以用 A 来作为指向数组开头的指针, 这个指针的值就是环。

x86-64 的内存引用指令可以用来简化数组访问。

指针运算

C 语言允许对指针进行运算 , 而计算出 来的值会根据该指针引用的数据类型的大小进行伸缩。
也就是说, 如果 p 是一个指向类型为 T 的数据的指针, p 的值为xpx_pxp, 那么表达式p+ip+ ip+i 的值为 xp+L•ix_p+ L • ixp+Li, 这里 L 是数据类型 T 的大小。

单操作数操作符’&'和 ‘ * ’可以产生指针和间接引用指针。也就是,对于一个表示某个对象的 表达式 Expr , &Expr 是给出该对象地址的一个指针。

对于一个表示地址的表达式 AExpr , *AExpr 给出该地址处的值。因此,表达式 Expr 与 * &Expr 是等价的。

嵌套的数组

当我们创建数组的数组时 ,数组分配和引用的一般原则也是成立的。

例如,声明int	A[5][3] ;等价于下面的声明typedef int row3_t[3]; row3_t A[5];

数据类型row3 _t 被定义为一个3个整数的数组。数组A包含 5 个这样的元素, 每个元素需要 12 个字节来存储 3个整数 。整个数组 的大小就是 4X5X3 = 60 字节。

要访问多维数组的元素,编译器会以数组起始为基地址,(可能需要经过伸缩的)偏移量为索引 , 产生计算期望的元素的偏移量, 然后使用某种 MOY 指令。
通常来说,对于一个声明如下的数组:

T D[R][C];

它的数组元素 D [i] [j]的内存地址为
& D[i] [j] = xDx_DxD + L( C • i + j)
这里, L 是数据类型 T 以字节为单位的大小。

定长数组

C 语言编译器能够优化定长多维数组上的操作代码。

当程序要用一个常数作为数组的维度或者缓冲区的大小时,最好通过 #define 声明将这个常数与一个名字联系起来, 然后在后面一直使用这个名字代替常数的数值。这样一来,如果需要修改这个值,只用简单地修改这个 #define 声明就可以了。

在这里插入图片描述

变长数组

在变长数组的 C 版本中 , 我们可以将一个数组声明如下 :

int	A[expr1][expr2]

它可以作为一个局部变量,也可以作为一个函数的参数,然后在遇到这个声明的时候,通过对表达式 expr1和 expr2 求值来确定数组的维度。
因此,例如要访问 n X n 数组的元素i,j,我们可以写一个如下的函数:

int	var_ele(long n, int  A[n] [n],  long  i,  long  j)  
{ return A[i][j];
}

参数 n 必须在参数 A[n][n] 之前, 这样函数就可以在遇到这个数组的时候计算出数组的维度。
在这里插入图片描述

异质的数据结构

C语言提供了两种将不同类型的对象组合到一起创建数据类型的机制:

结构( struc­ture) , 用关键字struc­t来声明, 将多个对象集合到一个单位中;
联合( union ) , 用关键字union来声明 ,允许用几种不同的类型来引用一个对象。

结构

C语言的struct声明创建一个数据类型, 将可能不同类型的对象聚合到一个对象中。用名字来引用结构的各个组成部分。

结构的所有组成部分都存放在内存中一段连续 的区域内,而指向结构的指针就是结构第一个字节的地址。

结构的各个字段的选取完全是在编译时处理的。机器代码不包含关于字段声明或字段名字的信息。

联合

联合提供了一种方式,能够规避C语言的类型系统,允许以多种类型来引用一个对象。
联合声明的语法与结构的语法一样,只不过语义相差比较大。它们是用不同的字段来引用相同的内存块。

在一些下上文中,联合十分有用。但是,它也能引 起一些讨厌的错误,因为它们绕过了C语言类型 系统提供的安全措施。一种应用情况是,我们事先知道对一个数据结构中的两个不同字段的使用是互斥的,那么将这两个字段声明为联合的一部分, 而不是结构的一部分 ,会减小分配空间的总量 。

联合还可以用来访问不同数据类型的位模式 。

数据对齐

许多计算机系统对基本数据类型的合法地址做出了一些限制,要求某种类型对象的地址必须是某个值 K ( 通常是 2、 4 或 8 ) 的倍数。
这种对齐限制简化了形成处理器和内存系统之间接口的硬件设计。

对齐数据以提高内存系统的性能。
对齐原则是任何K字节的基本对象的地址必须是 K 的倍数。
在这里插入图片描述
确保每种数据类型都是按照指定方式来组织和分配,即每种类型的对象都满足它的对齐限制,就可保证实施对齐。

编译 器在汇编代码中放入命令,指明全局数据所需的对齐。

对于包含结构的代码,编译器可能需要在字段的分配中插入间隙,以保证每个结构元素都满足它的对齐要求。

在机器级程序中将控制与数据结合起来

理解指针

指针是C语言的一个核心特色。它们以一种统一方式,对不同数据结构中的元素产生引用。

指针和它们映射到机器代码的关键原则。每个指针都对应一个类型。
这个类型表明该指针指向的是哪一类对象。每个指针都有一个值。
这个值是某个指定类型的对象的地址。特殊的 NULL ( O) 值表示该指针没有指向任何地方。指针用 ‘&’运算符创建。
这个运算符可以应用到任何 lvalue 类的 C 表达式上, lvalue 意指可以出现在赋值语句左边的表达式。* 操作符用于间接引用指针。
其结果是一个值,它的类型与该指针的类型一致。
间接引用是用内存引用来实现的,要么是存储到一个指定的地址,要么是从指定的地址读取。数组与指针紧密联系。一个数组的名字可以 像一个指针变最一样引用(但是不能修改)。将指针从一种类型强制转换成另一种类型,只改变它的类型,而不改变它的值。
强制类型转换的 一个效果是改 变指针运算的伸缩。指针也可以指向函数。
这提供了一个很强大的存储和向代码传递引用的功能,这些引用可以被程序的某个其他部分调用	。

应用:使用GDB调试器

GDB 提供了许多有用的特性,支持机器级程序的运行时评估和分析。

用下面的命令行来启动 GDB:

linux> gdb prog通常的方法是在程序中感兴趣的地方附近设置断点。断点可以设置在函数入口后面,或是 一个程序的地址处。程序在执行过程中遇到一个 断点时,程序会停下来, 并将控制返回给用户。在断点处,我们能够以各种方式查看各个寄存器和内存位置。我们也可以单步跟踪程序,一次只执行几条指令,或是前进到下一 个断点。

在这里插入图片描述
在这里插入图片描述

内存越界引用和缓冲区溢出

一种特别常见的状态破坏称为缓冲区溢出 ( buffer overflow ) 。
通常, 在栈中分配某个字符 数组来保存一个字符串 , 但是字符串的长度超出了为数组分配的空间。

缓冲区溢出的一个更加致命的使用就是让程序执行它本来不愿意执行的函数。这是一种最常见的通过计算机网络攻击系统安全的方法。

通常,输入给程序一个字符串,这个字符串包含一些可执行代码的字节编码,称为攻击代码 ( exploit code), 另外,还有一些字节会用一个指向攻击代码的指针覆盖返回地址。

在一种攻击形式中,攻击代码会使用系统调用启动一个 shell 程序, 给攻击者提供一组操作系统函数。在另一种攻击形式中,攻击代码会执行一些未授权的任务,修复对栈的破坏,然后第二次执行ret 指令,(表面上)正常返回到调用者。

在这里插入图片描述

对抗缓冲区溢出攻击

栈随机化

为了在系统中插入攻击代码,攻击者既要插入代码,也要插入指向这段代码的指针,这个指针也是攻击字符串的 一部分。

栈随机化的思想使得栈的位置在程序每次运行时都有变化。

在Linux 系统中,栈随机化已经变成了标准行为。它是更大的一类技术中的一种,这类技术称为地址空间布局随机化( Address -Space Layout Randomization), 或者简 称 ASLR [ 99] 。

栈破坏检测

计算机的第二道防线是能够检测到何时栈已经被破坏。

最近的 GCC 版本在产生的代码中加入了 一种栈保 护者( stack protector ) 机制,来检测缓冲区越界。其思想是在栈帧中任何局部缓冲区与栈状态之间存储一个特殊的金丝雀 ( canary ) 值。
这个金丝雀值, 也称为哨兵值的栈帧(guard value), 是在程序每次运行时随机产生的,因此,攻击者没有简单的办法能够知道它是什么。

栈保护很好地防止了缓冲区溢出攻击破坏存储在程序栈上的状态。

限制可执行代码区域

最后一招是消除攻击者向系统中插入可执行代码的能力。

一种方法是限制哪些内存区域能够存放可执行代码。

许多系统允许控制三种访问形式:
读(从内存读数据)、写(存储数据到内存)和执行(将内存的内容看作机器级代码)。

栈必须是既可读又可写的,因而栈上的字节也都是可执行的。

支持变长栈帧

检查了各种函数的机器级代码,但它们有一个共同点,即编译器能够预先确定需要为栈帧分配多少空间。
有些函数,需要的局部存储是变长的。

为了管理变长栈帧 ,x86-64 代码使用寄存器%rbp 作为帧指针( frame pointer)(有时称为基指针( base pointer) , 这也是%rbp 中 bp 两个字母的由来)。

浮点代码

处理器的浮点体系结构包括多个方面,会影响对浮点数据操作的程序如何被映射到机器上,包括:

- 如何存储和访问浮点数值。通常是通过某种寄存器方式来完成。
- 对浮点数据操作的指令。
- 向函数传递浮点数参数和从函数返回浮点数结果的规则。
- 函数调用过程中保存寄存器的规则——例如,一些寄存器被指定为调用者保存,而其他的被指定为被调用者保存。

浮点传送和转换操作

引用内存的指令是标量指令,意味着它们只对单个而不是一组封装好的数据值进行操作。

GCC 只用标量传送操作从内存传送数据到 XMM 寄存器或从 XMM 寄存器传送数据到内存。

对于在两个 XMM 寄存器之间传送数据,GCC 会使用两种指令之一,即用 vmovaps 传送单精度数,用 vmovapd 传送双精度数。

在这里插入图片描述

过程中的浮点代码

在 x86-64 中, XMM 寄存器用来向函数传递浮点参数,以及从函数返回浮点值。

规则:- XMM 寄存器%xmm0 ~ %xmm7 最多可以传递 8 个浮点参数。按照参数列出的顺序使用这些寄存器。可以通过栈传递额外的浮点参数。
- 函数使用 寄存器 %xmm0 来返回浮点值。
- 所有的 XMM 寄存器都是调用者保存的。被调用者可以不用保存就覆盖这些 寄存器中任意一个。

当函数包含指针、整数和浮点数混合的参数时,指针和整数通过通用寄存器传递,而浮点值通过 XMM 寄存器传递。也就是说,参数到寄存器的映射取决于它们的类型和排列的顺序。

浮点运算操作

在这里插入图片描述

描述了一组执行算术运算的标量 AVX2 浮点指令。
每条指令有一个( S1S_1S1) 或两个(S1S_1S1 , S2S_2S2 ) 源操作 数, 和一个目的操作数 D。
第一个源操作 数 S1S_1S1 可以是一个 XMM 寄存器或一个内存位置。
第 二个源操作数 和目的操作数都必须是 XMM 寄存器。
每个操作都有一条针对单精度的指令和一条针对双精度的指令。结果存放在目的寄存器中。

定义和使用浮点常数

和整数运算操作不同 , AVX 浮点操作不能以立即数值作为操作数。相反,编译器必须为所有的常量值分配和初 始化存储空间。然后代码在把这些值从内存读入。

在浮点代码中使用位级操作

GCC 生成的代码会在 XMM 寄存器上执行位级操作,得到有用的浮点结果。

在这里插入图片描述
上图展示了一些相关的指令, 类似于它们在通用寄存器上对应的操作。
这些操作都作用于封装好的 数据, 即它们更新整个目的 XMM 寄存器, 对两个源寄存器的所有位都实施指定的位级操作。

浮点比较操作

在这里插入图片描述
这些指令类似于CMP 指令,它们都比较操作数 S1 和 S2 (但是顺序可能与预计的相反), 并且设置条件码指示它们的相对值。
与 cmpq 一样,它们遵循以相反顺序列出操 作数的 ATT 格式惯例。
参数 S2 必 须在 XMM 寄存器中, 而 S1 可以在 XMM 寄存器中,也可以在内存中。

浮点比较指令会设置三个条件码: 零标志位 ZF 、 进位标志位 CF 和奇偶标志位 PF。

在这里插入图片描述

对浮点代码的观察结论

用 AVX2 为浮点数上的操作产生的机器代码风格类似于为整数上的操作产生的代码风格。
它们都使用一组寄存器来保存和操作数据值,也都使用这些寄存器来传递函数参数。

AVX2 代码包括许多比只执行整数运算的函数更加不同的指令和格式。

AVX2 还有能力在封装好的 数据上执行并行操作,使计算执行得更快。

学习参考资料:

《深入理解计算机系统》  第3版
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Redis作为单线程 为什么我用它还是出现了超卖的情况?

    实战说明 最近在一个项目营销活动中,一位同事用到了Redis来实现商品的库存管理。在压测的过程中,发现存在超卖的情况。这里总结一篇如何正确使用Redis来解决秒杀场景下,超卖的情况。 演示步骤 这里不会直接给大家说明,该怎么去…...

    2024/4/30 10:47:45
  2. 线程的生命周期

    操作系统中线程的生命周期 JDK中用Thread.State类定义了线程的几种状态 要想实现多线程,必须在主线程中创建新的线程对象。Java语言使用Thread类及其子类的对象来表示线程,在它的一个完整的生命周期中通常要经历如下的五种状态: >新建&a…...

    2024/5/8 8:44:44
  3. nginx模块介绍

    使用configure命令配置构建。它定义了系统的各个方面,包括允许nginx用于连接处理的方法。最后,它会创建一个Makefile。 该configure命令支持以下参数: –help 打印帮助信息。–prefixpath 定义将保留服务器文件的目录。此相同目录还将用于设…...

    2024/4/21 17:41:50
  4. 2021ccpc网络赛重赛

    05 Monopoly题意:有n个点,每个点有一个分数。兔子从0开始一个点一个点的往前跳,跳到这个点就会拿到这个点的分数,跳到n点下一步会跳回1然后继续跳。给定目标分数,问兔子最少要跳几次才能达到这个目标分数。 先求前缀和…...

    2024/5/7 16:23:00
  5. 硬件基础(一)

    硬件基础: 1、CPU CPU简介: 中央处理器。由控制器和运算器构成,是整个计算机系统中的重要组成部分 CPU性能指标 主频:*主频是CPU的时钟频率(CPU Clock Speed) 。一般说来,主频越高,CPU的速度越快。由于内部结构不…...

    2024/5/8 5:07:39
  6. C++ 模板(template)——深入了解类模板

    目录 1.类模板的使用 1.1为什么需要类模板 1.2类模板定义 1.3单个类模板的使用 2.继承中类模板的使用 2.1父类是一般类,子类是模板类 2.2子类是一般类,父类是模板类 2.3父类和子类都是模板类 1.类模板的使用 1.1为什么需要类模板 类模板与函数模板…...

    2024/5/7 22:32:00
  7. leetcode【简单】501、二叉搜索树中的众数

    思路: 正常来说,中序遍历得到非递减数组,然后求数组众数即可,但消耗额外空间; 已知遍历顺序肯定是非递减,如果有相同的数肯定连在一起,可以在遍历途中维护一个表示当前数字出现几次的count&…...

    2024/5/8 2:27:23
  8. 【算法题】动态规划-最长上升子序列模型

    前言 最长上升子序列模型(LIS)(LIS)(LIS)属于线性DP的一种,基础模板题讲解传送门:【模板题】线性DP(数字三角形、LIS、LCS、编辑距离),本文将通过一系列该模型的扩展题对其进行更加深入的分析。 一、AcWing 1017. 怪…...

    2024/4/25 1:36:04
  9. 概率统计概念复习:MAPMLE

    1 似然函数与概率函数 对于条件概率函数P(x∣θ): 如果θ是已知确定的,x是变量,这个函数叫做概率函数(probability function),它描述对于不同的样本点x,其出现概率是多少。如果x是已知确定的,θ 是变量&a…...

    2024/4/21 17:41:45
  10. MyBatis框架入门(三)

    目录 8.动态SQL 8.1 if标签 8.2 where标签 8.3 foreach标签 8.4 代码片段 9.MyBatis主配置文件 9.1 transactionManager标签 9.2 datasource标签 9.3 数据库属性配置文件 9.4 指定多个mapper文件 10.分页功能 10.1 PageHelper 8.动态SQL 动态SQL,通…...

    2024/4/23 14:51:50
  11. Vue自定义指令

    你需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令 局部注册 与data同级 directives: { // 指令的定义 focus(指令名) focus: { inserted(el){ el.focus() } } } 全局注册 // 全局指令 - …...

    2024/5/3 9:26:13
  12. docker安装

    docker 是通过 yum install docker安装的,搜了一把,原来是因为linux与docker版本的兼容性问题。那就卸载旧版本安装最新版试试。 0.通过uname -r命令查看你当前的内核版本 uname -r 1.使用 root 权限登录 Centos。确保 yum 包更新到最新。 sudo yum …...

    2024/4/24 23:04:38
  13. OpenCV学习笔记(一)(10.27)

    图像处理基本操作 cv2.imread(‘filename‘,[flags]) # filename记得打印号 # 返回值:用变量接收 # flags:-1保持格式不变 0灰度图像 1默认转化为BGR3通道 cv2.IMREAD_REDUCED_COLOR_2缩小为原来的1/2 # imread可读类型(略) cv…...

    2024/4/20 13:48:45
  14. K8S简介、架构组件、核心概念

    1.k8s简介 kubernetes,简称 K8s,是用 8 代替 8 个字符“ubernete”而成的缩写。k8s是一个开源 的,用于管理云平台中多个主机上的容器化的应用,k8s的目标是让部署容器化的 应用简单并且高效(powerful),k8s提…...

    2024/5/5 5:05:25
  15. Java数组五个典型使用

    使用数组 在声明并创建数组之后,在代码的任何地方都能通过数组名之后的方括号中的索引来访问其中的元素。数组一经创建,它的大小就是固定的。程序能够通过a.length获取数组a[ ]的长度,而它最后一个元素总是a[a.length-1]。Java会自动进行边界…...

    2024/4/20 13:48:42
  16. Linux静态IP无法固定解决方案

    目录1 解决方法1.1 第一步是禁用NetworkManager服务1.2 第二步重启network服务1.3 如果没有效果可以不受NetworkManager所控制1 解决方法 可以看到此时还是动态获取原因是network与NetworkManager服务冲突 1.1 第一步是禁用NetworkManager服务 # systemctl stop NetworkManag…...

    2024/5/3 3:57:42
  17. 大数据Hadoop集群运行程序

    目录1 运行自带的MapReduce程序2 常见错误1 运行自带的MapReduce程序 下面我们在Hadoop集群上运行一个MapReduce程序,以帮助读者对分布式计算有个基本印象。 在安装Hadoop时,系统给用户提供了一些MapReduce示例程序,其中有一个典型的用于计…...

    2024/5/4 3:13:09
  18. Spark3.0.0 环境安装

    1. Spark概述 1.1 什么是Spark Spark是一种基于内存的快速、通用、可扩展的大数据分析框架。 1.2 Hadoop和Spark Hadoop:一次性计算框架,基于磁盘,不适合迭代式计算。框架在处理数据的时候,会冲存储设备将数据读取出来&#xf…...

    2024/5/7 16:29:31
  19. Git的基本操作命令

    git clone sshLink 克隆代码 git branch 查看本地分支 git branch -a 查看远程分支 git branch -d branchName 删除本地分支 git branch -r -d origin/branchName 删除远程分支 git push origin :branchName 推送(这里有个空格&#xff0…...

    2024/4/29 11:36:55
  20. 浏览器点击量业务实现

    大体要实现的功能 文章访问量,每个ip每段时间只能访问一次 主要业务逻辑: 1.判断ip是否再redis缓存中如果有直接return 浏览量不增加,如果没有将ip添加到redis当中去并且设置过期时间这里有String类型因为我查了一下hash结构没有自带过期时间…...

    2024/5/3 20:57:36

最新文章

  1. effective python学习笔记_pythonic思维

    优缺点 书的好处是很多新特性提高了可读性代码性等各方面性能,缺点是新特性和py老版本不兼容,老版本可能没有这些新特性,如果用了py早期版本,需要考虑替代方案 查py版本 import sys sys.version sys.version_info 遵循PEP8 …...

    2024/5/8 9:28:23
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. 利用Spark将Kafka数据流写入HDFS

    利用Spark将Kafka数据流写入HDFS 在当今的大数据时代,实时数据处理和分析变得越来越重要。Apache Kafka作为一个分布式流处理平台,已经成为处理实时数据的事实标准。而Apache Spark则是一个强大的大数据处理框架,它提供了对数据进行复杂处理…...

    2024/5/8 2:37:23
  4. 校园局域网钓鱼实例

    Hello ! 我是"我是小恒不会java" 本文仅作为针对普通同学眼中的网络安全,设计的钓鱼案例也是怎么简陋怎么来 注:本文不会外传代码,后端已停止使用,仅作为学习使用 基本原理 内网主机扫描DNS劫持前端模拟后端…...

    2024/5/7 15:49:49
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/8 6:01:22
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/7 9:45:25
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/7 14:25:14
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/7 11:36:39
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/7 9:26:26
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/6 21:42:42
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57