Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Программа, драйвера и контексты


Автор: Hagrael 4.8.2011, 08:09
Здравствуйте, уважаемые форумчане. Мне не очень понятно, что из себя представляют драйверы и контексты. Как я понял:

Драйвер - программа, обеспечивающая работоспособность устройства. Умеет подавать нужные сигналы устройству, которые Windows не знает.

Контекст устройства - программа, работающая с драйвером... А она-то зачем? Посылает драйверу нужные сигналы? smile 

Схема действия, как я понимаю, такая:
Программа => Windows => Контекст => Драйвер => Устройство
И Windows в этой схеме предоставляет библиотеку GDI. Что она делает, тоже не до конца понятно.

Заранее благодарен за объяснения.

Автор: bsa 4.8.2011, 10:27
Драйвер - это прослойка между устройством и операционной системой. Что такое контекст я не знаю (подозреваю это что-то Windows-специфичное). Скорее всего, это просто идентификатор, который позволяет однозначно определить устройство (в *nix - это файл, или дескриптор файла, если он открыт).
Когда тебе необходимо общаться с устройством, ты запрашиваешь его контекст у операционной системы. Если устройство свободно, то ОС его тебе выделяет. Есть определенный набор операций, доступный данному устройству (обычно, он стандартен для каждого типа устройств). Когда ты применяешь какую-либо операцию к контексту, то система перенаправляет запрос драйверу, а тот уже транслирует эту операцию в команды отправляемые устройству. Соответственно, результат выполнения команд обратно преобразуется в стандартную для операции форму и возвращается ОС, которая уже передает ее твоей программе.

Автор: Hagrael 4.8.2011, 14:04
Т. е. в схеме, приведенной выше, пункты Windows и Контекст можно объединить?

P.S.: Ну и названия придумывают...

Автор: xvr 5.8.2011, 10:19
Цитата(Hagrael @  4.8.2011,  14:04 Найти цитируемый пост)
Т. е. в схеме, приведенной выше, пункты Windows и Контекст можно объединить?

В 'схеме, приведенной выше' совершенно непонятно, что имеется в виду под Windows и Контекст. 
 smile 

Автор: shara 5.8.2011, 12:08
Во первых драйвер это НЕ программа в привычном для нас смысле. Это скорее набор функций, которые подсовываются ОС, и которые она использует для выполнения неких действий. Посему драйвер лучше сравнивать с ДИНМИЧЕСКОЙ библиотекой функций.


Рискну предположить что вышеупомянутый "контекст устройства" это собсно программа которая его (драйвер) использует\обращается.
К примеру, при попытке некой программы прочесть некий файл, функции драйвера жесткого диска реализующие чтение будут вызваны непосредственно в адресном пространстве этой программычитай драйверу будет видно всю память программы которая к нему обращается


Автор: borisbn 5.8.2011, 14:01
Можно ещё предположить, что контекст устройства - это структура с данными о конкретном устройстве (шина, номер слота и т.п.). Дело в том, что для всех устройств одного типа создаётся один драйвер, в который приподключении устройства ОС передаёт этот самый контекст.
Код

NTSTATUS DriverEntry(IN DRIVER_OBJECT* pDriverObject, IN UNICODE_STRING* pRegistryPath)
{
...
    pDriverObject->DriverExtension->AddDevice = AddDeviceDispatch;
...
    return STATUS_SUCCESS;
}

Цитата

NTSTATUS AddDeviceDispatch(DRIVER_OBJECT* pDriverObject, DEVICE_OBJECT* pPDO)


Автор: Hagrael 9.8.2011, 09:54
Драйвер - набор функций, посылающих нужные сигналы устройству
Контекст устройства - структура данных, содержащая информацию об устройстве. Используется для взаимодействия с драйвером (но почему нельзя напрямую использовать функции драйвера?)
GDI - библиотека, дающая программе контекст видеокарты?

Не мог бы кто-нибудь из участников форума сделать схему взаимодействия программы и видеокарты?

Автор: borisbn 9.8.2011, 10:54
Цитата(Hagrael @  9.8.2011,  09:54 Найти цитируемый пост)
Драйвер - набор функций, посылающих нужные сигналы устройству

 smile 
Цитата(Hagrael @  9.8.2011,  09:54 Найти цитируемый пост)
Контекст устройства - структура данных, содержащая информацию об устройстве. Используется для взаимодействия с драйвером 

 smile 
Цитата(Hagrael @  9.8.2011,  09:54 Найти цитируемый пост)
но почему нельзя напрямую использовать функции драйвера?

Ф-ции драйвера (в Windows) работают на уровне ядра. Напрямую вызывать ф-ции, работающие на уровне ядра можно только из ядра. Из пользовательского режима они "не видны". Для того, чтобы их всё-таки вызвать, существует API-функция DeviceIoControl. Вот почитай http://ru.wikipedia.org/wiki/Кольца_защиты
Вообще, схема общения программы с устройством практически всегда такая:
Цитата

HANDLE hDevice = CreateFile( <http://support.microsoft.com/kb/235128>, ... );
DeviceIoControl(
    hDevice,
    <код команды>,
    <входные данные команды>,
    <кол-во вх.дынных>,
    <выходные данные команды>,
    <кол-во вых.дынных>
);
CloseHandle( hDevice );

не зная кода команды, сколько и каких данных эта команда требует и т.п., обращаться к драйверу нельзя, поэтому часто делают "прослойку" (набор библиотек/ф-ций) между драйвером и пользовательскими программами. http://ru.wikipedia.org/wiki/GDI - как раз такая "прослойка"

Добавлено @ 11:06
Предположим, что драйвер видеокарты создаёт symlink "video" и умеет выполнять одну команду "нарисовать точку". Входные параметры команды: x, y, color. Выходных нет.
В GDI есть ф-ции "установить цвет", "переместить указатель рисования" и "нарисовать линию от указателя до точки (x,y)" (псевдо(очень псевдо)код):
Код

#define IOCTRL_SET_PIXEL 42
struct Pixel {
    int x;
    int y;
    int color;
};

SetColor( context, color ) {
    context->color = color;
}
MoveTo( context, x, y ) {
  context->cur_x = x;
  context->cur_y = y;
}
LineTo( context, x, y ) {
    HANDLE hVideo = CreateFile( "\\\\.\\video", ... );
    int cur_x = context->cur_x;
    int cur_y = context->cur_y;
    do {
        // вычисление очередной точки (cur_x, cur_y)
        Pixel pix;
        pix.x = cur_x;
        pix.y = cur_y;
        pix.color = context->color;
        DeviceIoControl( hVideo, IOCTRL_SET_PIXEL, &pix, sizeof( pix ), NULL, 0 );
    }
    while ( cur_x != x && cur_y != y );
    context->cur_x = cur_x;
    context->cur_y = cur_y;
    CloseHandle( hVideo );
}

Автор: Hagrael 12.8.2011, 14:37
Цитата(borisbn @  9.8.2011,  10:54 Найти цитируемый пост)
не зная кода команды, сколько и каких данных эта команда требует и т.п., обращаться к драйверу нельзя, поэтому часто делают "прослойку" (набор библиотек/ф-ций) между драйвером и пользовательскими программами. GDI - как раз такая "прослойка"

А откуда GDI узнает о том, какая команда у драйвера что требует? Ведь драйвера же разные бывают... Ведь разные?  smile 

Автор: borisbn 12.8.2011, 15:11
Цитата(Hagrael @  12.8.2011,  14:37 Найти цитируемый пост)
А откуда GDI узнает о том, какая команда у драйвера что требует?

Для этого Microsoft пишет спецификацию (список команд и параметров), а изготовитель драйвера должен её поддержать. После написания драйвера его отправляют в Microsoft для получения сертификата (подписи). Если драйвер сделан не по спецификации, или вылетает в каких-либо ситуациях (для проверки работы драйвера используют специальные стресс-тесты), то мелкомягкие просто не выдают сертификат.

Цитата(Hagrael @  12.8.2011,  14:37 Найти цитируемый пост)
Ведь драйвера же разные бывают...

для однотипных устройств драйвера "выглядят" для ОС (вернее для GDI) одинакого. Отличаются они внутренней начинкой.

Плюс к тому, наверняка у Microsoft имеется договорённость с nVidia, ATI, Intel, etc. о том, что если они хотят расширить список команд и/или параметров, то они сообщают об этом в Microsoft, а те в очередной версии учитывают эти расширения.


Автор: Hagrael 12.8.2011, 18:35
borisbn, понятно! А GDI предоставляет ну совсем уж верхоуровневый API, я правильно понял? И, получается, для каждой ОС свои драйвера?

Цитата(borisbn @  12.8.2011,  15:11 Найти цитируемый пост)
Плюс к тому, наверняка у Microsoft имеется договорённость с nVidia, ATI, Intel, etc. о том, что если они хотят расширить список команд и/или параметров, то они сообщают об этом в Microsoft, а те в очередной версии учитывают эти расширения.

Т. е. на старых версиях GDI эти новые драйвера будут:
а) пахать не в полную мощь
б) вообще не будут пахать

P.S.: Тут, как я понял, идет речь о драйверах, выпускаемых nVidia, ATI и Intel, а не самих устройствах. Я правильно понял?

Автор: borisbn 12.8.2011, 20:32
Цитата(Hagrael @  12.8.2011,  18:35 Найти цитируемый пост)
А GDI предоставляет ну совсем уж верхоуровневый API, я правильно понял? 

 smile 
Цитата(Hagrael @  12.8.2011,  18:35 Найти цитируемый пост)
И, получается, для каждой ОС свои драйвера?

а ты когда-нить слышал о кроссплатформенных драйверах ? Я - нет.

Цитата(Hagrael @  12.8.2011,  18:35 Найти цитируемый пост)
а) пахать не в полную мощь

не уверен, т.к. всю поднаготную драйверов/ОС/GDI не знаю, но думаю, что да, все ф-ции новых драйверов работать не будут на старом ГДИ

Цитата(Hagrael @  12.8.2011,  18:35 Найти цитируемый пост)
Тут, как я понял, идет речь о драйверах, выпускаемых nVidia, ATI и Intel, а не самих устройствах. Я правильно понял?

а вот это я не понял. чойта ?

Автор: alexvs11 12.8.2011, 21:25
Цитата(Hagrael @  12.8.2011,  18:35 Найти цитируемый пост)
borisbn, понятно! А GDI предоставляет ну совсем уж верхоуровневый API, я правильно понял? И, получается, для каждой ОС свои драйвера?

кроме того, что это API - это HAL

Цитата(borisbn @  12.8.2011,  20:32 Найти цитируемый пост)
а ты когда-нить слышал о кроссплатформенных драйверах ? Я - нет.

а какже виндовские сетевые драйвера, отлично в никсах работают, только через ndiswrapper smile 

Автор: Hagrael 13.8.2011, 07:50
Цитата(borisbn @  12.8.2011,  20:32 Найти цитируемый пост)
а вот это я не понял.

Я имел в виду, что компании Microsoft не интересны нововведения в "API видеокарты" (если так можно назвать самые низкоуровневые команды, посылаемые непосредственно видеокарте от драйвера), что компанию Microsoft интересуют исключительно нововведения в драйверах данных фирм, т. к. GDI будет работать именно с ними. GDI ведь не будет абсолютно никак взаимодействовать напрямую с видеокартой? И, выходит, что у API видеокарты нет никаких стандартов и спецификации, правильно? А с появлением новых версий GDI контекст устройства ведь тоже может принять новые возможности, ведь так?

Автор: borisbn 13.8.2011, 09:58
Цитата(Hagrael @  13.8.2011,  07:50 Найти цитируемый пост)
И, выходит, что у API видеокарты нет никаких стандартов и спецификации, правильно?

Не совсем. Минимальное API как-то стандартизировано. Когда ты только ставишь винду или заходишь в Windows в безопасном режиме включается "универсальный" драйвер от самих мелкомягких. Он знает о видеокарте только то, что она умеет отображать пикселы в нужном месте и нужным цветом. Никаких 3D-акселераций не используется.


Автор: xvr 13.8.2011, 11:44
Цитата(Hagrael @  13.8.2011,  07:50 Найти цитируемый пост)
Я имел в виду, что компании Microsoft не интересны нововведения в "API видеокарты" (если так можно назвать самые низкоуровневые команды, посылаемые непосредственно видеокарте от драйвера), что компанию Microsoft интересуют исключительно нововведения в драйверах данных фирм, т. к. GDI будет работать именно с ними.

Во первых Microsoft не делает видеокарт, она пишет Операционные Системы. Так что нововведения в 'API видеокарты' ее абсолютно не интересуют, т.к. она пользуется API на уровне именно драйверов.
Во вторых, GDI сам по себе предназначен для вывода окошек и интерфейса пользователя. Там высокие скорости не нужны. Для всякой мультимедии (видео и игры) используется другой стек со своими драйверами - DirectX. Эти драйвера более приближены к аппаратуре, и они позволяют приложениям пользователя получить максимум от каждой конкретной видеокарты.
Например Direct3D использует промежуточный язык (шейдеры), на котором пишется обработка видеопотока (пишется прикладными программистами), и эта программа напрямую попадает в драйвер видеокарты, где уже сам драйвер ее транслирует так, что бы максимально воспользоваться возможностями видеокарты. Вплоть до того, что программа транслируется в код графического процессора самой видеокарты и загружается непосредственно в нее. 
В последнее время некоторые производители видеопроцессоров открыли доступ к ним напрямую из пользовательских приложений (см. http://ru.wikipedia.org/wiki/CUDA)


Автор: Hagrael 13.8.2011, 12:22
Всем большое спасибо за объяснения! Будем ждать новых версий GDI с расширенным функционалом! smile

Минутку. Я тут подумал... зачем вообще нужен контекст, когда можно говорить драйверу (через GDI, разумеется) DrawAnything(0, 10, 20). А драйвер-то заточен под определенную видеокарту, и ему не нужна информация о ней, которая, как я выяснил, является контекстом устройства.
Цитата(Hagrael @  9.8.2011,  09:54 Найти цитируемый пост)
Контекст устройства - структура данных, содержащая информацию об устройстве. Используется для взаимодействия с драйвером

Автор: xvr 13.8.2011, 20:31
Цитата(Hagrael @  13.8.2011,  12:22 Найти цитируемый пост)
зачем вообще нужен контекст, когда можно говорить драйверу (через GDI, разумеется) DrawAnything(0, 10, 20). А драйвер-то заточен под определенную видеокарту, и ему не нужна информация о ней, которая, как я выяснил, является контекстом устройства.

Я так понял, что вы говорите о контексте устройства (Device Context). Он нужен в первую очередь, что бы определить к какому именно драйверу производится обращение. Дело в том, что вызовы GDI одни и те же для всех разновидностей того, на чем можно рисовать. И это не только видеокарта. Это может быть принтер, могут быть разные видеокарты (или разные дисплеи на одной видеокарте) или вообще не физическое устройство, а некая виртуальная сущность (например битмэп в памяти, удаленный рабочий стол, метафайл и т.д и т.п.) 


Автор: Hagrael 14.8.2011, 09:05
Все понял, спасибо всем!  smile 

Автор: bsa 15.8.2011, 17:57
Цитата(Hagrael @  13.8.2011,  12:22 Найти цитируемый пост)
Будем ждать новых версий GDI с расширенным функционалом!

Ну и зачем? На этом GDI свет клином не сошелся. GDI нужен только для "офисных" нужд - создание окошек, вывод текста и простой графики. Большее от него и не требуется. А всякие хитрые эффекты вряд ли будут поддерживаться GDI, так как их придется уже самой МС реализовывать для устройств отличных от видеокарт. Когда нужны эффекты, то подключаются менеджеры окон и рабочего стола. И уже через мощные API (в Windows - DirectX, в остальных - OpenGL) делают все это.

Автор: Hagrael 16.8.2011, 07:23
Понятно. Т. е. GDI нужен для "кросс-устройственности", так? Чтобы одним и тем же кодом можно было рисовать и на принтере, и на видеокарте.

Автор: bems 16.8.2011, 09:24
Цитата(Hagrael @  16.8.2011,  07:23 Найти цитируемый пост)
Т. е. GDI нужен для "кросс-устройственности", так?
На данный момент, он нужен в основном для обратной совместимости

Автор: IGanja 2.2.2012, 15:29
Если я правильно понял то цепочка следующая:

Приложение->GDI->драйвер->железо.

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

Автор: bsa 2.2.2012, 16:05
дескриптор - в переводе это "описание". Это некая структура, которая содержит всю необходимую информацию для работы с чем-либо. Обычно, дескриптор скрыт за обезличенным указателем (handle в Windows) или числом (дескриптор файла в POSIX системах) с целью ограничения неконтролируемого доступа "пользователя".

Дескриптор в случае работы с графикой можно представить в виде художника с холстом. Ты ему говоришь: "нарисуй черную линию толщиной 1 мм от хх до уу"; и он ее рисует. И тебе совершенно по барабану в этот момент, рисует он карандашом, кистью, лазером или долотом.

Именно для этого и созданы дескрипторы - скрыть реализацию и предоставить одинаковый инструментарий для управления однотипными объектами (устройствами). В объектно-ориентированном программировании это называется инкапсуляцией.

В принципе, дескриптором можно представить указатель на базовый класс, например, ввода-вывода. Когда ты открываешь файл создается экземпляр класса File, когда сокет - класса Socket, когда pipe - Pipe. Но все они имеют общего предка. Ты можешь применять к нему стандартные методы и будут вызываться соответствующие методы классов (так как они виртуальные). Таким образом, тебе совершенно все равно откуда читать и куда писать - в эти моменты ты используешь общий функционал.

Автор: IGanja 2.2.2012, 17:01
Спасибо, очень подробно и понятно, а про контекст устройства так же можно?

Автор: bsa 2.2.2012, 17:30
IGanja, да.

Автор: bsa 2.2.2012, 22:27
Цитата(IGanja)
Будьте так любезны, я не одну статью прочитал, но там пишут просто, если вы хотите рисовать, вам нужно получить контекст устройства или что в контексте можно хранить графические атрибуты, но каждый раз на событие WM_PAINT я все равно должен перерисовывать от и до всю клиентскую область, зачем тогда хранить эти атрибуты, непонятно.
продолжим аналогию с художником... ты ему сказал нарисовать десяток линий, пару штриховок и две закраски. Он это сделал на холсте. тебе художник больше не нужен и ты освободил его... через какое-то время холст выцвел и тебе пришло сообщение WM_PAINT. Ты опять вызываешь художника, даешь ему нужные команды, он рисует. Затем ты его снова освобождаешь (чтобы его услугами мог воспользоваться кто-нибудь другой)...
Кстати, по приходу сообщения WM_PAINT ты должен перерисовать не все. Координаты областей для перерисовки можно как-то получить (я не самый большой специалист по WinAPI).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)