C语言 这个将五个控制寄存器的位设置为1的汇编代码会损坏我的处理器吗?

ax6ht2ek  于 2023-11-16  发布在  其他
关注(0)|答案(8)|浏览(184)

一个朋友给我发了那个代码,声称它会损坏处理器。是真的吗?

void damage_processor() {
    while (true) {
        // Assembly code that sets the five control registers bits to ones which causes a bunch of exceptions in the system and then damages the processor
        Asm(
            "mov cr0, 0xffffffff \n\t"
            "mov cr1, 0xffffffff \n\t"
            "mov cr2, 0xffffffff \n\t"
            "mov cr3, 0xffffffff \n\t"
            "mov cr4, 0xffffffff \n\t"
        )
    }
}

字符串
是真的吗?

rfbsl7qr

rfbsl7qr1#

从用户空间代码?不。它会导致特权异常,内核会终止你的程序。从内核代码?我怀疑;你将抛出异常,你必须手动设置错误处理程序返回到有问题的代码,以继续这样做。如果CR 3移动的一部分成功,你也很有可能导致三重错误,因为它控制着页表地址,你可能会在指令获取,处理程序获取,然后是双重错误处理程序获取时遇到错误。如果发生这种情况,CPU应该关闭。
检查英特尔或AMD的系统编程手册,他们会告诉你哪些异常将被抛出时,写入无效位的控制寄存器。

2lpgd968

2lpgd9682#

如果你让它运行大约20年。

vc6uscn9

vc6uscn93#

也许此代码会导致您的处理器/系统锁定,但它不会永久损坏它。
想象一下,如果这是真的:它将立即被病毒/木马用来攻击计算机或隐藏其活动后检测。
即使在任何代码都可能损坏处理器的情况下,处理器制造商也可以发布所谓的微码更新,其类似于处理器的软修复。这种微码更新由操作系统和/或BIOS(和处理器制造商)提供,并且在这样的代码可以被执行之前被加载到处理器中。
总结一下:不,你的朋友错了,假设我们谈论的是x86/x64平台。

watbbzwu

watbbzwu4#

不可以。如果你的目的是疯狂地运行处理器,希望破坏它,计算机系统有热解决方案(风扇,铜热交换器,散热器等)来防止过热。如果热解决方案出现故障,BIOS将Assert#THERMTRIP并关闭机器。

y3bcpkx1

y3bcpkx15#

这根本组装不起来mov-to-control-register的源操作数必须是GPR,而不是立即数或内存。(https://www.felixcloutier.com/x86/mov-1)。它也不会编译; GNU C中的关键字是asm()而不是Asm()
所以,不,this 代码不能做任何事情,因为它不能编码成机器码,所以x86 CPU无法执行任何东西。
此外,CR 1是保留的; mov cr1, eax(32位模式)或mov cr1, rax(64位模式)将#UD非法指令故障。
而CR 3是顶级页表指针,因此设置它可能会导致代码提取从其他地方开始,除非物理地址0xFFFFF000处的页面是一个有用的顶级页目录,并Map到当前RIP或EIP。(64位模式下的PML 4,或PAE模式下的任何名称)。如果我们处于传统模式,所以最好已经启用了,因为同一页更不可能既作为32位2级表的遗留页目录,又作为顶级PAE表。(低12位要么被忽略,要么是PCID = Process Context ID。)

给你发这段代码的人纯粹是瞎编的,作为伪代码使用临时寄存器存储-1值根本不可信

如果我们删除CR 1写,并使真实的代码使用临时寄存器,使它可以实际执行,它仍然不会损坏您的硬件,即使在内核模式下运行。例如mov rax, -1/mov cr0, rax/.我猜也许他们mov eax, -1/mov cr0, rax对那些32位的零进行了零扩展。(64位模式只能执行64位mov到/从控制模式。传统32位模式只能执行32位mov到/从控制模式。)
它可能会使你的机器崩溃并强制重新启动。(或者直接导致通过三重错误重新启动,如果它到达了它将顶层页表CR 3设置为全1的部分,如果那不是一个有效的物理地址或者那个页不是一个有用的顶层页表。
如果CR 3的新值指向一个页表,使得CS:RIP仍然指向下一条指令,那么对CR 4的写入肯定会引发#GP(0)异常,如Intel的保护或64位模式手册中所述。

Protected Mode保护模式¶

#GP(0)(一般保护故障):

  • 如果当前特权级别不为0.([aka kernel mode required])
  • 如果尝试在CR 0中写入无效位组合(例如,当PE标志设置为0时,将PG标志设置为1,或者当NW标志设置为1时,将CD标志设置为0)。
    *如果尝试将1写入CR 4中的任何保留位。
  • 如果尝试将1写入CR4.PCIDE。[* 在64位模式下可以,但在传统保护模式下不行 *]
  • 如果页目录指针表(PDPT)中的任何保留位被置位,并且控制寄存器的加载导致PDPT被加载到处理器中。

#UD(非法指令异常):

  • 如果使用了前缀“”。
    *如果尝试访问CR 1、CR 5、CR 6、CR 7或CR 9-CR 15。

写入CR 0可能不会出错,设置所有位可能不是无效组合,这段代码不值得再花力气证明它是无意义的。

mjqavswn

mjqavswn6#

对不起,代码不能在ARM处理器上运行。
在许多处理器中,设置状态字或影响处理器的指令被限制在“管理程序”模式。好的操作系统在“保护”模式下运行用户代码,该模式不具有与“管理程序”模式相同的功能。在用户模式下执行特权指令会产生异常。
您和您的朋友可以随时查阅汇编语言参考手册中的说明并验证操作。

bqucvtff

bqucvtff7#

我听说奔腾I中有一个bug,当在一个紧密的循环中给出一系列毫无意义的指令时,会很快烧毁一个触发器,以至于热保护无法保护它。
我曾经发现的参考是,真正的旧CPU可以通过在真实模式下这样做来烹饪:

halt:
    jmp short halt

字符串
正确的 * 代码是

halt:
    nop
    jmp short halt

  • 这个答案是作为旧材料的近引号写的。你真的应该使用hlt指令。
cpjpxq1n

cpjpxq1n8#

除了重启机器之外,这段代码不太可能做太多事情。根据我的经验,x86 CPU可以通过执行软件代码来实现。

相关问题