Как читать из порта ввода-вывода, отображаемого в памяти, в .Net?

StackOverflow https://stackoverflow.com/questions/207291

Вопрос

Могут ли это сделать стандартные указатели в .Net?Или нужно прибегнуть к P/invoke?

Обратите внимание: я не говорю о ссылках на объекты;Я говорю о реальных указателях C# в небезопасном коде.

Это было полезно?

Решение

C#, как управляемая и защищенная среда выполнения, не допускает низкоуровневого доступа к оборудованию, а ячейки памяти, связанные с реальным оборудованием, недоступны.

Вам нужно будет использовать драйвер порта или написать свой собственный на C++ или C с соответствующим API Windows для доступа к интересующим областям ввода-вывода, отображаемым в памяти.Это будет выполняться в более низком кольце, чем способны программы C#.

Вот почему вы не видите драйверы, написанные на C#, хотя я понимаю, что многие пишут подпрограммы доступа на C++, но основная логика драйвера на C#.Однако это сложно, поскольку сбои и перезапуск могут стать непростыми, не говоря уже о проблемах синхронизации и синхронизации (которые несколько более конкретны в C++ на нижнем уровне, хотя Windows далека от системы реального времени).

-Адам

Другие советы

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

Вам нужно либо написать драйвер ядра, чтобы делать то, о чем вы говорите, либо установить драйвер с API, который позволит вам делать запросы на ввод-вывод по определенным физическим адресам (и такой драйвер будет довольно большим Я полагаю, что дыра в безопасности ждет своего часа).Кажется, я припоминаю это, когда у какой-то компании был такой драйвер в составе комплекта разработки, который помогал портировать устаревший DOS/Win16 или любой другой код устройства на Win32.Я не помню его названия и не знаю, существует ли он еще.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top