Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Treiber für Kernel 2.4 auf 2.6 portieren



Navy2k
26-10-2006, 14:39
Hi, ich verzweifel schon seit Stunden daran. Ich hab folgendes Modul -->



#ifndef __KERNEL__
#define __KERNEL__
#endif

#ifndef MODULE
#define MODULE
#endif

#include <linux/module.h>
#include <linux/version.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/cdev.h>
#include <asm/uaccess.h>


#define MAJOR_NUMBER 254
#define DEVICE_NAME "scull"
#define MAX_DEVICE 2



MODULE_LICENSE("GPL");


/* scull_size is the default value for the size of the array */

unsigned int scull_size = 1000;


/* MODULE_PARM is a macro which initialises module-variables at load time.
In this case, scull_size is the variable to be initialised
and i is the type of the varialbe. (i stands for Integer) */


// MODULE_PARM (scull_size, "i"); //Das Makro MODULE_PARM ist durch die Makros module_param, module_param_array und module_param_string ersetzt worden.

module_param(scull_size, int, 0);


ssize_t scull_write(struct file *, const char *, size_t, loff_t *);
ssize_t scull_read(struct file *, char *, size_t, loff_t *);
int scull_release (struct inode *, struct file *);
int scull_open(struct inode *, struct file *);


// old-fashioned Style

/*
struct file_operations scull_fops = {

NULL,NULL,scull_read,scull_write,NULL,NULL,NULL,NU LL,scull_open,NULL,scull_release,NULL,NULL,NULL,NU LL,NULL,NULL,NULL
};

*/



// C99 Style

struct file_operations scull_fops = {
read: scull_read,
write: scull_write,
open: scull_open,
release: scull_release,
};



typedef struct scull
{
char *array;
int position;
} scull;

scull scull_dev[MAX_DEVICE];



int scull_open(struct inode *inode, struct file *filp)
{
int minor;
// MOD_INC_USE_COUNT; //Die Makros MOD_INC_USE_COUNT und MOD_DEC_USE_COUNT existieren nicht mehr. In Kernel 2.6 werden sie normalerweise nicht gebraucht und k�nen gel�cht werden. Kernel 2.6 versucht selbst�dig mitzuz�len, wie viele Instanzen auf ein Modul zugreifen.

/* The minor number is stored in inode->i_rdev */
minor = MINOR(inode->i_rdev);

if ((minor < 0) || (minor >= MAX_DEVICE))
{
printk ("\n Unbekanntes Ger?t!!!\n");
return -ENODEV;
}
printk("\nOeffnen von %s\n",DEVICE_NAME);
if (!filp)
{
printk("\nFehler beim Zugriff auf filp\n");
return -ENODEV;
}
filp->private_data = &scull_dev[minor];
return 0;
}


int scull_release (struct inode *inode, struct file *filp)
{
printk("\nSchliessen von %s\n",DEVICE_NAME);
// MOD_DEC_USE_COUNT; //Die Makros MOD_INC_USE_COUNT und MOD_DEC_USE_COUNT existieren nicht mehr. In Kernel 2.6 werden sie normalerweise nicht gebraucht und k�nen gel�cht werden. Kernel 2.6 versucht selbst�dig mitzuz�len, wie viele Instanzen auf ein Modul zugreifen.

return 0;
}

ssize_t scull_read(struct file *filp, char *buf, size_t count, loff_t *f_pos)
{
scull *dev;

printk("\nlesen von %s\n",DEVICE_NAME);
if (!filp)
{
printk("\n Fehler beim oeffnen von filp\n");
return -ENODEV;
}
dev = (scull *) filp->private_data;
if (count > dev->position)
count = dev->position;
if (copy_to_user(buf, dev->array,count))
{ printk("\nFehler bei copy_to_user\n");
return -EFAULT;
}
*f_pos -= count;
dev->position -= count;
filp->private_data = dev;
return count;
}






ssize_t scull_write(struct file *filp, const char *buf, size_t count, loff_t *f_pos)
{
scull *dev;

printk("\nschreiben von %s\n",DEVICE_NAME);
if (!filp)
{
printk("\n Fehler beim oeffnen von filp\n");
return -ENODEV;
}
dev = (scull *) filp->private_data;
if (count + dev->position >= scull_size)
{
count = scull_size - dev->position;
if (!count)
{
printk ("\n %s ist voll!!!\n",DEVICE_NAME);
return -ENOMEM;
}
}
if (copy_from_user( dev->array + dev->position, buf, count))
{
printk("\nFehler bei copy_from_user\n");
return -EFAULT;
}
*f_pos += count;
dev->position += count;
filp->private_data = dev;
return count;
}



int scull_init(void)
{
int result,i,e;
SET_MODULE_OWNER(&scull_fops);
printk("\n Initialisierung von %s!!!\n",DEVICE_NAME);
printk("\nGroesse von scull_size: %i\n",scull_size);
result = register_chrdev(MAJOR_NUMBER,DEVICE_NAME, &scull_fops);
if (result < 0) {
printk(KERN_WARNING "%s: major number %i kann nicht eingebunden werden \n",DEVICE_NAME, MAJOR_NUMBER);
return result;
}
for (i=0;i<MAX_DEVICE;++i)
{
if(!(scull_dev[i].array = (char *) kmalloc(GFP_KERNEL, scull_size * sizeof(char))))
{
printk ("\n%s: Speicherallokierung fehlgeschlagen!!",DEVICE_NAME);
for (e = 0;e < i; ++e)
kfree(scull_dev[i].array);
unregister_chrdev(MAJOR_NUMBER,DEVICE_NAME);
return -EFAULT;
}
scull_dev[i].position = 0;
}
return 0;
}


void scull_exit(void)
{
int i;

printk("\n Beenden von Scull!!!\n");
for (i = 0;i<MAX_DEVICE;++i)
kfree(scull_dev[i].array);
unregister_chrdev(MAJOR_NUMBER,DEVICE_NAME);

}


module_init(scull_init);
module_exit(scull_exit);




Welcher sich leider nicht mehr kompiliren lässt unter 2.6. Weiß jemand bescheid was cih noch ändern müsste?

Makefile:



TARGET := scull
WARN := -Wall
INCLUDE := -isystem /lib/modules/`uname -r`/build/include
CFLAGS := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE}
CC := gcc

${TARGET}.o: ${TARGET}.c

.PHONY: clean

clean:
rm -rf ${TARGET}.o



Das ganze is nen Demo um Studenten zu zeigen wie man Module ins System einbindet und lief unter 2.4er Kernel Tadellos. Bedingt durch SerialATA in einigen neuen Rechner sind wir jetzt auf SuSE 10.1 umgestiegen (ehemals 8.x), also is ein Rückschritt auf 2.4 auf keine Lösung.

Gruß Ben

Navy2k
26-10-2006, 14:40
Ausgabe von make:



gcc -O2 -DMODULE -D__KERNEL__ -Wall -isystem /lib/modules/`uname -r`/build/include -c -o scull.o scull.c
In file included from /usr/include/asm/percpu.h:4,
from /usr/include/asm/processor.h:24,
from /usr/include/asm/thread_info.h:17,
from /usr/include/linux/thread_info.h:21,
from /usr/include/linux/preempt.h:10,
from /usr/include/linux/spinlock.h:52,
from /usr/include/linux/capability.h:45,
from /usr/include/linux/sched.h:7,
from /usr/include/linux/module.h:10,
from scull.c:9:
/usr/include/asm-generic/percpu.h:8: error: ‘CONFIG_NR_CPUS’ undeclared here (not in a function)
In file included from /usr/include/linux/sched.h:12,
from /usr/include/linux/module.h:10,
from scull.c:9:
/usr/include/linux/jiffies.h:33:3: error: #error You lose.
/usr/include/linux/jiffies.h:204:31: error: division by zero in #if
/usr/include/linux/jiffies.h:204:31: error: division by zero in #if
/usr/include/linux/jiffies.h:204:31: error: division by zero in #if
/usr/include/linux/jiffies.h:204:31: error: division by zero in #if
/usr/include/linux/jiffies.h:204:31: error: division by zero in #if
/usr/include/linux/jiffies.h:204:31: error: division by zero in #if
/usr/include/linux/jiffies.h:204:31: error: division by zero in #if
/usr/include/linux/jiffies.h:204:31: error: division by zero in #if
/usr/include/linux/jiffies.h:204:31: error: division by zero in #if
/usr/include/linux/jiffies.h:204:31: error: division by zero in #if
/usr/include/linux/jiffies.h:204:31: error: division by zero in #if
/usr/include/linux/jiffies.h:204:31: error: division by zero in #if
/usr/include/linux/jiffies.h:204:31: error: division by zero in #if
/usr/include/linux/jiffies.h:204:31: error: division by zero in #if
/usr/include/linux/jiffies.h:204:31: error: division by zero in #if
/usr/include/linux/jiffies.h:204:31: error: division by zero in #if
/usr/include/linux/jiffies.h:248:46: error: division by zero in #if
In file included from /usr/include/linux/sched.h:12,
from /usr/include/linux/module.h:10,
from scull.c:9:
/usr/include/linux/jiffies.h: In function ‘jiffies_to_msecs’:
/usr/include/linux/jiffies.h:253: error: ‘CONFIG_HZ’ undeclared (first use in this function)
/usr/include/linux/jiffies.h:253: error: (Each undeclared identifier is reported only once
/usr/include/linux/jiffies.h:253: error: for each function it appears in.)
/usr/include/linux/jiffies.h:259:46: error: division by zero in #if
/usr/include/linux/jiffies.h: In function ‘jiffies_to_usecs’:
/usr/include/linux/jiffies.h:264: error: ‘CONFIG_HZ’ undeclared (first use in this function)
/usr/include/linux/jiffies.h:272:46: error: division by zero in #if
/usr/include/linux/jiffies.h: In function ‘msecs_to_jiffies’:
/usr/include/linux/jiffies.h:277: error: ‘CONFIG_HZ’ undeclared (first use in this function)
/usr/include/linux/jiffies.h:285:46: error: division by zero in #if
/usr/include/linux/jiffies.h: In function ‘usecs_to_jiffies’:
/usr/include/linux/jiffies.h:290: error: ‘CONFIG_HZ’ undeclared (first use in this function)
/usr/include/linux/jiffies.h: In function ‘timespec_to_jiffies’:
/usr/include/linux/jiffies.h:309: error: ‘CONFIG_HZ’ undeclared (first use in this function)
/usr/include/linux/jiffies.h:315: error: ‘SHIFT_HZ’ undeclared (first use in this function)
/usr/include/linux/jiffies.h: In function ‘jiffies_to_timespec’:
/usr/include/linux/jiffies.h:328: error: ‘CONFIG_HZ’ undeclared (first use in this function)
/usr/include/linux/jiffies.h: In function ‘timeval_to_jiffies’:
/usr/include/linux/jiffies.h:350: error: ‘CONFIG_HZ’ undeclared (first use in this function)
/usr/include/linux/jiffies.h:354: error: ‘SHIFT_HZ’ undeclared (first use in this function)
/usr/include/linux/jiffies.h: In function ‘jiffies_to_timeval’:
/usr/include/linux/jiffies.h:366: error: ‘CONFIG_HZ’ undeclared (first use in this function)
/usr/include/linux/jiffies.h:379:6: error: division by zero in #if
/usr/include/linux/jiffies.h:379:6: error: division by zero in #if
/usr/include/linux/jiffies.h:379:6: error: division by zero in #if
/usr/include/linux/jiffies.h:379:6: error: division by zero in #if
/usr/include/linux/jiffies.h:379:6: error: division by zero in #if
/usr/include/linux/jiffies.h:379:6: error: division by zero in #if
/usr/include/linux/jiffies.h:379:6: error: division by zero in #if
/usr/include/linux/jiffies.h:379:6: error: division by zero in #if
/usr/include/linux/jiffies.h:379:6: error: division by zero in #if
/usr/include/linux/jiffies.h:379:6: error: division by zero in #if
/usr/include/linux/jiffies.h:379:6: error: division by zero in #if
/usr/include/linux/jiffies.h:379:6: error: division by zero in #if
/usr/include/linux/jiffies.h:379:6: error: division by zero in #if
/usr/include/linux/jiffies.h:379:6: error: division by zero in #if
/usr/include/linux/jiffies.h:379:6: error: division by zero in #if
/usr/include/linux/jiffies.h:379:6: error: division by zero in #if
/usr/include/linux/jiffies.h: In function ‘jiffies_to_clock_t’:
/usr/include/linux/jiffies.h:380: error: ‘CONFIG_HZ’ undeclared (first use in this function)
/usr/include/linux/jiffies.h: In function ‘clock_t_to_jiffies’:
/usr/include/linux/jiffies.h:391: error: ‘CONFIG_HZ’ undeclared (first use in this function)
/usr/include/linux/jiffies.h:410:6: error: division by zero in #if
/usr/include/linux/jiffies.h:410:6: error: division by zero in #if
/usr/include/linux/jiffies.h:410:6: error: division by zero in #if
/usr/include/linux/jiffies.h:410:6: error: division by zero in #if
/usr/include/linux/jiffies.h:410:6: error: division by zero in #if
/usr/include/linux/jiffies.h:410:6: error: division by zero in #if
/usr/include/linux/jiffies.h:410:6: error: division by zero in #if
/usr/include/linux/jiffies.h:410:6: error: division by zero in #if
/usr/include/linux/jiffies.h:410:6: error: division by zero in #if
/usr/include/linux/jiffies.h:410:6: error: division by zero in #if
/usr/include/linux/jiffies.h:410:6: error: division by zero in #if
/usr/include/linux/jiffies.h:410:6: error: division by zero in #if
/usr/include/linux/jiffies.h:410:6: error: division by zero in #if
/usr/include/linux/jiffies.h:410:6: error: division by zero in #if
/usr/include/linux/jiffies.h:410:6: error: division by zero in #if
/usr/include/linux/jiffies.h:410:6: error: division by zero in #if
/usr/include/linux/jiffies.h: In function ‘jiffies_64_to_clock_t’:
/usr/include/linux/jiffies.h:411: error: ‘CONFIG_HZ’ undeclared (first use in this function)
In file included from /usr/include/linux/list.h:7,
from /usr/include/linux/wait.h:23,
from /usr/include/asm/semaphore.h:41,
from /usr/include/linux/sched.h:20,
from /usr/include/linux/module.h:10,
from scull.c:9:
/usr/include/linux/prefetch.h: In function ‘prefetch_range’:
/usr/include/linux/prefetch.h:64: error: ‘CONFIG_X86_L1_CACHE_SHIFT’ undeclared (first use in this function)
In file included from /usr/include/linux/rwsem.h:27,
from /usr/include/asm/semaphore.h:42,
from /usr/include/linux/sched.h:20,
from /usr/include/linux/module.h:10,
from scull.c:9:
/usr/include/asm/rwsem.h: In function ‘__down_read’:
/usr/include/asm/rwsem.h:105: error: expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
/usr/include/asm/rwsem.h: In function ‘__down_write’:
/usr/include/asm/rwsem.h:157: error: expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
/usr/include/asm/rwsem.h: In function ‘__up_read’:
/usr/include/asm/rwsem.h:194: error: expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
/usr/include/asm/rwsem.h: In function ‘__up_write’:
/usr/include/asm/rwsem.h:220: error: expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
/usr/include/asm/rwsem.h: In function ‘__downgrade_write’:
/usr/include/asm/rwsem.h:245: error: expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
In file included from /usr/include/linux/sched.h:20,
from /usr/include/linux/module.h:10,
from scull.c:9:
/usr/include/asm/semaphore.h: In function ‘down’:
/usr/include/asm/semaphore.h:105: error: expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
/usr/include/asm/semaphore.h: In function ‘down_interruptible’:
/usr/include/asm/semaphore.h:130: error: expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
/usr/include/asm/semaphore.h: In function ‘down_trylock’:
/usr/include/asm/semaphore.h:155: error: expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
/usr/include/asm/semaphore.h: In function ‘up’:
/usr/include/asm/semaphore.h:179: error: expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
In file included from /usr/include/linux/gfp.h:4,
from /usr/include/linux/slab.h:15,
from /usr/include/linux/percpu.h:5,
from /usr/include/linux/sched.h:34,
from /usr/include/linux/module.h:10,
from scull.c:9:
/usr/include/linux/mmzone.h: At top level:
/usr/include/linux/mmzone.h:41: error: ‘CONFIG_X86_L1_CACHE_SHIFT’ undeclared here (not in a function)
/usr/include/linux/mmzone.h:41: error: requested alignment is not a constant
/usr/include/linux/mmzone.h:64: error: requested alignment is not a constant
/usr/include/linux/mmzone.h:249: error: requested alignment is not a constant
In file included from /usr/include/linux/sched.h:37,
from /usr/include/linux/module.h:10,
from scull.c:9:
/usr/include/linux/rcupdate.h:69: error: requested alignment is not a constant
/usr/include/linux/rcupdate.h:72: error: requested alignment is not a constant
In file included from /usr/include/linux/module.h:23,
from scull.c:9:
/usr/include/asm/module.h:62:2: error: #error unknown processor family
In file included from /usr/include/asm/fixmap.h:27,
from /usr/include/asm/pgtable.h:17,
from /usr/include/linux/mm.h:38,
from scull.c:14:
/usr/include/asm/acpi.h:31:28: error: acpi/pdc_intel.h: Datei oder Verzeichnis nicht gefunden
In file included from scull.c:14:
/usr/include/linux/mm.h: In function ‘lowmem_page_address’:
/usr/include/linux/mm.h:517: error: ‘CONFIG_PAGE_OFFSET’ undeclared (first use in this function)
scull.c: In function ‘scull_init’:
scull.c:178: warning: implicit declaration of function ‘SET_MODULE_OWNER’
make: *** [scull.o] Fehler 1

Navy2k
30-10-2006, 14:29
Okay, ich geb zu das es nicht viele Leute geben wird die mir helfen können :D aber evtl kann mir jemand sagen wo ich diese Leute finde? Gibt es ein Forum das sich rein mit Kernelmodul-Entwicklung beschäftigt?

Gruß Ben

anda_skoa
30-10-2006, 15:37
Vermutlich sind die Leute, die Kernelentwicklung machen, eher auf Mailinglisten und in Usenew Newsgroups anzutreffen.

Ciao,
_

Navy2k
31-10-2006, 09:53
Es fehlt eindeutig ein "Ugly-Smilie" :D

Danke für den Tip.

Bin aber glaub schon nen Schritt vorwärts gekommen:

CONFIG_NR_CPUS is ne Option in der .config die bei meinem aktuellen KErnel fehlt, werd ich mal testen.

Navy2k
06-11-2006, 14:16
Bin noch ein wenig weiter:

Im makefile musste noch KBUILD_BASENAME und KBUILD_MODNAME eingebaut werden.

svetlana
09-11-2006, 07:22
Hallo Navy2k,

versuche es mit folgendem Makefile:

ifneq ($(KERNELREALEASE),)
obj-m := filename.o
else
KDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)

all:
(TAB) $(MAKE) -C $(KDIR) M=$(PWD) modules

endif

Vielleicht bringt es was.