Как прочитать значение жестко закодированного адреса в C ++? - PullRequest
7 голосов
/ 01 марта 2011

Я хочу прочитать значение, которое находится по адресу 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);
}

EDIT:

Я запускаю это под вдовами XP. Только документация, которую я могу найти на доске ниже enter image description here

EDIT:

Из ваших ответов ниже я вижу, что мне нужно написать драйвер для платы. Может кто-нибудь указать мне на ресурс, как это сделать?

Ответы [ 5 ]

11 голосов
/ 01 марта 2011

Чтобы получить доступ к физической памяти непосредственно под Windows, вам необходимо разработать драйвер. Я предлагаю вам прочитать Виртуальное адресное пространство , чтобы понять почему. Короткая история: Адреса памяти, которые вы видите в процессе пользовательского режима, не имеют отношения к адресам физической памяти, а адреса, где живет аппаратное обеспечение, защищены ОС, чтобы приложения пользовательского режима не могли испортить вещи.

1 голос
/ 01 марта 2011

Конечно, если вы хотите идти на попятную, вы можете загрузить Windows Device Driver SDK

1 голос
/ 01 марта 2011

Существует несколько готовых драйверов, позволяющих приложениям пользовательского режима считывать и записывать порты ввода-вывода; одним из самых известных является inpout32.dll , другие упоминаются здесь , чтобы найти их, хороший ключ поиска - «запись параллельного порта NT» (поскольку они чаще всего используются для это задание).

Обычно они работают, загружая драйвер режима ядра (действие, требующее административных привилегий), а затем вызывая его из пользовательского режима каждый раз, когда вы вызываете функцию dll для выполнения чтения / записи.

Обратите внимание, однако, что большинство из этих библиотек не имеют какой-либо формы контроля доступа, поэтому, загружая их драйвер, вы фактически позволяете любому приложению, которое знает, как его использовать для чтения / записи на портах ввода-вывода, и это довольно серьезная угроза безопасности.

1 голос
/ 01 марта 2011

Вам не разрешен доступ к оборудованию напрямую из программы пользовательского режима.Вам нужен драйвер устройства для этого.

Разве аппаратное обеспечение не поставляется с некоторым программным обеспечением, которое вы должны установить?Прочтите документацию к программному обеспечению о том, как ее назвать.

1 голос
/ 01 марта 2011

Я предполагаю, что ваша программа работает как обычный пользователь. Чтобы предотвратить повреждение операционной системы и сбой системы, современные операционные системы и процессоры не позволяют получить доступ к памяти, которая не принадлежит вашей программе.

Чтобы получить доступ к такой памяти устройства, вам нужно будет работать в режиме ядра процессора, а не в режиме пользователя. Обычным способом использования таких устройств является написание низкоуровневого драйвера устройства, работающего в режиме ядра, и использование его в качестве интерфейса для вашей программы пользовательского режима.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...