crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
Zaca
  опции профиля:
сообщение 23.3.2012, 19:39
Сообщение #11


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 22.3.2012
Пользователь №: 3281

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Iron Bug @ 23.3.2012, 16:33) *
тут дело не в инклюдах. а в том, что модуль ядра должен собираться в каталоге /lib/modules/<версия ядра>/build. это должен быть линк на сорцы ядра (или хотя бы хэдеры). также в каталоге /lib/modules/<версия ядра>/ должен быть линк sources - также на сорцы ядра или хэдеры.

Спасибо, в понедельник попробую
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Zaca
  опции профиля:
сообщение 26.3.2012, 10:35
Сообщение #12


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 22.3.2012
Пользователь №: 3281

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Iron Bug @ 23.3.2012, 16:33) *
тут дело не в инклюдах. а в том, что модуль ядра должен собираться в каталоге /lib/modules/<версия ядра>/build. это должен быть линк на сорцы ядра (или хотя бы хэдеры). также в каталоге /lib/modules/<версия ядра>/ должен быть линк sources - также на сорцы ядра или хэдеры.



Вроде все так и есть.

решила собрать ядро в каталоге /lib/modules/<версия ядра>/build

linux-awyp:/lib/modules/2.6.27.7-9-pae/build # make bzImage
make -C /usr/src/linux-2.6.27.7-9 O=/usr/src/linux-2.6.27.7-9-obj/i386/pae/. bzImage
Using /usr/src/linux-2.6.27.7-9 as source for kernel
GEN /usr/src/linux-2.6.27.7-9-obj/i386/pae/Makefile
CHK include/linux/version.h
CHK include/linux/utsrelease.h
CC arch/x86/kernel/asm-offsets.s
In file included from /usr/src/linux-2.6.27.7-9/include/linux/gfp.h:4,
from /usr/src/linux-2.6.27.7-9/include/linux/kmod.h:22,
from /usr/src/linux-2.6.27.7-9/include/linux/module.h:13,
from /usr/src/linux-2.6.27.7-9/include/linux/crypto.h:21,
from /usr/src/linux-2.6.27.7-9/arch/x86/kernel/asm-offsets_32.c:7,
from /usr/src/linux-2.6.27.7-9/arch/x86/kernel/asm-offsets.c:2:
/usr/src/linux-2.6.27.7-9/include/linux/mmzone.h:197:5: warning: "MAX_NR_ZONES" is not defined
In file included from /usr/src/linux-2.6.27.7-9/include/linux/gfp.h:4,
from /usr/src/linux-2.6.27.7-9/include/linux/kmod.h:22,
from /usr/src/linux-2.6.27.7-9/include/linux/module.h:13,
from /usr/src/linux-2.6.27.7-9/include/linux/crypto.h:21,
from /usr/src/linux-2.6.27.7-9/arch/x86/kernel/asm-offsets_32.c:7,
from /usr/src/linux-2.6.27.7-9/arch/x86/kernel/asm-offsets.c:2:
/usr/src/linux-2.6.27.7-9/include/linux/mmzone.h:221: error: ‘MAX_NR_ZONES’ undeclared here (not in a function)
make[3]: *** [arch/x86/kernel/asm-offsets.s] Error 1
make[2]: *** [prepare0] Error 2
make[1]: *** [sub-make] Error 2
make: *** [all] Error 2


завалила систему...(

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Zaca
  опции профиля:
сообщение 27.3.2012, 7:52
Сообщение #13


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 22.3.2012
Пользователь №: 3281

Спасибо сказали: 0 раз(а)




Репутация:   0  


Что, больше нечего подсказать по этой теме?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 27.3.2012, 8:10
Сообщение #14


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


Цитата(Zaca @ 27.3.2012, 13:52) *
Что, больше нечего подсказать по этой теме?

трудно подсказать человеку, который на живой системе эксперименты проводит. К тому же без текстов и пр. Абстракция и телепатия не в ходу
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Zaca
  опции профиля:
сообщение 28.3.2012, 14:53
Сообщение #15


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 22.3.2012
Пользователь №: 3281

Спасибо сказали: 0 раз(а)




Репутация:   0  


Беру популярный пример из инета:

"Сам код"
/*
 *  chardev.c: Создает символьное устройство, доступное только для чтения
 *  возвращает сообщение, с указанием количества произведенных попыток чтения из файла устройства
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/uaccess.h>        /* определение функции put_user */

/*  
 *  Прототипы функций, обычно их выносят в заголовочный файл (.h)
 */
int init_module(void);
void cleanup_module(void);
static int device_open(struct inode *, struct file *);
static int device_release(struct inode *, struct file *);
static ssize_t device_read(struct file *, char *, size_t, loff_t *);
static ssize_t device_write(struct file *, const char *, size_t, loff_t *);

#define SUCCESS 0
#define DEVICE_NAME "chardev"   /* Имя устройства, будет отображаться в /proc/devices   */
#define BUF_LEN 80                      /* Максимальная длина сообщения */

/* 
 * Глобальные переменные, объявлены как static, воизбежание конфликтов имен. 
 */

static int Major;             /* Старший номер устройства нашего драйвера */
static int Device_Open = 0;   /* Устройство открыто?  
                               * используется для предотвращения одновременного 
                               * обращения из нескольких процессов */
static char msg[BUF_LEN];     /* Здесь будет собираться текст сообщения */
static char *msg_Ptr;

static struct file_operations fops = {
  .read = device_read,
  .write = device_write,
  .open = device_open,
  .release = device_release
};

/*
 * Функции
 */

int init_module(void)
{
  Major = register_chrdev(0, DEVICE_NAME, &fops);

  if (Major < 0) {    
    printk("Registering the character device failed with %d\n",
            Major);
    return Major;
  }

  printk("<1>I was assigned major number %d.  To talk to\n", Major);
  printk("<1>the driver, create a dev file with\n");
  printk("'mknod /dev/chardev c %d 0'.\n", Major);
  printk("<1>Try various minor numbers.  Try to cat and echo to\n");
  printk("the device file.\n");
  printk("<1>Remove the device file and module when done.\n");

  return 0;
}

void cleanup_module(void)
{
  /* 
   * Отключение устройства 
   */
  //int ret = 
  unregister_chrdev(Major, DEVICE_NAME);
  //if (ret < 0)
    //printk("Error in unregister_chrdev: %d\n", ret);
}

/*
 * Обработчики
 */

/* 
 * Вызывается, когда процесс пытается открыть файл устройства, например командой
 * "cat /dev/chardev"
 */
static int device_open(struct inode *inode, struct file *file)
{
  static int counter = 0;
  if (Device_Open)
    return -EBUSY;
  Device_Open++;
  sprintf(msg, "I already told you %d times Hello world!\n", counter++);
  msg_Ptr = msg;
  try_module_get(THIS_MODULE);

  return SUCCESS;
}

/* 
 * Вызывается, когда процесс закрывает файл устройства.
 */
static int device_release(struct inode *inode, struct file *file)
{
  Device_Open--;                /* Теперь мы готовы обслужить другой процесс */

  /* 
   * Уменьшить счетчик обращений, иначе, после первой же удачной попытки открыть файл устройства,
   * вы никогда не сможете выгрузить модуль. 
   */
  module_put(THIS_MODULE);

  return 0;
}

/* 
 * Вызывается, когда процесс пытается прочитать уже открытый файл устройства
 */
static ssize_t device_read(struct file *filp, /* см. include/linux/fs.h   */
         char *buffer,                        /* буфер, куда надо положить данные */
         size_t length,                       /* размер буфера */
         loff_t * offset)
{
  /*
   * Количество байт, фактически записанных в буфер
   */
  int bytes_read = 0;

  /*
   * Если достигли конца сообщения, 
   * вернуть 0, как признак конца файла
   */
  if (*msg_Ptr == 0)
    return 0;

  /* 
   * Перемещение данных в буфер
   */
  while (length && *msg_Ptr) {

    /* 
     * Буфер находится в пространстве пользователя (в сегменте данных), 
     * а не в пространстве ядра, поэтому простое присваивание здесь недопустимо. 
     * Для того, чтобы скопировать данные, мы используем функцию put_user, 
     * которая перенесет данные из пространства ядра в пространство пользователя. 
     */
    put_user(*(msg_Ptr++), buffer++);

    length--;
    bytes_read++;
        }

  /* 
   * В большинстве своем, функции чтения возвращают количество байт, записанных в буфер.
   */
  return bytes_read;
}

/*  
 * Вызывается, когда процесс пытается записать в устройство, 
 * например так: echo "hi" > /dev/chardev
 */
static ssize_t
device_write(struct file *filp, const char *buff, size_t len, loff_t * off)
{
  printk("<1>Sorry, this operation isn't supported.\n");
  return -EINVAL;
}

Запуская Makefile - все нормально

в QT Creator

"Ход сборки с ошибками"
Цитата
15:43:10: Выполняется сборка проекта char_dev...
15:43:10: Запускается: «/opt/QtSDK/Desktop/Qt/4.8.0/gcc/bin/qmake» /opt/QtSDK/Project/char_dev/char_dev.pro -r -spec linux-g++
15:43:10: Процесс «/opt/QtSDK/Desktop/Qt/4.8.0/gcc/bin/qmake» завершился нормально.
15:43:10: Запускается: «/usr/bin/make» -w
make: Entering directory `/opt/QtSDK/Project/char_dev-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK_______'
Makefile:189: warning: overriding commands for target `chardev.o'
Makefile:186: warning: ignoring old commands for target `chardev.o'
gcc -c -pipe -O2 -Wall -W -I../../Desktop/Qt/4.8.0/gcc/mkspecs/linux-g++ -I../char_dev -I../char_dev -I. -o chardev.o ../char_dev/chardev.c
../char_dev/chardev.c:7:26: error: linux/module.h: No such file or directory
../char_dev/chardev.c:9:67: error: asm/uaccess.h: No such file or directory
../char_dev/chardev.c:16: warning: 'struct file' declared inside parameter list
../char_dev/chardev.c:16: warning: its scope is only this definition or declaration, which is probably not what you want
../char_dev/chardev.c:16: warning: 'struct inode' declared inside parameter list
../char_dev/chardev.c:17: warning: 'struct file' declared inside parameter list
../char_dev/chardev.c:17: warning: 'struct inode' declared inside parameter list
../char_dev/chardev.c:18: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'device_read'
../char_dev/chardev.c:19: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'device_write'
../char_dev/chardev.c:36: error: variable 'fops' has initializer but incomplete type
../char_dev/chardev.c:37: error: unknown field 'read' specified in initializer
../char_dev/chardev.c:37: error: 'device_read' undeclared here (not in a function)
../char_dev/chardev.c:37: warning: excess elements in struct initializer
../char_dev/chardev.c:37: warning: (near initialization for 'fops')
../char_dev/chardev.c:38: error: unknown field 'write' specified in initializer
../char_dev/chardev.c:38: error: 'device_write' undeclared here (not in a function)
../char_dev/chardev.c:38: warning: excess elements in struct initializer
../char_dev/chardev.c:38: warning: (near initialization for 'fops')
../char_dev/chardev.c:39: error: unknown field 'open' specified in initializer
../char_dev/chardev.c:39: warning: excess elements in struct initializer
../char_dev/chardev.c:39: warning: (near initialization for 'fops')
../char_dev/chardev.c:40: error: unknown field 'release' specified in initializer
../char_dev/chardev.c:41: warning: excess elements in struct initializer
../char_dev/chardev.c:41: warning: (near initialization for 'fops')
../char_dev/chardev.c: In function 'init_module':
../char_dev/chardev.c:49: warning: implicit declaration of function 'register_chrdev'
../char_dev/chardev.c:52: warning: implicit declaration of function 'printk'
../char_dev/chardev.c: In function 'cleanup_module':
../char_dev/chardev.c:74: warning: implicit declaration of function 'unregister_chrdev'
../char_dev/chardev.c: At top level:
../char_dev/chardev.c:87: warning: 'struct file' declared inside parameter list
../char_dev/chardev.c:87: warning: 'struct inode' declared inside parameter list
../char_dev/chardev.c:87: error: conflicting types for 'device_open'
../char_dev/chardev.c:16: error: previous declaration of 'device_open' was here
../char_dev/chardev.c: In function 'device_open':
../char_dev/chardev.c:91: error: 'EBUSY' undeclared (first use in this function)
../char_dev/chardev.c:91: error: (Each undeclared identifier is reported only once
../char_dev/chardev.c:91: error: for each function it appears in.)
../char_dev/chardev.c:93: warning: implicit declaration of function 'sprintf'
../char_dev/chardev.c:93: warning: incompatible implicit declaration of built-in function 'sprintf'
../char_dev/chardev.c:95: warning: implicit declaration of function 'try_module_get'
../char_dev/chardev.c:95: error: 'THIS_MODULE' undeclared (first use in this function)
../char_dev/chardev.c:87: warning: unused parameter 'inode'
../char_dev/chardev.c:87: warning: unused parameter 'file'
../char_dev/chardev.c: At top level:
../char_dev/chardev.c:103: warning: 'struct file' declared inside parameter list
../char_dev/chardev.c:103: warning: 'struct inode' declared inside parameter list
../char_dev/chardev.c:103: error: conflicting types for 'device_release'
../char_dev/chardev.c:17: error: previous declaration of 'device_release' was here
../char_dev/chardev.c: In function 'device_release':
../char_dev/chardev.c:111: warning: implicit declaration of function 'module_put'
../char_dev/chardev.c:111: error: 'THIS_MODULE' undeclared (first use in this function)
../char_dev/chardev.c:103: warning: unused parameter 'inode'
../char_dev/chardev.c:103: warning: unused parameter 'file'
../char_dev/chardev.c: At top level:
../char_dev/chardev.c:119: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'device_read'
../char_dev/chardev.c:164: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'device_write'
make: *** [chardev.o] Error 1
make: Leaving directory `/opt/QtSDK/Project/char_dev-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK_______'
15:43:10: Процесс «/usr/bin/make» завершился с кодом 2.
Возникла ошибка при сборке проекта char_dev (цель: Desktop)
Во время выполнения сборки на этапе «Сборка»


Как настроить работу в QT4?

Сообщение отредактировал ViGOur - 28.3.2012, 15:20
Причина редактирования: Учимся использовать тэг CODE, expand можно попробовать на следующем уроке. ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 28.3.2012, 21:38
Сообщение #16


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


конечно, вряд ли кто-то собирает модули ядра таким экзотическим образом и я с Qt вообще дел не имею, но как вариант: модуль ядра нужно собирать той же версией компилятора, которая использовалась для сборки самого ядра. не знаю, как это указать Qt Creator'у. можно просто линк g++ подменить.
а так, всё равно есть ощущение, что он тупо не находит нужные ему файлы, о чём сразу и сообщает. проверить, что юзер имеет доступ к каталогу сборки модулей. проверить, что линки build и sources в каталоге сборки указывают на место, где лежит сорц ядра (или хотя бы хэдеры). ещё возможно, Creator'у нужно как-то принудительно указать рабочий каталог. по ходу, он пытаетcя собрать модуль прямо там, где он лежит. в этом случае ничего не соберётся, естественно. но про настройки Qt Creator'а я ничего не знаю, увы.

Сообщение отредактировал Iron Bug - 28.3.2012, 21:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Zaca
  опции профиля:
сообщение 29.3.2012, 9:22
Сообщение #17


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 22.3.2012
Пользователь №: 3281

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо за помощь.

Наверно действительно надо делать так, как советуют: в редакторе текст, компиляция Makefile.

Это, наверно, винда развратила - неистребимое желание иметь все в одном флаконе...)


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 29.3.2012, 10:57
Сообщение #18


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Zaca @ 29.3.2012, 12:22) *
Наверно действительно надо делать так, как советуют: в редакторе текст, компиляция Makefile.

Это, наверно, винда развратила - неистребимое желание иметь все в одном флаконе...)

да как-то и под вендой драйвера из makefile'ов собираются. по крайней мере, мне не приходило в голову их собирать как-то иначе. возможно, что у студии сейчас есть какие-то приблуды для KMDF, но раньше ничего подобного точно не было и я как-то по привычке пишу файлы сборки для дров, что в венде, что в лине.

при сборке через makefile исключается возможность влияния лишних параметров типа переменных среды конкретной оболочки, всяких там хитрых путей поиска и т.п. а писать сам код можно где угодно, это кому как больше нравится.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 29.3.2012, 20:11
Сообщение #19


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


Я все планирую создать плагин для QtCreator для сборки драйверов и всяких модулей ядра.
Но пока все как-то нет времени.
Если есть желание помочь - то ссылка на проект тут

https://gitorious.org/qt-creator-drivers-bu...-manager-plugin
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V  < 1 2
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 19.6.2025, 14:31