OSDev http://osdev.su/ |
|
Вввод-вывод http://osdev.su/viewtopic.php?f=5&t=530 |
Страница 1 из 1 |
Автор: | Bargest [ 18 апр 2012, 23:52 ] |
Заголовок сообщения: | Вввод-вывод |
Вопрос 1. SetFilePointer. Правильно ли я понимаю, что сия функция зависима от устройства (например, она не имеет смысла для COM-порта) и реализуется в Windows при помощи DeviceIOControl? Если нет, то как? З.Ы. Пытался дизассемблировать винду, но интересующая часть кода защищена от дебага простыми дебаггерами вроде IDA. ![]() Вопрос 2. параллельная работа Существуют ли устройства, способные работать параллельно с несколькими потоками ввода-вывода (например, одновременно вводить и выводить данные, или выводить разные данные в несколько каналов)? Т.к. та модель ввода-вывода, что я придумал, такой возможности на одном устройстве лишена (без регистрации в системе дополнительных экземпляров того же устройства), и если таковые устройства существуют, нужно придумывать что-то другое. Я планирую запустить для каждого устройства в системе поток, который всё время спит; диспетчер устройств, при обнаружении запроса IO к какому-либо устройству, будит соответствующий поток, и тот обходит очередь запросов, вызывая для каждого драйвер, пока запросы не кончатся и он снова не заснёт. В этом случае запросы для разных устройств будут обслуживаться параллельно, но всё же на каждом устройстве будет строго последовательная обработка и параллельно обработать запросы к одному и тому же устройству будет крайне трудно (драйверу придётся самому создавать в системе потоки и вручную перераспределять запросы между ними). |
Автор: | grindars [ 20 апр 2012, 19:27 ] |
Заголовок сообщения: | Re: Вввод-вывод |
Bargest писал(а): Правильно ли я понимаю, что сия функция зависима от устройства (например, она не имеет смысла для COM-порта) ... Именно так. Bargest писал(а): ... и реализуется в Windows при помощи DeviceIOControl? Нет, не через неё. Есть две функции API ядра - NtSetInformationFile и NtQueryInformationFile, через подфункцию FilePositionInformation которой можно получить доступ к указателю. Но это только для синхронных (не-overlapped) вызовов. Для асинхронных позиция задается в структуре overlapped WinAPI или через параметр ByteOffset для Native API (см., например, NtReadFile). Bargest писал(а): З.Ы. Пытался дизассемблировать винду, но интересующая часть кода защищена от дебага простыми дебаггерами вроде IDA. ![]() Защищена от дебага? Не встречал ничего такого, сколько не разбирал. Что разбирали и в чем заключается проблема? Можно в личку, в принципе. Bargest писал(а): Существуют ли устройства, способные работать параллельно с несколькими потоками ввода-вывода (например, одновременно вводить и выводить данные, или выводить разные данные в несколько каналов)? Т.к. та модель ввода-вывода, что я придумал, такой возможности на одном устройстве лишена (без регистрации в системе дополнительных экземпляров того же устройства), и если таковые устройства существуют, нужно придумывать что-то другое. Да, такое бывает. COM-порты (UART, если точнее) могут одновременно работать на прием и на передачу, шина SPI вообще только одновременно. Цитата: Я планирую запустить для каждого устройства в системе поток, который всё время спит; диспетчер устройств, при обнаружении запроса IO к какому-либо устройству, будит соответствующий поток, и тот обходит очередь запросов, вызывая для каждого драйвер, пока запросы не кончатся и он снова не заснёт. В этом случае запросы для разных устройств будут обслуживаться параллельно, но всё же на каждом устройстве будет строго последовательная обработка и параллельно обработать запросы к одному и тому же устройству будет крайне трудно (драйверу придётся самому создавать в системе потоки и вручную перераспределять запросы между ними). В принципе, нормальное решение. Истинно параллельное выполнение - достаточно редкое явление, и усложнять всю систему ради пары устройств смысла нет. |
Автор: | Bargest [ 20 апр 2012, 19:41 ] |
Заголовок сообщения: | Re: Вввод-вывод |
Спасибо за развёрнутый ответ. По поводу дебага - в личке. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |