Форумы Modlabs.net: Программирование драйверов устройств для чайников - Форумы Modlabs.net

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Программирование драйверов устройств для чайников

#1 Пользователь офлайн   dE fENDER 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 271
  • Регистрация: 18 Декабрь 08

Отправлено 24 Март 2012 - 20:00

Оглавление


0

#2 Пользователь офлайн   dE fENDER 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 271
  • Регистрация: 18 Декабрь 08

Отправлено 25 Март 2012 - 21:53

Введение

В этой теме я планирую дать серию уроков, которые позволят любому человеку получить базовое представление о том, как устроена система взаимодействия прикладного ПО и драйверов ОС Windows, научиться читать исходные коды существующих драйверов устройств или написать свой собственный драйвер, работающий с его собственным устройством.

Также эти уроки могут помочь аудитории владельцев видеокарт с графическими чипами, произведенными компанией 3dfx, разобраться в доступных исходных кодах драйверов этих видеокарт. Упомянутые исходники могут быть с наименьшим количеством переделок откомпилированы под Windows XP/Windows 2003 Server, которые и будут являться основной целевой системой. В более современной Windows Vista/7 несколько изменилась модель драйверов, наиболее сильно это затронуло графическую подсистему. Это означает, что для их корректной работы придется переписать весьма значительную часть кода. Кроме того, под х64 версиями Vista/7 и более старших операционных систем просто так нельзя загрузить драйвер, не имеющей цифровой подписи. Подпись стоит порядка 500 долларов в год (150, если найти купон на скидку), их не любят давать частным лицам и даже небольшим организациям. Кроме того, если в подписанном драйвере обнаружится уязвимость и ей воспользуются хакеры – то подпись данного [почти всегда юридического] лица аннулируется и у него возникают проблемы с получением новой. Еще есть такая процедура, как WHQL-сертификация, но ее я вообще не собираюсь пока здесь обсуждать.

Весьма приветствуется, если другие люди будут давать здесь свои собственные уроки, не выходящие за пределы темы. Также здесь можно задавать любые вопросы, предлагать свои идеи для следующих уроков и отписываться об своих удачных/неудачных результатах.

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

#3 Пользователь офлайн   White 

  • Белый человер
  • PipPipPipPipPipPipPip
  • Группа: Главный Администратор
  • Сообщений: 12 292
  • Регистрация: 16 Июль 05

Отправлено 26 Март 2012 - 23:16

Хотелось бы также видеть уроки по работе с драйверами для Windows 9x. Например, для AALchemy есть драйвер для Windows XP. Но вот для Windows 9x - нет.
0

#4 Пользователь офлайн   dE fENDER 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 271
  • Регистрация: 18 Декабрь 08

Отправлено 26 Март 2012 - 23:28

Урок 0. Установка и настройка программного обеспечения

Список используемого программного обеспечения:

  • Windows XР или Windows 2003 Server х86 – операционная система, под которую будем писать драйверы;
  • Visual Studio 2010 – среда разработки приложений на языках С/С++ и других. Будет использоваться для написания различных простых прикладных программ, в т.ч. и управляющей программы драйвера. Можно попробовать воспользоваться Visual Studio 11 beta, которая доступна для скачивания по ссылке - http://www.microsoft...studio/11/en-us;
  • Windows Driver Kit – набор инструментов, необходимых для разработки драйвера. Включает в себя компилятор, заголовочные файлы и много другого. Требуется версия 7.1.0, ее можно взять по ссылке
    http://www.microsoft...ang=en&id=11800;
  • VMWare – при отсутствии физической машины операционную систему можно запустить в виртуальной. Это также безопаснее при разработке - при ошибке в драйвере система уйдет в синий экран;
  • Daemon Tools – средство для открытия образов CD и DVD дисков в формате iso. WDK распространяется в виде такого образа. В случае использования VMWare использовать не обязательно, т.к. VMWare умеет монтировать такие образы самостоятельно. Бесплатную lite-версию можно скачать здесь: http://www.disc-tool...download/daemon
  • DebugView – утилита Марка Руссиновича, которая позволяет увидеть текстовые сообщения, выдаваемые драйверами, собранными в отладочном режиме. Скачивать здесь - http://technet.micro...ernals/bb896647
  • Far Manager – файловый менеджер, с которым легче работать с консольными утилитами. Взять можно здесь - http://www.farmanage...wnload.php?l=ru.


Все используемое мною программное обеспечение – на английском языке. В большинстве случаев можно использовать и русские версии, но может возникнуть путаница в командах или другие проблемы с совместимостью. Для начала работы потребуется компьютер с установленной обычной 32-разрядной Windows XP/2003. Продвинутые пользователи могут пользоваться необычной – отладочной, она же - checked build. Эта версия показывает больше информации при отладке устройств. Обычная же версия Windows носит название free build. Компьютер для экспериментов может быть как реальным, так и виртуальным. Разрабатываемые программы я буду проверять на одной реальной машине и одной виртуальной. На обоих установлен Windows Server 2003 R2 Enterprise Edition c SP2. Виртуальная машина запущена под VMWare Workstation 8.0.2.

Установка Visual Studio
Я буду использовать Visual Studio 2010 Ultimate. В принципе, ставить ее не обязательно, так как все необходимые инструменты, включая компилятор и заголовки есть и в WDK. Но для написания прикладных программ, в особенности для новичка, она намного удобней вызова компилятора из консоли. Если ее все же планируется установить, то лучше делать это перед установкой WDK.

Берем диск со студией в iso-формате, монтируем его в Daemon Tools, либо подключаем как компакт-дисковод в VMWare. Запускаем с диска setup.exe, выбираем «Install Microsoft Visual Studio 2010». На следующем шаге под Windows 2003 может появится сообщение, что требуется Windows Imaging Component. Щелкаем по этой строке, запускается браузер – скачиваем подходящий по языку операционной системы (у меня английский, значит wic_x86_enu.exe), устанавливаем. Заново запускаем setup.exe с диска. Нажимаем Next, соглашаемся с лицензионным соглашением, затем идет выбор типа установки. Выбираем Custom, изменяем путь установки – для избежания ошибок Visual Studio и все любые другие инструменты следует ставить по максимально короткому пути без русских букв и пробелов. Мой вариант – C:\Programs\VS10. Следующая страница – выбор пакетов. Устанавливаем в соответствии с рисунком:

Изображение
Рис 0.1 – Выбор пакетов в установщике Visual Studio


Кроме показанных, можно также выбрать «Visual C#». C# бывает полезен для расширения возможностей самой Visual Studio и написания небольших утилит. Нажимаем Install. Кроме самой студии ставится куча бесполезной, ненужной и вредной дряни. Если на компьютере была старая версия Windows Installer'а – потребуется перезагрузка. После установки – Finish, Exit.

Установка WDK
Монтируем скачанный iso-образ аналогично тому, как это было сделано с Visual Studio. Запускаем KitSetup.exe, на этапе выбора пакетов устанавливаем галочки в соответствии с рисунком:

Изображение
Рис 0.2 – Выбор пакетов в установщике WDK


Нажимаем Ок, укорачиваем путь установки до C:\WinDDK, может появится окно установки .net 2.0. Устанавливаем .net. Появляется окно с лицензией WDK, соглашаемся. Ждем завершения установки. Нажимаем Finish. Установочный диск WDK не удаляем, а сохраняем до лучших времен, предыдущую версию 7.0 невозможно было корректно удалить без образа именно того диска, с которого ее устанавливали.

Устанавливать Visual Studio и WDK не обязательно на той же машине, на которой планируется проверять работу программ. Для проверки я поставил их на реальной машине с Windows 7 х64 и откомпилировал драйвер, который заработал под Windows 2003 Server х86.
Создаем на диске каталог для проектов, учитывая вышеописанные рекомендации (без пробелов и русских букв), например C:\Projects. Запускаем Visual Studio, открываем настройки (меню Tools/Option), выбираем в дереве «Projects and Solutions/General», в параметре Projects location выбираем/указываем созданный каталог.

Также настоятельно рекомендую установить Far Manager 2 и работать через него. Его преимущество над Windows/Total Commander'ами и Explorer'ами в том, что через него нормально видно содержимое консоли (команда ctrl + O), куда выдается полезная информация при компиляции и запуске консольных программ. Путь установки желательно записать в переменную PATH.

В дальнейшем рассмотрим и драйверы для Windows 9x. Для этого потребуется другое программное обеспечение, но программирование драйверов для Windows 9x проще.
0

#5 Пользователь офлайн   dE fENDER 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 271
  • Регистрация: 18 Декабрь 08

Отправлено 28 Март 2012 - 18:32

Урок 1. Знакомство с языком C и средой Visual Studio. Консольные приложения

Программы под Windows бывают консольные и обычные. Обычные назовем оконными. Far – консольная программа, Explorer – оконная. При запуске консольной программы создается консоль – черный экранчик, куда можно выводить всякий текст. При запуске оконной консоли не появляется, но при этом можно создать какое-нибудь окно и выводить информацию на него. Окно можно не создавать, при этом программа будет видна в списке процессов (пока она не завершит свое выполнение), но кроме этого ничего подозрительного наблюдаться не будет.
Согласно многолетней традиции, первая программа должна выводить текстовую строку «hello, world». В классической книге Б. Кернигана и Д. Ритчи «Язык программирования Си» она выглядела следующим образом:

#include <stdio.h>

main()
{
	printf("hello, world");
}


Создадим ее в Visual Studio. Выбираем File/New/Project. В дереве шаблонов слева удостоверяемся, что выбран Visual C++. По центру выбираем «Empty Project». Внизу вводим в поле Name – “HelloWorld”. Снимаем галочку “Create directory for solution». Нажимаем ОК. Создается пустой проект:

Изображение
Рис. 1.1 – Окно Solution Explorer


В окне Solution Explorer щелкаем правой кнопкой мыши по папке Source Files, выбираем Add/New Item … В появившемся окне выбираем C++ File. Если программа будет на языке Си, то внизу нужно задать имя файла с расширением .c. Например, main.c. Если просто ввести main, то файл получит расширение .cpp и при компиляции будет считаться, что это язык C++. Отличий между ними не так уж и много, но если это будет драйвер, то на языке с++ его лучше не делать по целому ряду причин. Обычные программы лучше писать на с++. А еще лучше – на Java/C#.

После создания файла main.c он должен появится в дереве проекта в папке Source Files и открыться слева для редактирования. Набираем/копируем в это окно код. Нажимаем F5 или ищем сверху зеленый треугольник:


Изображение
Рис. 1.2 – Кнопка запуска программы


Появится предупреждение, что проект будет пересобран. Лучше сразу поставить галочку «Do not show this dialog again» и нажать Yes. После сборки проект запустится, покажет на долю секунды консольное окно со строкой и завершится. Чтобы увидеть, что же там такое выводится, можно запускать по комбинации Ctrl + F5, но при этом не будет доступна отладка. Можно также после компиляции запустить FAR, перейти в папку с программой (c:\projects\HelloWorld), там будет папка debug, в которой можно найти скомпилированный исполняемый файл HelloWorld.exe, который можно запустить и после этого нажать комбинацию ctrl + o, чтобы увидеть содержимое консоли. Либо можно модифицировать программу, добавив ожидание нажатия на клавишу (функция getch):

#include <conio.h>
#include <stdio.h>

main()
{
	printf("hello, world");
	getch();
}


Результат – на рисунке:

Изображение
Рис. 1.3 – Запуск программы

0

#6 Пользователь офлайн   dE fENDER 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 271
  • Регистрация: 18 Декабрь 08

Отправлено 31 Март 2012 - 17:30

Урок 2. Продолжаем знакомство с Visual Studio. Оконные приложения

Хотя этот вид приложений я назвал «оконными», но как уже было отмечено в предыдущем уроке, создавать окна они совершенно не обязаны. От консольных визуально они отличаются тем, что после их запуска система не будет создавать консольного окна. Программное отличие заключается в том, что их основная функция, с которой начинается выполнение программы, носит название WinMain, в то время как у консольных приложений она должна называться main. Так как консоль после запуска отсутствует, то функция printf, выводящая строку, работать не будет. Вместо это одним из самых простых способов вывести небольшой текст является функция MessageBox. Теперь сделаем наше приложение HelloWorld оконным.

Для этого выполним File/New/Project. Выберем, как и раньше, Visual C++/Empty Project. Введем имя – HelloWorld2 и нажмем ОК. В окне Solution Explorer добавим новый файл типа С++ File с именем main.c в папку Source Files. Он должен после этого автоматически открыться слева. Код у него будет следующим:

#include <Windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	MessageBox(0, "Hello, world!", "", 0);
	return 0;
}


Запускаем приложение, видим следующий результат:

Изображение
Рис. 2.1 – Запуск программы


Существует еще один вид стартовой функции, о котором, судя по всему, не знает по меньшей мере половина программистов, пишущих для Windows. Суть проблемы заключается вот в чем – на самом деле, во время компиляции приложения, кроме написанного программистом кода компилятор вставляет свой собственный код, который инициализирует всякие интересные штуки и только когда сочтет нужным – то передает управление функциям main/WinMain. Сам добавляемый код можно посмотреть в файле <пусть к установленной VS>/VC/crt/src/crt0.c.
Так как в некоторых случаях этот код совершенно не нужен, то я покажу, как от него обычно избавляются, а заодно – как можно рисовать, не создавая своего окна, прямо поверх рабочего стола и окон других приложений. Итак, создаем новый проект HelloWorld3, все абсолютно аналогично прежним. После создания добавляем main.c со следующим кодом:

#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#pragma comment (linker,"-merge:.rdata=.text")
const CHAR szMessage[]="Hello, world!";

void CenterText(HDC hDC,int x,int y,LPCTSTR szMessage,int point)
{
	HFONT hFont=CreateFont(
		point * GetDeviceCaps(hDC, LOGPIXELSY) / 60,
		0, 370, 0, FW_BOLD, TRUE, FALSE, FALSE,
		RUSSIAN_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
		PROOF_QUALITY, VARIABLE_PITCH, "Times New Roman");	// Создаем новый шрифт
	HGDIOBJ hOld = SelectObject(hDC, hFont);	// Сохраняем старый шрифт
	SetTextAlign(hDC, TA_CENTER | TA_BASELINE);	// Текст выровняем по центру
	SetBkMode(hDC, TRANSPARENT);	// Прозрачность, чтоб текст не оказался в квадратной рамке с цветом фона
	SetTextColor(hDC, RGB(0x40,0xAA,0));	// Цвет текста
	TextOut(hDC, x, y, szMessage, strlen(szMessage));	// Рисуем текст на поверхности
	SelectObject(hDC, hOld);	// Возвращаем старый шрифт
	DeleteObject(hFont);		// Удаляем наш кастомный шрифт
}

void WinMainCRTStartup()
{
	// HDC - это такая поверхность, по которой планируется рисовать
	// В данном случае мы будем рисовать по поверхности всех имеющихся
	// мониторов. А в общем случае она может быть создана и для принтера
	// и для других экзотических устройств
	HDC hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
	while(1)	// Повторять будем бесконечно
	{
		// Выводим текст
		CenterText(hDC, GetSystemMetrics(SM_CXSCREEN) / 2,
			GetSystemMetrics(SM_CYSCREEN) / 2, szMessage, 72);
		Sleep(100);	// Ждем 1/10 секунды, чтоб не забивать процессор
	}
	// Сюда выполнение не дойдет, задачу нужно завершить через список процессов
	ReleaseDC(NULL, hDC);
	ExitProcess(0);
}


Теперь требуется настроить свойства проекта - щелкаем правой кнопкой в окне Solution Explorer по названию проекта HelloWorld3, выбираем Properties. В дереве открываем Configuration Properties/Linker/System, ставим в свойстве SubSystem значение Windows. Свойство SubSystem как раз и определяет, как будет компилироваться приложение – как консольное (/SUBSYSTEM:Console) или как оконное (/SUBSYSTEM:Windows). Если его не устанавливать, то оно само попытается определить тип подсистемы по имени стартовой функции. Однако, если функция имеет нестандартное имя, как в нашем примере – то его придется указывать явно. Помимо этих двух типов приложений, в списке имеются также и другие, но к теме уроков они не относятся.
Дальше открываем Configuration Properties/Linker/Advanced, в свойство Entry Point записываем название функции, с которой хотим начать выполнение – WinMainCRTStartup. Нажимаем OK, запускаем задачу:

Изображение
Рис. 2.2 – Рисуем на рабочем столе


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

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

Одной из важнейших задач графического драйвера является создание совместимых контекстов устройств (Device Context). В коде программы мы получали контекст при помощи функции CreateDC. Подобный контекст можно создать для любого окна приложения, в том числе и для консольного. А получив манипуляр конекста (переменная с типом HDC) – на нем можно рисовать все, что угодно, используя стандартные функции WinAPI, при этом не задумываясь о том, как именно устроена аппаратура, выводящая изображение. Все особенности аппаратной реализации совместимых контекстов поручаются драйверу устройства.
0

#7 Пользователь офлайн   dE fENDER 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 271
  • Регистрация: 18 Декабрь 08

Отправлено 03 Апрель 2012 - 23:41

Урок 3. Сборка и запуск драйвера

Еще один, особый, вид программ – драйверы. В отличие от остальных – выполняются в особом режиме, где они имеют ряд возможностей, недоступных для обычных приложений Windows. Однако это осложняется тем, что в этом режиме практически отсутствуют средства для взаимодействия с пользователем. Для тестирования драйвера можно пользоваться функцией DbgPrint, выдающей отладочные сообщения отладчику. Но отладчика может не оказаться и этих сообщений никто в таком случае не увидит. Для обычного же взаимодействия с пользователем драйвер должен полагаться на прикладные приложения, обмениваясь с ними запросами ввода/вывода.

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

Создание проекта будем вести следующим образом. Создаем папку DrvHello, где будем разрабатывать приложение-драйвер. Внутри нее создаем такие файлы:

• makefile

#
# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source
# file to this component.  This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#

!INCLUDE $(NTMAKEENV)\makefile.def


Над текстом этого файла не следует задумываться, он просто должен присутствовать в таком вот неизменном виде. Хотя в чужих проектах этого файла может и не быть, либо он будет работать другим образом. В общем, если он есть и содержит это содержимое – то все в порядке, если нет – необходимы дополнительные исследования.

• sources

TARGETNAME=drvhello
TARGETTYPE=DRIVER
TARGETPATH=obj
SOURCES=main.c


Задает параметры сборки. Здесь в параметре SOURCES необходимо перечислить через пробел все файлы с исходным кодом, которые нужно будет скомпилировать.

• main.c – это наш файл с исходным кодом. Может носить любое имя, их может быть много, а может быть очень много. Главное, не забыть их все перечислить в файле sources


#include "ntddk.h"

#pragma code_seg("INIT")
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath)
{
    DbgPrint("Hello, world!");			// Выдача отладочного сообщения
    return STATUS_DEVICE_CONFIGURATION_ERROR;	// Выдача ошибки заставит систему сразу же выгрузить драйвер
}
#pragma code_seg()


Основная функция у нас здесь носит название DriverEntry. Запускаться она будет при попытке загрузки драйвера. А чтобы сделать такую попытку – нужна программа-загрузчик, которую напишем чуть поздней.

Откомпилируем драйвер. Чтобы мы могли что-то увидеть в отладчике, драйвер должен быть собран в отладочном режиме. Напомню, что отладочный режим у программистов драйверов называется checked, а финальный - free (прикладные программисты так не заморачиваются и называют их debug и release соответственно). В этом режиме программный код не оптимизируется и исполняемый файл содержит много избыточной информации, совершенно не нужной для работы, но очень полезной при изучении того, что будет делать этот код.
Для сборки открываем меню Start, затем Programs/Windows Driver Kits/WDK <номер версии>/Build Environment/Windows Server 2003 (или Windows XP)/ x86 Checked Build Environment. Щелкаем и попадаем в консольное окно. Если FAR был добавлен в PATH, то можно набрать far и перейти в директорию проекта обычным способом, иначе туда придется добираться используя команду cd (и может быть смену диска). Когда добрались до папки DrvHello (там где лежат три файла, которые были созданы выше) – набираем команду nmake. Если сборка прошла без ошибок, то будет созданы директории objchk_wnet_x86/i386, а в ней уже можно обнаружить файл drvhello.sys. Это и есть наш собранный драйвер.

Теперь вернемся к загрузчику. Это у нас будет консольное приложение (см. главу 1). Имя я ему дал DrvHelloloader и разместил, как всегда, в c:\Projects. Имя файла с исходным кодом такое же – main.c, содержимое:

#include <windows.h>
#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib") 

void main(int argc, char* argv[])
{
	char serviceName[] = "drvhello";
	char driverBinary[MAX_PATH] = "";
	SC_HANDLE hSc;
	SC_HANDLE hService;

	// Чтобы запустить драйвер, потребуется полный путь к нему
	// Предполагаем, что он лежит в той же папке, что и экзешник
	strcpy(driverBinary, argv[0]);			// argv[0] - здесь будет имя экзешника с полным путем
	PathRemoveFileSpec(driverBinary);		// Выкидываем имя экзешника, остается только путь к папке
	strcat(driverBinary, "\\drvhello.sys");	// Добавляем имя драйвера.
					// Бэкслэш в строках Си надо удваивать, из-за его специального значения.

	hSc = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);	// Открываем SCM (Service Control Management)
								// Это такая штука, которая позволяет запускать драйверы
								// из пользовательского режима
	CreateService(hSc, serviceName, serviceName,
		SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
		driverBinary, NULL, NULL, NULL, NULL, NULL);				// Загрузка в 3 этапа - создаем службу
	hService = OpenService(hSc, serviceName, SERVICE_ALL_ACCESS);	// Открываем ее
	StartService(hService, 0, NULL);	// И запускаем. Вообще-то было бы неплохо
						// еще и закрыть ее... Как нибудь потом.
}


Выбираем в меню cтудии – Build/Rebuild Solution. Произойдет пересборка проекта без запуска. В принципе, можно и запустить. Находим экзешник в папке проекта, докидываем в ту же папку drvhello.sys. Далее запускаем DebugView, включаем галочку Capture/Capture Kernel, как показано на рисунке:

Изображение
Рис. 3.1 – Настройка DebugView


Теперь запускаем программу. Если все прошло успешно – видим следующую картину:

Изображение
Рис. 3.2 – Проверка драйвера


Вот такой простой код позволяет уже очень много – работать на уровне ядра. Но следует помнить, что если допустить ошибку в прикладной программе – упадет она одна; если в драйвере – вся система. К примеру, если в код драйвера перед DbgPrint добавить строку:

int a = *((int *)0);


которая делает попытку прочесть содержимое памяти по нулевому адресу – то картинка будет уже иной:

Изображение
Рис. 3.3 – Попытка чтения из нулевого адреса


Если бы это был не драйвер, а просто программа пользовательского режима, то при выполнении этого кода она бы просто закрылась, выдав ошибку:

Изображение
Рис. 3.4 – Та же ошибка в программе пользовательского режима

0

#8 Пользователь офлайн   dE fENDER 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 271
  • Регистрация: 18 Декабрь 08

Отправлено 17 Апрель 2012 - 23:30

Как небольшой анонс на будущее - закончил вчера паять вот это:

ИзображениеИзображение

Это - microcart П. Уварова, простейшее из известных мне PCI-устройств. Однако на этом месте встретился с парой проблем. Так как оно подключается всего лишь по 19 линиям PCI вместо 47 минимально требуемых в стандарте для ведомого устройства, то моя серверная матплата при старте успешно определяет его наличие, показывает в списке как неизвестное PCI-устройство, но потом перед загрузкой ОС, похоже, блокирует его, в результате чего в Windows никаких признаков устройства не видно. На настольной машине такого не происходит и устройство отлично видно в списке с требуемым Devid'ом. Тем не менее, там установлена Windows 7, а для продолжения экспериментов требуется Windows 98. Попробовал пару раз установить ее, но пока - безуспешно. Проблема в том, что у меня уже много лет нет ни одного рабочего CD/DVD устройства, с которого можно загрузиться. При попытке загрузится с загрузочной флэшки с ДОСом эта самая флэшка определяется как первый диск (с именем C:), после установки на этом диске оказывается загрузчик Windows 98, а вот оттуда он уже загрузится не может и система виснет в момент, когда грузятся драйверы дисковых устройств.
Но даже так с ним очень прикольно играться - я сделал на нем делитель частоты (от сигнала clk шины PCI) и в итоге получилось некоторое подобие двоичных часов; затем просто поупражнялся с логикой и триггерами.

Сегодня также получил еще такую штуку. Это устройство для обучения OSR USB-FX-2, описываемое в книге "Windows Driver Foundation. Разработка драйверов".

Изображение Изображение

Отдельно в пути девелоперская плата с Cyclone 2. Времени, к сожалению, опять нет, чтобы занятся этим более серьезно, но постараюсь в ближайшее время написать еще хотя бы пару простых уроков. В совсем отдаленных мечтах - разработать плату со вторым Stratix'ом.
Изображение
Тем более, что сейчас есть возможность купить новый чип за 10% от цены. Но изготовление 6-слойной платы (и довольно большой) влетит в копеечку, плюс к этому считается что FBGA припаять в любительских условиях невозможно.
0

#9 Пользователь офлайн   White 

  • Белый человер
  • PipPipPipPipPipPipPip
  • Группа: Главный Администратор
  • Сообщений: 12 292
  • Регистрация: 16 Июль 05

Отправлено 18 Апрель 2012 - 23:15

Может и скорее всего вопрос не в тему, но может это тебе пригодится?
0

#10 Пользователь офлайн   dE fENDER 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 271
  • Регистрация: 18 Декабрь 08

Отправлено 18 Апрель 2012 - 23:45

Думаю, что не особо - внутри ПЛИСок можно применять софтовые микроконтроллеры/микропроцессоры, в том числе AVR, ARM и даже х86-совместимые, а также специально разработанный для ПЛИСок Альтеры Nios. Ниос занимает от 700 до 1800 вентилей, так что в циклоне на 5к вентилей не напрягаясь можно разместить пару штук, а в стратиксе - до сотни и больше. А отдельно на плате совмещать физический микроконтроллер и плиску считается проблематично из-за проблем с клоковыми доменами и т.п.

У контроллеров, впрочем, есть большое преимущество по цене, поэтому для большинства устройств выгоднее использовать именно их. Можно даже сравнить тот же ардуин с вот такими девайсами -
100G Development Kit, Stratix V GX Edition
Вообще мечта - Stratix V GX FPGA Development Kit

Кстати, помню как-то видел на ебае видеокарту на Xilinx'e... Занятное устройство.
0

#11 Пользователь офлайн   White 

  • Белый человер
  • PipPipPipPipPipPipPip
  • Группа: Главный Администратор
  • Сообщений: 12 292
  • Регистрация: 16 Июль 05

Отправлено 18 Апрель 2012 - 23:59

dE fENDER, я для дела могу подарить Ардуинку :)
0

#12 Пользователь офлайн   dE fENDER 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 271
  • Регистрация: 18 Декабрь 08

Отправлено 19 Апрель 2012 - 00:14

Спасибо, но я действительно не знаю, чем бы он мне мог помочь в данный момент. Разве что еще больше отвлечет от дела... Я сейчас и так испытываю сильные позывы отложить все остальное и начать писать на Verilog'e свою велосипедную реализацию софтового спектрума или процессора MIX Д. Кнута.
0

#13 Пользователь офлайн   White 

  • Белый человер
  • PipPipPipPipPipPipPip
  • Группа: Главный Администратор
  • Сообщений: 12 292
  • Регистрация: 16 Июль 05

Отправлено 08 Июнь 2020 - 16:41

dE fENDER, не уверен, что ты получишь уведомление, но всё же, хочется вернуться к теме. У тебя наверняка есть прогресс.
0

#14 Пользователь офлайн   dE fENDER 

  • Member
  • PipPipPip
  • Группа: Пользователи
  • Сообщений: 271
  • Регистрация: 18 Декабрь 08

Отправлено 16 Июнь 2020 - 20:52

Просмотр сообщенияWhite (08 Июнь 2020 - 16:41) писал:

dE fENDER, не уверен, что ты получишь уведомление, но всё же, хочется вернуться к теме. У тебя наверняка есть прогресс.


Вроде бы у меня валялся еще один дописанный и неопубликованный урок плюс были наработки на верилоге касательно реализации pci, но я не уверен, что готов продолжать данную тему. Для освоения могу лишь посоветовать прочесть и проработать книжку Уолтера Они "Использование Microsoft Windows Driver Model", благо она во многом актуальна даже для современной Windows 10 x64, но её, скорее всего, будет недостаточно для проектов возможно даже примитивных устройств.

Если есть какие-то вопросы по базовым вещам - можно спрашивать здесь, я попробую ответить, если буду периодически заходить и просматривать.
0

#15 Пользователь офлайн   White 

  • Белый человер
  • PipPipPipPipPipPipPip
  • Группа: Главный Администратор
  • Сообщений: 12 292
  • Регистрация: 16 Июль 05

Отправлено 16 Июнь 2020 - 22:52

dE fENDER, поищи свой урок оформленный, пожалуйста. Если есть, будет круто.
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

2 человек читают эту тему
0 members, 2 guests, 0 anonymous users