1. Выделяет пару очередей и присоединяет их к головному интерфейсу потока снизу.
2. Находит структуру streamtab через массив cdevsw[] драйвера или массив fmodswf] модуля.
3. Из структуры streamtab получает структуры qinit чтения и записи и использует для их инициализации поле q_qinfo пары очередей.
4. Вызывает процедуру open модуля или драйвера.
Представьте ситуацию, что рассматриваемый нами поток открыл еще один пользователь. Это могло быть сделано двумя способами, либо через тот же файл устройства, либо через другой файл, имеющий такие же старшие и младшие номера (обрабатывается общим объектом snode). Ядро проверяет поле v_stream vnode общего объекта snode и находит, что оно не равно NULL, а содержит указатель на структуру stdata потока. Это показывает, что поток уже открыт. В данном случае процедура stropen() всего лишь вызывает процедуры open драйвера потока и каждого модуля в этом потоке с целью информирования об открытии другим процессом того же потока.
Помещение модулей в поток
Пользователь может поместить модуль в открытый посредством вызова ioctl с командой I_PUSH. Ядро выделяет пару очередей и вызывает qattach() для добавления их в поток. Процедура q_attach() инициализирует модуль, обнаруживая его вхождения strtab в таблице fmodsw[]. Она соединяет модуль с потоком, располагая его сразу после головного интерфейса, и вызывает для него процедуру open.
Опубликовал katy
June 24 2015 20:28:56 ·
0 Комментариев ·
3158 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.