![]() |
|
Модераторы: xvr |
![]()
|
|
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
Есть модуль (тестовый)
Суть его создать в /proc/ устройство hello_world из которого можно прочитать строчку "hello world". Нужно на примере этого модуля проследить работу ядра начиная от sys_read до непосредственно вызова функции read реализованной модулем для этого устройства (через file->f_op->read()). Отлаживаю в связке qemu+gdb. Делаю так: в вирт машине набираю строчку cat /proc/helloworld (не нижамаю enter). Ставлю бряк на sys_read, и теперь из фирт машины нажимаю enter, но слишком много остановок и не могу толком понять как мне таким способом можно изучить работу ядра по вызову функции реализованных в модулях. PS. нужно изучить именно механизм ядра отвечающий за вызовы модульных функций которые навешиваются через file_operations в качестве обработчиков для конкретных устройств. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
а по исходному коду чем плохо отследить?
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| cupper |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
с этого я как раз и начал, и думал что все понял... думал до первой тестовой отладки С виду все легко
нашли что за файл file, вызвали унифицированную vfs_read
проверили что метод read реализован для данного устройства вызвали file->f_op->read, по идеи вот тут мы должны уходить непосредственно на модальный обработчик read, на практике же я в модуль так не разу и не попал. Всегда уходит в глубинные дебри ядра, видимо для вкомпилиных в ядро модулей, ну там аля на ФС или клавы. Для этого и был создан модуль чтобы уж точно знать что есть она модульная read() и точно знать как ее вызвать, но таки и в такой тривиальной задачи столкнулся с выше описанной проблемой, куча раз стопится на sys_read и каждый раз через file->f_op->read уходит не в модульную функцию а в глубинные дебри ядра. Я не спорю, оно так и должно быть, но я не могу успокоиться пока глазами этого не увижу, а вдруг все не так просто как хотелось бы ? PS. а цель этого эксперимента, попробовать по каким либо косвенным "уликам" попробовать до непосредственного вызова read знать какая именно выховеться, модульная или ядровая. Но об этом и речи быть не может пока не точечным методом из sys_read доходить до модульной функции минуя весь "мусор". Это сообщение отредактировал(а) cupper - 7.6.2010, 22:20 |
||||||
|
|||||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
cupper,
ну правильно, ваша функция всего лишь обработчик фактически file_operations для /proc определен здесь и вызывается proc_file_read -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
ну дык в этом то и суть модулей, что в них реализуются обработчики которые потом навешиваются на "аля стандартные" функции read, write... для какого либо устройства и при вызове для этого самого устройства функции read() вызывается как раз модульный обработчик. Т.е. в этой строчке ret = file->f_op->read(file, buf, count, pos); как я думал/думаю должна для созданного модулем устройства вызываться как раз функция реализованная в модуле и доступная через структуру описывающую этот файл структуру file_operations хранящуюся указателя ну функции для текущего "файла". Мб подскажете как можно добавить символы модуля в gdb в которой уже отлаживается ядро в котором и запускается модуль ?) Это бы сильно упростило задачу. Я например при азагрузке модуля могу определить адрес структуры module которая описывает загружаемый модуль, я что делать дальше незнаю, как найти непосредственно расположение модуля в ядре чтобы по этому ядресу добавить секцию text модуля тем самым экспортируя модульные символы... PS. наконецтаки нашел способ, в виртуальной машине делаем cat /sys/module/hellodev/sections/.text получаем ядрес, потом в gdb делаем add-symbol-file HelloDev/hellodev.o адрес и усе, ставлю бряк на модульную функцию в тестовой машине читаю из нужного устройства и стопясю на нужной функции и делаю bt радуюся Это сообщение отредактировал(а) cupper - 8.6.2010, 20:12 |
|||
|
||||
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
Помогите решить еще один важный вопрос
Это либо нужно какой то достоверный материал прочитать опровергающий или подтверждающий это, или провести эксперимент на котором можно было бы однозначно увидеть что из file->f_op->read сразу вызывается модульная функция. Не то не другое на знаю как сделать :( подскажите идеи |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
ну вы неправильно думаете ;) cupper, вы о чем говорите? о примере выше с proc или о чем-то абстрактном? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
а как правильно тогда ? Забудь те про proc, щас уже именно в общем смысле |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
cupper,
напрямую обработчики из file_operations будут вызываться только, если вы сами определяете в модуле эту структуру в примере выше вы используете proc, а драйвер proc сам определяет file_operations для каталогов и файлов в контексте обработчиков из нее уже вызываются ваши read/write функции -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |