7

我正在寻找位于地址 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);
}

编辑:

我在寡妇XP下运行这个。下面只有我可以在板上找到的文档在此处输入图像描述

编辑:

从您下面的答案中,我可以看到我需要为该板编写一个驱动程序。有人可以指出我如何做到这一点的资源吗?

4

5 回答 5

11

为了在 Windows 下直接访问物理内存,需要开发驱动程序。我建议您阅读虚拟地址空间以了解原因。简短的故事:您从用户模式进程中看到的内存地址与物理内存地址无关,并且硬件所在的地址受到操作系统的保护,以防止用户模式应用程序搞砸事情。

于 2011-03-01T17:46:13.460 回答
1

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

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

于 2011-03-01T17:48:44.987 回答
1

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

硬件不附带一些您应该安装的软件吗?查看软件文档以了解如何调用它。

于 2011-03-01T17:49:30.963 回答
1

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

于 2011-03-01T19:20:51.030 回答
1

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

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

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

于 2011-03-01T18:32:35.013 回答