Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отладк модуля, функций из file_operations 
:(
    Опции темы
cupper
Дата 7.6.2010, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Есть модуль (тестовый) 
Код

....
static int hello_read_proc(char *buffer, char **start, off_t offset, int size, int *eof, void *data)
{
...
}

static int __init hello_init(void)
{
    /*
     * Create an entry in /proc named "hello_world" that calls
     * hello_read_proc() when the file is read.
     */
    if (create_proc_read_entry("hello_world", 0, NULL, hello_read_proc, NULL) == 0) {
        printk(KERN_ERR
            "Unable to register \"Hello, world!\" proc file\n");
        return -ENOMEM;
    }
    return 0;
}

module_init(hello_init);
....

Суть его создать в /proc/ устройство hello_world из которого можно прочитать строчку "hello world".
Нужно на примере этого модуля проследить работу ядра начиная от sys_read до непосредственно вызова функции read реализованной модулем для этого устройства (через file->f_op->read()).

Отлаживаю в связке qemu+gdb. Делаю так:
в вирт машине набираю строчку cat /proc/helloworld (не нижамаю enter). Ставлю бряк на sys_read, и теперь из фирт машины нажимаю enter, но слишком много остановок и не могу толком понять как мне таким способом можно изучить работу ядра по вызову функции реализованных в модулях.

PS. нужно изучить именно механизм ядра отвечающий за вызовы модульных функций которые навешиваются через file_operations в качестве обработчиков для конкретных устройств.

PM MAIL   Вверх
MAKCim
Дата 7.6.2010, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



а по исходному коду чем плохо отследить?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
cupper
Дата 7.6.2010, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(MAKCim @ 7.6.2010,  22:02)
а по исходному коду чем плохо отследить?

с этого я как раз и начал, и думал что все понял... думал до первой тестовой отладки smile
С виду все легко
Код

SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
{
    struct file *file;
    ssize_t ret = -EBADF;
    int fput_needed;

    file = fget_light(fd, &fput_needed);
    if (file) {
        loff_t pos = file_pos_read(file);
        ret = vfs_read(file, buf, count, &pos);
        file_pos_write(file, pos);
        fput_light(file, fput_needed);
    }

    return ret;
}

нашли что за файл file, вызвали унифицированную vfs_read
Код

ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
{
    ....

    ret = rw_verify_area(READ, file, pos, count);
    if (ret >= 0) {
        count = ret;
        if (file->f_op->read)
            ret = file->f_op->read(file, buf, count, pos);
        else
            ret = do_sync_read(file, buf, count, pos);

проверили что метод read реализован для данного устройства
вызвали file->f_op->read, по идеи вот тут мы должны уходить непосредственно на модальный обработчик read, на практике же я в модуль так не разу и не попал. Всегда уходит в глубинные дебри ядра, видимо для вкомпилиных в ядро модулей, ну там аля на ФС или клавы. 
Для этого и был создан модуль чтобы уж точно знать что есть она модульная read() и точно знать как ее вызвать, но таки и в такой тривиальной задачи столкнулся с выше описанной проблемой, куча раз стопится на sys_read и каждый раз через file->f_op->read уходит не в модульную функцию а в глубинные дебри ядра.
Я не спорю, оно так и должно быть, но я не могу успокоиться пока глазами этого не увижу, а вдруг все не так просто как хотелось бы ?

PS. а цель этого эксперимента, попробовать по каким либо косвенным "уликам" попробовать до непосредственного вызова read знать какая именно выховеться, модульная или ядровая.
Но об этом и речи быть не может пока не точечным методом из sys_read доходить до модульной функции минуя весь "мусор".

Это сообщение отредактировал(а) cupper - 7.6.2010, 22:20
PM MAIL   Вверх
MAKCim
Дата 8.6.2010, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



cupper, 
ну правильно, ваша функция всего лишь обработчик
фактически file_operations для /proc определен здесь
и вызывается proc_file_read



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
cupper
Дата 8.6.2010, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(MAKCim @ 8.6.2010,  10:30)
cupper, 
ну правильно, ваша функция всего лишь обработчик
фактически file_operations для /proc определен здесь
и вызывается proc_file_read

ну дык в этом то и суть модулей, что в них реализуются обработчики которые потом навешиваются на "аля стандартные" функции 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
 радуюся smile

Это сообщение отредактировал(а) cupper - 8.6.2010, 20:12
PM MAIL   Вверх
cupper
Дата 8.6.2010, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Помогите решить еще один важный вопрос
Цитата

Пусть есть некоторый модуль, для какогото устройтва (сетвуха, мыша и т.д.) этот модуль соответственно реализует функцию read для этого устройства. Тогда при обращении sys_read() к этому устройству на этапе


ret = file->f_op->read(file, buf, count, pos); 

будет сразу вызвана функция обработчик из модуля или для любого модуля/устройства до непосредственно модульной функции будет вызваны еще какие нибудь интерфейсные функции ядра ?


Это либо нужно какой то достоверный материал прочитать опровергающий или подтверждающий это, или провести эксперимент на котором можно было бы однозначно увидеть что из file->f_op->read сразу вызывается модульная функция. Не то не другое на знаю как сделать :( подскажите идеи
PM MAIL   Вверх
MAKCim
Дата 9.6.2010, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(cupper @  8.6.2010,  18:23 Найти цитируемый пост)
как я думал/думаю должна для созданного модулем устройства вызываться как раз функция реализованная в модуле и доступная через структуру описывающую этот файл структуру file_operations хранящуюся указателя ну функции для текущего "файла". 

ну вы неправильно думаете ;)


cupper,
вы о чем говорите?
о примере выше с proc или о чем-то абстрактном?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
cupper
Дата 9.6.2010, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(MAKCim @ 9.6.2010,  10:31)
Цитата(cupper @  8.6.2010,  18:23 Найти цитируемый пост)
как я думал/думаю должна для созданного модулем устройства вызываться как раз функция реализованная в модуле и доступная через структуру описывающую этот файл структуру file_operations хранящуюся указателя ну функции для текущего "файла". 

ну вы неправильно думаете ;)


cupper,
вы о чем говорите?
о примере выше с proc или о чем-то абстрактном?

а как правильно тогда ?



Забудь те про proc, щас уже именно в общем смысле 

PM MAIL   Вверх
MAKCim
Дата 9.6.2010, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



cupper,
напрямую обработчики из file_operations будут вызываться только, если вы сами определяете 
в модуле эту структуру
в примере выше вы используете proc, а драйвер proc сам определяет file_operations для каталогов и файлов
в контексте обработчиков из нее уже вызываются ваши read/write функции


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0727 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.