这个问题已经在这里有一个答案:
- 有没有办法在Linux系统上禁用CPU高速缓存(L1 / L2)? 2个回答
我试图禁用我的CPU的内部和外部的内存缓存,我的配置是以上: - 戴尔Precision工作站 - 英特尔的Core 2 Duo E6550 2.33 GHz的-Ubuntu 8.10
我试图通过BIOS禁用它,但它是apears DELL电脑不允许用户访问缓存,我发现再另一种方式,它是programmaticaly禁用缓存,英特尔架构手册A.3表明CR0寄存器设置通过置位30以禁用缓存,我写上面的代码,则:
INVD
MOV EAX,CR0
MOV EAX,40000000H;设置位30
MOV CRO,EAX
程序编译成功,但是当我尝试运行exe文件,它赛格故障 (我使用NASM)
任何人都可以帮我吗?
请注意,即使你在ring 0,因为你是在内核还是在保护模式下运行等你对DOS工具,移动0x40000000之后到CR0肯定会导致一场灾难。 你看,控制寄存器(CR0)控制各种各样的这种效果的方式处理器运行的东西,如启用分页,(不直接),保护模式等。如果您没有设置所有的这些位,你会在一个完全不同的结束环境和获取分割故障并不奇怪可言,如果你有分页以前启用。
你应该这样做,而不是:
mov eax,cr0
or eax, 40000000H ;set bit 30 without clearing the others
mov cr0,eax
这应该是“或EAX,40000000h”来设置位30。但是用户进程将不会被允许改变控制寄存器反正。 你将需要在内核中的变化。 我不会怀疑,有一些系统调用或设备接口做你想做什么。
我发现在控制寄存器这个文件在维基百科。 这证实了你说的话:
的CR0寄存器是长在386级更高的处理器的32位。 在长模式的x86-64处理器,它(和其他控制寄存器)是64位长。 CR0具有修改处理器的基本操作的各种控制标志。 位名称全称说明31 PG寻呼如果为1,启用分页和使用CR3寄存器,否则禁用分页30 CD缓存禁用
这使我对英特尔64和IA-32架构软件开发人员手册 。 它说,我又在这里引用:
大多数系统限制由应用程序访问的系统寄存器(除EFLAGS寄存器)。 系统可以设计不过,所有方案和程序的最高特权级别(0级特权)运行。 在这种情况下,appli-阳离子方案将允许修改系统寄存器。
也许你的程序是语义正确的您的代码有可能会锁定机器的错误,但即使固定就需要在管理员模式下运行。 请注意,您需要or
在以免影响其它寄存器(正如其他人指出的)的值。
您将需要从Windows上的驱动程序或Linux做到这一点,因为只有内核梯级0运行,我不认为你可以为一个过程做到这一点,你就必须这样做对所有的人。
我假设你正在试图做的内存,而不缓存写?
也许你想看看缓存刷新的说明,如果你试图做可怕的线程代码?
我会感到惊讶,如果在用户模式下运行的任何代码就能够做到这一点 - 这将是一个DoS攻击的地狱。
我认为你必须以root身份登录做到这一点。 我想知道为什么你想禁用缓存,在所有的情形产生禁用L1和L2会导致计算机锁定。
事实上,它似乎在第二条指令赛格故障(MOV EAX,CR0),我只是想发表评论所有其他指令,它没有赛格故障....但我仍然不知道为什么?
我tryed还编译/中运行级别是0(使用telinit 1命令行以root身份),但它仍然赛格故障...
我想知道如果控制寄存器0(CR0)未被写保护,那么......?
我可以通过运行代码Ring0的最后禁用缓存,谢谢DrJokepu,你给我的是正是我需要的链接..但我有新的问题,因为当我插入新的模块谁禁用缓存,工程炉排,我只是用insmod我.ko文件,并在我的代码编写的程序初始化被调用。 但现在我想以编程方式重新启用缓存,它应该写一个干净的程序巫婆复位CR0工作,并把它当rmmod的它删除模块,但实际上它并没有什么...我可以检查执行cat / proc /模块 ,它真的删除它,但显然,它已不删除它之前打电话给我的清洁程序....
救命?