禁用L2 / L1缓存

时间:2009-07-10 08:56:38

标签: ubuntu nasm

我正在尝试禁用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)

任何人都可以帮助我?

8 个答案:

答案 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 ,它确实将其删除了,但显然,它在删除之前没有调用我的清理程序....

帮助?