Перейти к содержанию

Рекомендуемые сообщения

Опубликовано

Возникла проблема написания своего драйвера для символьного устройства.

При загрузке драйвера выдается сообщение:

insmod: error inserting 'mydrv.ko': -1 Unknown symbol in module

Сообщения при компиляции:

make -C /lib/modules/2.6.9-1.667asp/build M=/home/Nikolai modules

make[1]: Entering directory `/lib/modules/2.6.9-1.667asp/build'

Building modules, stage 2.

MODPOST

*** Warning: "mydrv_minor" [/home/Nikolai/mydrv.ko] undefined!

*** Warning: "mydrv_major" [/home/Nikolai/mydrv.ko] undefined!

make[1]: Leaving directory `/lib/modules/2.6.9-1.667asp/build'

Я чтото не доопределил или напутал с определение переменных..... Подскажите:

Исходный текст заголовочного файла mydirect.h:

#define mydrv_major 0;

#define mydrv_minor;

Исходный текст модуля mydrv.c:

#include <linux/kernel.h>

#include <linux/init.h>

#include <linux/module.h>

#include <linux/ioport.h>

#include <linux/errno.h>

#include <linux/fs.h>

#include <linux/kdev_t.h>

#include <linux/types.h>

MODULE_LICENSE("DUAL BSD/GPL");

MODULE_AUTHOR ("Dorofeev Nikolai Viktorovich");

MODULE_SUPPORTED_DEVICE ("ADC card");

extern mydrv_major;

extern mydrv_minor;

int dev;

int result;

int mydrv_nr_devs;

static int __init my_init(void)

{

if (mydrv_major)

{dev=MKDEV(mydrv_major,mydrv_minor);

result=register_chrdev_region(dev,mydrv_nr_devs,"mydrv");

}else

{result=alloc_chrdev_region(&dev,mydrv_minor,mydrv_nr_de vs, "mydrv");

mydrv_major=MAJOR(dev);

}

if (result<0)

{printk(KERN_WARNING "mydrv: can't get major %d\n",mydrv_major);

return result;

}

printk(KERN_ALERT "Govno\n");

return 0;

};

static int my_detect(unsigned int port, unsigned int range)

{

int err;

if ((err=check_region(port,range))<0) return err;

request_region(port,range,"skull");

return 0;

}

static void __exit my_cleanup(void)

{

result=unregister_chrdev(dev,mydrv_nr_devs);

if (result<0)

{printk(KERN_WARNING "mydrv: can't unregister dev\n");

return result;

}

printk(KERN_ALERT "Da\n");

};

module_init(my_init);

module_exit(my_cleanup);

Исходный текст makefile:

ifneq ($(KERNELRELEASE),)

obj-m := mydrv.o

else

KERNELDIR ?= /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

default:

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

endif

Исходный текст скрипта загрузки модуля mydrv_load:

#!/bin/sh

module="mydrv"

device="ADC"

mode="664"

# invoke insmod with all arguments we were passed

# and use a pathname, as newer modutils don't look in . by default

/sbin/insmod -f ./$module.ko $* || exit 1

# remove stale nodes

rm -f /dev/${device}[0]

major=$(awk "\\$2==\"$module\" {print \\$1}" /proc/devices)

mknod /dev/${device}0 c $major 0

# give appropriate group/permissions, and change the group.

# Not all distributions have staff; some have "wheel" instead.

group="staff"

grep -q '^staff:' /etc/group || group="wheel"

chgrp $group /dev/${device}[0]

chmod $mode /dev/${device}[0]

Заранее, благодарен!!!

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...