Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
хочется предположить, что установка/чтение свойств — процесс редкий
можно сделать общую команду (напр mode), которая управляет параметрами любого драйвера, не зная о нём ничего
static property_t proplist[] = { { pt_int32, "leds", 0, &leds, 0, (void *)set_leds, 0, 0 }, }; ... static void set_leds(void) ...
Это же универсальный интерфейс для выполнения драйвером обслуживающим файл произвольных действий с передачей произвольных данных.
set_property( fd, "iomode", "palette" );
write( fd, &palette, sizeof(palette) );
Это в общем нарушает принципы UNIX
делается в основном ради увеличения производительности в ущерб стабильности
Какие именно и каким образом?
Ради увеличения производительности — да, в ущерб стабильности — нет.
Если же мне нужны вычисления на GPU — мне надо недостаточно открыть /dev/dri/card0. Мне надо взять условный libopencl для моей конкретной видеокарты, потому что именно он знает как правильно замапить память видеокарты и как посылать ей комманды которые специфичны именно для неё.
Ну лично мне неюутно от мысли что любое приложение в юзерспейсе может слать любые команды моей видеокарте. Ведь в данном случае ядро не может контролировать что делается с видеокартой.
Но вы же не пытаетесь выводить во фреймбуфер текстовым редактором или командой sed?
Частично может — с помощью правильно сконфигурированного IOMMU оно может защитить память не принадлежащую процессу от доступа со стороны видеокарты от имени и по поручению этого процесса.
Я даже могу сделать скриншот с помощью команды cat.
Но если приложение решит поиграться с клоками видеокарты, например?
Фирмварь видеокарты же не сможет определить от кого приходят команды.
Кстати, вот ещё пример почему это плохо. В ядре есть CryptoAPI, который позволяет добавлять свои модули, например для аппаратного ускорения шифрования.
Ядро (и все драйвера) может шифровать с аппаратным ускорением, юзерспейс может шифровать с аппаратным ускорением, все счастливы.
Я просто веду к тому, что драйвера стали вылазить за пределы ядра. Пропал общий интерфейс.
BOOL WINAPI DeviceIoControl(
_In_ HANDLE hDevice,
_In_ DWORD dwIoControlCode,
_In_opt_ LPVOID lpInBuffer,
_In_ DWORD nInBufferSize,
_Out_opt_ LPVOID lpOutBuffer,
_In_ DWORD nOutBufferSize,
_Out_opt_ LPDWORD lpBytesReturned,
_Inout_opt_ LPOVERLAPPED lpOverlapped
);
Сегодня истерика явистов с переходом на ФП языки.
Это не очень эффективно, но хочется предположить, что установка/чтение свойств — процесс редкий, и потому упираться в его скорость смысла немного, да и само переключение контекста при вызове стоит немало.
Никаких дефайнов с номерами, только имена.
Никаких бинарных данных, только строки
AVDictionary из FFmpeg вспомнились и сразу проблемы (которые, в принципе, все выше перечислены):
Кстати, интерфейс словаря можно и тут добавить — что бы за вызов сразу пачку параметров изменить/получить. В FFmpeg после вызова в словаре остаются записи, которые примениться не смогли.
Атрибуты устройств, или ioctl must die