我正在尝试禁用CPU的内部和外部内存缓存,我的配置如上: -DELL Precision WorkStation -Intel Core 2 Duo E6550 2.33 GHz -Ubuntu 8.10
我试图通过BIOS禁用它,但它发现DELL计算机不允许用户访问缓存内存,我发现另一种方式,它是禁用缓存programmaticaly,英特尔架构手册A.3表明可以通过设置位30来设置cr0寄存器来禁用缓存,然后我写了上面的代码:
INVD
mov eax,cr0
mov eax,40000000H;设置位30
mov cr0,eax
程序编译成功,但是当我尝试运行exe文件时, Seg Faults (我正在使用NASM)
任何人都可以帮助我?
答案 0 :(得分:7)
请注意,即使您处于第0环,因为您在内核中或在保护模式下在DOS上运行工具等,请将 0x40000000 移至 cr0 肯定会造成灾难。你看,控制寄存器(cr0)控制影响处理器运行方式的各种因素,例如启用分页,保护模式(不是直接)等。如果你取消所有这些位,你将最终完全不同如果您之前启用了分页,那么环境和获取分段错误就不足为奇了。
你应该这样做:
mov eax,cr0
or eax, 40000000H ;set bit 30 without clearing the others
mov cr0,eax
答案 1 :(得分:3)
那应该是“或eax,40000000h”来设置第30位。 但是不允许用户进程更改控制寄存器。您需要在内核中进行更改。我不怀疑有一些系统调用或设备接口可以做你想要的。
答案 2 :(得分:3)
我在维基百科上找到了this document on the control register。这证实了你说的话:
CR0寄存器长32位 386及更高的处理器。上 它采用长模式的x86-64处理器 (和其他控制寄存器)是 64位长。 CR0有各种控制 修改基本操作的标志 处理器 位名称全名描述 31 PG Paging如果1, 启用分页并使用CR3 注册,否则禁用分页 30 CD Cache禁用
这导致我Intel 64 and IA-32 Architectures Software Developer’s Manual。它说,我再次引用这里:
大多数系统限制对系统的访问 寄存器(EFLAGS除外) 注册)应用程序。 但是,系统可以设计 所有程序和程序都在哪里运行 在最优惠的水平 (特权等级0)。在这种情况下, 应用程序将是 允许修改系统 寄存器。
可能你的程序在语义上是正确的你的代码有一个可能会锁定机器的bug,但即使修复它也需要在管理员模式下运行。请注意,您需要or
值,以免影响其他寄存器(正如其他人注意到的那样)。
答案 3 :(得分:2)
您需要从Windows或Linux上的驱动程序执行此操作,因为只有内核在梯级0中运行,我认为您无法为一个进程执行此操作,您必须为所有这些操作执行此操作。< / p>
我假设您在没有缓存的情况下尝试进行内存写入?
如果您尝试使用可怕的线程代码,或许您想查看缓存刷新说明?
答案 4 :(得分:0)
如果在用户模式下运行的任何代码能够做到这一点,我会感到惊讶 - 那将是一场DoS攻击。
答案 5 :(得分:0)
我认为您必须以root身份登录才能执行此操作。我想知道为什么要禁用缓存,在所有情况下禁用L1和L2会导致计算机锁定。
答案 6 :(得分:0)
实际上,在第二条指令(mov eax,cr0)中似乎是Seg错误,我只是试图评论所有其他指令,并且它确实有段错误.... 但我还是不知道为什么?
我也尝试在运行级别0(telinit 1命令行以root身份)编译/运行它,但它仍然存在错误...
我想知道控制寄存器0(cr0)是否没有写保护,然后......?
答案 7 :(得分:0)
我最终可以通过将代码作为Ring0运行来禁用缓存,谢谢 DrJokepu ,您给我的链接正是我所需要的.. 但是我遇到了新的问题,因为当我插入禁用缓存的新模块时,工作正常,我只需要修改我的 .ko 文件,然后执行 init 程序写我的代码的地方被调用。 但是现在我想再次以编程方式重新启用缓存,它应该编写一个 clean 程序来重置cr0,并在通过rmmod删除模块时调用它,但实际上它什么都不做...我可以查看 cat / proc / modules ,它确实将其删除了,但显然,它在删除之前没有调用我的清理程序....
帮助?