Treiber Entwicklung Linux Debian 6.0 amd64

10/09/2012 - 23:05 von Jens Kallup | Report spam
Hallo Gemeinde,

habe fölgenden C Code eines Treibers, den ich erfolgreich Compilieren und installieren konnte.
Es wird einfach Hello World ausgegeben, wenn man den Treiber ausliest.
Mein nàchster Schritt wàre jetzt, verschiedene Strings zurück zuliefern, wenn man unterschiedliche Parameter angeben könnte.
Doch weiss ich nicht wie man das machen könnte.
Vielleicht hat hier jemand mehr Ahnung?

Und als Phase 2 will ich dann einen String zurückliefern - natürlich unter Intel 32 Bit Assembler.
Soviel ich weiss, muss man einen 0x80 Syscall machen, um eine Datei zu öffnen (Treiber), um dadrauf dann operationen auszuführen-
Das wollte ich dann in ASM machen - jenamand da, der Tipps und Code zur Verfügung stellen kann?
Danke Schonmal zum Geleit


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

#define DRIVER_MAJOR 240

MODULE_AUTHOR("Jens Kallup");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("dBase-Helper libcaller");
MODULE_SUPPORTED_DEVICE("none");

static char hello_world[]="Hello World";

static int driver_open( struct inode *geraete_datei, struct file *instanz )
{
printk("driver_open called");
return 0;
}

static int driver_close( struct inode *geraete_datei, struct file *instanz )
{
printk("dbase helper driver_close called");
return 0;
}

static ssize_t driver_read( struct file *instanz, char *user, size_t count,
loff_t *offset )
{
int not_copied, to_copy;

to_copy = strlen(hello_world)+1;
if( to_copy > count )
to_copy = count;

static int f=0;
if (!f)
{
f=1;
not_copied=copy_to_user(user,hello_world,to_copy);
return to_copy-not_copied;
}
f=0;
return 0;
}

static struct file_operations fops = {
.owner= THIS_MODULE,
.read= driver_read,
.open= driver_open,
.release= driver_close,
};

static int __init mod_init(void)
{
if(register_chrdev(DRIVER_MAJOR, "dBaseHelper", &fops) == 0)
return 0;
printk("dbase helper register_chrdev failed!");
return -EIO;
}

static void __exit mod_exit(void)
{
unregister_chrdev(DRIVER_MAJOR,"dBaseHelper");
}

module_init( mod_init );
module_exit( mod_exit );


Gruß
Jens
 

Lesen sie die antworten

#1 Jan Seiffert
11/09/2012 - 21:30 | Warnen spam
Jens Kallup schrieb:
Hallo Gemeinde,

habe fölgenden C Code eines Treibers, den ich erfolgreich Compilieren und installieren konnte.
Es wird einfach Hello World ausgegeben, wenn man den Treiber ausliest.
Mein nàchster Schritt wàre jetzt, verschiedene Strings zurück zuliefern, wenn man unterschiedliche Parameter angeben könnte.
Doch weiss ich nicht wie man das machen könnte.



Das kommt darauf an was du mit Parametern meinst.
Entweder du fügst einen Modul-Parameter hinzu, der wàhrend des ladens des Treibers
gesetzt wird. Dieser bleibt dann aber so.
=> Siehe module_param

Du hast da ja einen Char driver gebaut. Das heist du kannst auch Daten in
den Kernel senden. So könntest du den Parameter übergeben.

Oder oder oder.
Es gibt viele Wege, einige sind nur hàsslich/sollte man nicht verwenden.

Vielleicht hat hier jemand mehr Ahnung?

Und als Phase 2 will ich dann einen String zurückliefern - natürlich unter Intel 32 Bit Assembler.



Willst du das kernel-modul in Assembler schreiben? Lass es.
Oder willst du das Modul aus Assembler ansprechen?

Soviel ich weiss, muss man einen 0x80 Syscall machen,



Ich tippe das Modul ansprechen.
int 0x80.
Aber eigentlich sollte man heutzutage über das linux callgate in der vdso gehen.

um eine Datei zu öffnen (Treiber),



Jo, du rufst den open syscall auf.

um dadrauf dann operationen auszuführen



read, write, etc.

Das wollte ich dann in ASM machen - jenamand da, der Tipps und Code zur Verfügung stellen kann?



schmeiss mal "linux int 0x80" in google

Danke Schonmal zum Geleit


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

#define DRIVER_MAJOR 240

MODULE_AUTHOR("Jens Kallup");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("dBase-Helper libcaller");
MODULE_SUPPORTED_DEVICE("none");

static char hello_world[]="Hello World";




const

static int driver_open( struct inode *geraete_datei, struct file *instanz )
{
printk("driver_open called");



log level fehlt

return 0;
}

static int driver_close( struct inode *geraete_datei, struct file *instanz )
{
printk("dbase helper driver_close called");



dito

return 0;
}

static ssize_t driver_read( struct file *instanz, char *user, size_t count,
loff_t *offset )
{
int not_copied, to_copy;

to_copy = strlen(hello_world)+1;
if( to_copy > count )
to_copy = count;

static int f=0;
if (!f)
{
f=1;



Soll das locking sein?
Bitte gehen sie in den Userspace.
Programmieren sie keine Kernel-Treiber,
ziehen sie keine...

1) Der Kernel bietet locking-Primitive, die auch funktionieren.

2) bist du sicher, das da was gelockt werden muss?

not_copied=copy_to_user(user,hello_world,to_copy);
return to_copy-not_copied;
}
f=0;
return 0;



Hier wàre die Rückgabe dann nicht 0 sondern -EIO
oder -EAGAIN oder -EWOULDBLOCK oder sowas.

(Achtung, welcher richtig ist, ist nicht ganz einfach zu sagen)

}

static struct file_operations fops = {
.owner= THIS_MODULE,
.read= driver_read,
.open= driver_open,
.release= driver_close,
};

static int __init mod_init(void)
{
if(register_chrdev(DRIVER_MAJOR, "dBaseHelper", &fops) == 0)
return 0;
printk("dbase helper register_chrdev failed!");
return -EIO;
}



int res = register_chrdev(...)
if(res) {
printk(KERN_ERR "...");
return res;
}
return 0;


static void __exit mod_exit(void)
{
unregister_chrdev(DRIVER_MAJOR,"dBaseHelper");
}

module_init( mod_init );
module_exit( mod_exit );


Gruß
Jens




Gruss
Jan

Ähnliche fragen