Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Для новичков > Программа, драйвера и контексты |
Автор: Hagrael 4.8.2011, 08:09 |
Здравствуйте, уважаемые форумчане. Мне не очень понятно, что из себя представляют драйверы и контексты. Как я понял: Драйвер - программа, обеспечивающая работоспособность устройства. Умеет подавать нужные сигналы устройству, которые Windows не знает. Контекст устройства - программа, работающая с драйвером... А она-то зачем? Посылает драйверу нужные сигналы? ![]() Схема действия, как я понимаю, такая: Программа => Windows => Контекст => Драйвер => Устройство И Windows в этой схеме предоставляет библиотеку GDI. Что она делает, тоже не до конца понятно. Заранее благодарен за объяснения. |
Автор: bsa 4.8.2011, 10:27 |
Драйвер - это прослойка между устройством и операционной системой. Что такое контекст я не знаю (подозреваю это что-то Windows-специфичное). Скорее всего, это просто идентификатор, который позволяет однозначно определить устройство (в *nix - это файл, или дескриптор файла, если он открыт). Когда тебе необходимо общаться с устройством, ты запрашиваешь его контекст у операционной системы. Если устройство свободно, то ОС его тебе выделяет. Есть определенный набор операций, доступный данному устройству (обычно, он стандартен для каждого типа устройств). Когда ты применяешь какую-либо операцию к контексту, то система перенаправляет запрос драйверу, а тот уже транслирует эту операцию в команды отправляемые устройству. Соответственно, результат выполнения команд обратно преобразуется в стандартную для операции форму и возвращается ОС, которая уже передает ее твоей программе. |
Автор: Hagrael 4.8.2011, 14:04 |
Т. е. в схеме, приведенной выше, пункты Windows и Контекст можно объединить? P.S.: Ну и названия придумывают... |
Автор: shara 5.8.2011, 12:08 |
Во первых драйвер это НЕ программа в привычном для нас смысле. Это скорее набор функций, которые подсовываются ОС, и которые она использует для выполнения неких действий. Посему драйвер лучше сравнивать с ДИНМИЧЕСКОЙ библиотекой функций. Рискну предположить что вышеупомянутый "контекст устройства" это собсно программа которая его (драйвер) использует\обращается. К примеру, при попытке некой программы прочесть некий файл, функции драйвера жесткого диска реализующие чтение будут вызваны непосредственно в адресном пространстве этой программы. читай драйверу будет видно всю память программы которая к нему обращается |
Автор: borisbn 5.8.2011, 14:01 | ||||
Можно ещё предположить, что контекст устройства - это структура с данными о конкретном устройстве (шина, номер слота и т.п.). Дело в том, что для всех устройств одного типа создаётся один драйвер, в который приподключении устройства ОС передаёт этот самый контекст.
|
Автор: Hagrael 9.8.2011, 09:54 |
Драйвер - набор функций, посылающих нужные сигналы устройству Контекст устройства - структура данных, содержащая информацию об устройстве. Используется для взаимодействия с драйвером (но почему нельзя напрямую использовать функции драйвера?) GDI - библиотека, дающая программе контекст видеокарты? Не мог бы кто-нибудь из участников форума сделать схему взаимодействия программы и видеокарты? |
Автор: borisbn 9.8.2011, 10:54 | ||||||
![]()
![]() Ф-ции драйвера (в Windows) работают на уровне ядра. Напрямую вызывать ф-ции, работающие на уровне ядра можно только из ядра. Из пользовательского режима они "не видны". Для того, чтобы их всё-таки вызвать, существует API-функция DeviceIoControl. Вот почитай http://ru.wikipedia.org/wiki/Кольца_защиты Вообще, схема общения программы с устройством практически всегда такая:
не зная кода команды, сколько и каких данных эта команда требует и т.п., обращаться к драйверу нельзя, поэтому часто делают "прослойку" (набор библиотек/ф-ций) между драйвером и пользовательскими программами. http://ru.wikipedia.org/wiki/GDI - как раз такая "прослойка" Добавлено @ 11:06 Предположим, что драйвер видеокарты создаёт symlink "video" и умеет выполнять одну команду "нарисовать точку". Входные параметры команды: x, y, color. Выходных нет. В GDI есть ф-ции "установить цвет", "переместить указатель рисования" и "нарисовать линию от указателя до точки (x,y)" (псевдо(очень псевдо)код):
|
Автор: Hagrael 12.8.2011, 14:37 | ||
А откуда GDI узнает о том, какая команда у драйвера что требует? Ведь драйвера же разные бывают... Ведь разные? ![]() |
Автор: borisbn 12.8.2011, 15:11 |
Для этого Microsoft пишет спецификацию (список команд и параметров), а изготовитель драйвера должен её поддержать. После написания драйвера его отправляют в Microsoft для получения сертификата (подписи). Если драйвер сделан не по спецификации, или вылетает в каких-либо ситуациях (для проверки работы драйвера используют специальные стресс-тесты), то мелкомягкие просто не выдают сертификат. для однотипных устройств драйвера "выглядят" для ОС (вернее для GDI) одинакого. Отличаются они внутренней начинкой. Плюс к тому, наверняка у Microsoft имеется договорённость с nVidia, ATI, Intel, etc. о том, что если они хотят расширить список команд и/или параметров, то они сообщают об этом в Microsoft, а те в очередной версии учитывают эти расширения. |
Автор: Hagrael 12.8.2011, 18:35 | ||
borisbn, понятно! А GDI предоставляет ну совсем уж верхоуровневый API, я правильно понял? И, получается, для каждой ОС свои драйвера?
Т. е. на старых версиях GDI эти новые драйвера будут: а) пахать не в полную мощь б) вообще не будут пахать P.S.: Тут, как я понял, идет речь о драйверах, выпускаемых nVidia, ATI и Intel, а не самих устройствах. Я правильно понял? |
Автор: borisbn 12.8.2011, 20:32 | ||||
![]() а ты когда-нить слышал о кроссплатформенных драйверах ? Я - нет. не уверен, т.к. всю поднаготную драйверов/ОС/GDI не знаю, но думаю, что да, все ф-ции новых драйверов работать не будут на старом ГДИ
а вот это я не понял. чойта ? |
Автор: alexvs11 12.8.2011, 21:25 | ||
кроме того, что это API - это HAL а какже виндовские сетевые драйвера, отлично в никсах работают, только через ndiswrapper ![]() |
Автор: Hagrael 13.8.2011, 07:50 |
Я имел в виду, что компании Microsoft не интересны нововведения в "API видеокарты" (если так можно назвать самые низкоуровневые команды, посылаемые непосредственно видеокарте от драйвера), что компанию Microsoft интересуют исключительно нововведения в драйверах данных фирм, т. к. GDI будет работать именно с ними. GDI ведь не будет абсолютно никак взаимодействовать напрямую с видеокартой? И, выходит, что у API видеокарты нет никаких стандартов и спецификации, правильно? А с появлением новых версий GDI контекст устройства ведь тоже может принять новые возможности, ведь так? |
Автор: borisbn 13.8.2011, 09:58 | ||
Не совсем. Минимальное API как-то стандартизировано. Когда ты только ставишь винду или заходишь в Windows в безопасном режиме включается "универсальный" драйвер от самих мелкомягких. Он знает о видеокарте только то, что она умеет отображать пикселы в нужном месте и нужным цветом. Никаких 3D-акселераций не используется. |
Автор: xvr 13.8.2011, 11:44 | ||
Во первых Microsoft не делает видеокарт, она пишет Операционные Системы. Так что нововведения в 'API видеокарты' ее абсолютно не интересуют, т.к. она пользуется API на уровне именно драйверов. Во вторых, GDI сам по себе предназначен для вывода окошек и интерфейса пользователя. Там высокие скорости не нужны. Для всякой мультимедии (видео и игры) используется другой стек со своими драйверами - DirectX. Эти драйвера более приближены к аппаратуре, и они позволяют приложениям пользователя получить максимум от каждой конкретной видеокарты. Например Direct3D использует промежуточный язык (шейдеры), на котором пишется обработка видеопотока (пишется прикладными программистами), и эта программа напрямую попадает в драйвер видеокарты, где уже сам драйвер ее транслирует так, что бы максимально воспользоваться возможностями видеокарты. Вплоть до того, что программа транслируется в код графического процессора самой видеокарты и загружается непосредственно в нее. В последнее время некоторые производители видеопроцессоров открыли доступ к ним напрямую из пользовательских приложений (см. http://ru.wikipedia.org/wiki/CUDA) |
Автор: Hagrael 13.8.2011, 12:22 |
Всем большое спасибо за объяснения! Будем ждать новых версий GDI с расширенным функционалом! ![]() Минутку. Я тут подумал... зачем вообще нужен контекст, когда можно говорить драйверу (через GDI, разумеется) DrawAnything(0, 10, 20). А драйвер-то заточен под определенную видеокарту, и ему не нужна информация о ней, которая, как я выяснил, является контекстом устройства. |
Автор: xvr 13.8.2011, 20:31 | ||
Я так понял, что вы говорите о контексте устройства (Device Context). Он нужен в первую очередь, что бы определить к какому именно драйверу производится обращение. Дело в том, что вызовы GDI одни и те же для всех разновидностей того, на чем можно рисовать. И это не только видеокарта. Это может быть принтер, могут быть разные видеокарты (или разные дисплеи на одной видеокарте) или вообще не физическое устройство, а некая виртуальная сущность (например битмэп в памяти, удаленный рабочий стол, метафайл и т.д и т.п.) |
Автор: Hagrael 14.8.2011, 09:05 |
Все понял, спасибо всем! ![]() |
Автор: bsa 15.8.2011, 17:57 |
Ну и зачем? На этом GDI свет клином не сошелся. GDI нужен только для "офисных" нужд - создание окошек, вывод текста и простой графики. Большее от него и не требуется. А всякие хитрые эффекты вряд ли будут поддерживаться GDI, так как их придется уже самой МС реализовывать для устройств отличных от видеокарт. Когда нужны эффекты, то подключаются менеджеры окон и рабочего стола. И уже через мощные API (в Windows - DirectX, в остальных - OpenGL) делают все это. |
Автор: Hagrael 16.8.2011, 07:23 |
Понятно. Т. е. GDI нужен для "кросс-устройственности", так? Чтобы одним и тем же кодом можно было рисовать и на принтере, и на видеокарте. |
Автор: bems 16.8.2011, 09:24 |
На данный момент, он нужен в основном для обратной совместимости |
Автор: 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 | ||
Кстати, по приходу сообщения WM_PAINT ты должен перерисовать не все. Координаты областей для перерисовки можно как-то получить (я не самый большой специалист по WinAPI). |