如何在C ++中读取硬编码地址的值?

时间:2011-03-01 17:42:11

标签: c++ pc104

我希望读取地址302H中的值。目的是从硬件(104pc堆栈的一部分)读取输入。当我运行以下代码时出现此错误:Unhandled exception at 0x004134b9 in setOutput.exe: 0xC0000005: Access violation reading location 0x00000302.

#include <stdlib.h> 

#define PORTBASE 0x302
int _tmain(int argc, char *argv[])
{
    int value;
    int volatile * port = (int *) PORTBASE;
    printf("port = %d\n", port);
    value = *port;
    printf("port value = %d\n", value);
}

编辑:

我在widows xp下运行它。我只能在电路板上找到的文档位于enter image description here

之下

编辑:

从下面的答案中,我可以看到我需要为电路板编写驱动程序。有人能指出我有关如何这样做的资源吗?

5 个答案:

答案 0 :(得分:11)

要直接在Windows下访问物理内存,您需要开发一个驱动程序。我建议您阅读Virtual Address Space以了解原因。简短的故事:您从用户模式进程看到的内存地址与物理内存地址无关,操作系统保护硬件生存的地址,以防止用户模式应用程序搞乱事情。

答案 1 :(得分:1)

我假设你的程序是以普通用户身份运行的。为了防止您损坏操作系统并使系统崩溃,现代操作系统和CPU会阻止您访问不属于您的程序的内存。

要访问此类设备内存,您需要在内核CPU模式而不是用户模式下运行。使用此类设备的常用方法是编写一个在内核模式下运行的低级设备驱动程序,并将其用作用户模式程序的接口。

答案 2 :(得分:1)

您不能直接从用户模式程序访问硬件。你需要一个设备驱动程序。

硬件是否附带了您应安装的软件?查看软件文档,了解如何调用它。

答案 3 :(得分:1)

有几个现成的驱动程序允许用户模式应用程序读写IO端口;其中一个最着名的是inpout32.dll,其他提到here,找到一个好的搜索键是“写并行端口NT”(因为它们最常用于此任务)。

通常,它们通过加载内核模式驱动程序(需要管理权限的操作),然后每次调用dll函数执行读/写操作时从usermode调用它。

但请注意,大多数这些库都没有任何形式的访问控制,因此通过加载驱动程序,您实际上允许任何知道如何使用它来读取/写入IO端口的应用程序,这是非常安全的风险。

答案 4 :(得分:1)

当然,如果您想要全力以赴,可以下载Windows Device Driver SDK