Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以将CPU模式更改为读取内存吗?_C++_Assembly_Memory_Cpu - Fatal编程技术网

C++ 我可以将CPU模式更改为读取内存吗?

C++ 我可以将CPU模式更改为读取内存吗?,c++,assembly,memory,cpu,C++,Assembly,Memory,Cpu,我可以通过编程更改CPU模式吗?(例如,从保护模式到实模式。) 我想在Visual Studio中读取tmemory,但遇到访问错误。(因为处理器处于保护模式?) 如何执行此操作?要切换到实模式,您的代码必须: 拥有足够高的权限(“CPL=0”)。这主要限制了大多数操作系统(如Windows)只能使用“内核” 在可以以实模式访问的内存中运行(在物理地址空间的前1个MiB中)。否则,一旦进入实模式,您将崩溃,因为CPU无法访问您的代码 对于可以切换到实模式以访问内存(并且可以从实模式访问内存)

我可以通过编程更改CPU模式吗?(例如,从保护模式到实模式。)

我想在Visual Studio中读取tmemory,但遇到访问错误。(因为处理器处于保护模式?)


如何执行此操作?

要切换到实模式,您的代码必须:

  • 拥有足够高的权限(“CPL=0”)。这主要限制了大多数操作系统(如Windows)只能使用“内核”

  • 在可以以实模式访问的内存中运行(在物理地址空间的前1个MiB中)。否则,一旦进入实模式,您将崩溃,因为CPU无法访问您的代码


对于可以切换到实模式以访问内存(并且可以从实模式访问内存)的所有情况;也可以在不切换到实模式的情况下访问内存(例如,更改段和/或页表),从而减少麻烦并提高性能。

无论您的实际问题是什么,您都很可能在错误的方向上寻找解决方案。为什么要以实模式执行代码?你运行了什么代码,它给了你什么错误?访问错误意味着您的程序中有未定义的行为。这并不意味着您必须更改处理器模式。这意味着您必须修复导致代码中未定义行为的错误。请发布一个。您不能更改CPU模式。也许你可以使用
ReadProcessMemory
,这取决于你想做什么。这听起来很像。你可以,但你需要在环0中,也就是说,你需要在操作系统中。只需更新
cr0
@fuz即可:如果更改为实模式,windows将不再运行(在该CPU上)。期望你的系统崩溃得惊人。因此,从技术上讲,理论上是可以的,但实际上不是。@Brendan如果你这样做,那么你的CS选择器缓存中包含的值是不可能用纯实模式实现的。@Brendan一旦清除CR0中的PM位,CPU就处于实模式。“这才是最重要的。@Brendan我在哪里可以读到英特尔手册中关于这些状态的内容?请注意,此时此刻更改操作模式并不能真正起到任何作用。它只会影响发生跳远或重新加载段寄存器时发生的情况。@Brendan这是因为这些模式不存在!在对段寄存器进行任何更新之前,它们只是实模式或保护模式。这并没有什么特别之处,除了可能对x86上的操作模式的工作方式有误解。@fuz:请注意,虽然我不能用英特尔手册确凿地证明我的断言,但您也不能用英特尔手册确凿地证明您的断言。它可以归结为“个人定义”,其中历史(例如使用非官方名称,如“非真实模式”和“大真实模式”)和英特尔手册都倾向于我的定义。