Thread View: de.comp.lang.assembler
6 messages
6 total messages
Started by Jens Kallup
Mon, 10 Sep 2012 23:05
Treiber Entwicklung Linux Debian 6.0 amd64
Author: Jens Kallup
Date: Mon, 10 Sep 2012 23:05
Date: Mon, 10 Sep 2012 23:05
87 lines
2402 bytes
2402 bytes
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\n"; static int driver_open( struct inode *geraete_datei, struct file *instanz ) { printk("driver_open called\n"); return 0; } static int driver_close( struct inode *geraete_datei, struct file *instanz ) { printk("dbase helper driver_close called\n"); 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!\n"); return -EIO; } static void __exit mod_exit(void) { unregister_chrdev(DRIVER_MAJOR,"dBaseHelper"); } module_init( mod_init ); module_exit( mod_exit ); Gruß Jens
Re: Treiber Entwicklung Linux Debian 6.0 amd64
Author: Jan Seiffert
Date: Tue, 11 Sep 2012 21:30
Date: Tue, 11 Sep 2012 21:30
157 lines
3893 bytes
3893 bytes
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\n"; > const > static int driver_open( struct inode *geraete_datei, struct file *instanz ) > { > printk("driver_open called\n"); log level fehlt > return 0; > } > > static int driver_close( struct inode *geraete_datei, struct file *instanz ) > { > printk("dbase helper driver_close called\n"); 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!\n"); > 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
Re: Treiber Entwicklung Linux Debian 6.0 amd64
Author: Jens Kallup
Date: Wed, 12 Sep 2012 15:46
Date: Wed, 12 Sep 2012 15:46
8 lines
219 bytes
219 bytes
genauer gesagt, will ich erreichen, dass ich dll laden kann und Funktionen daraus aufrufen kann. geht das mit "sys_open"? wie komme ich dann an die Funktion ran? Wenn ihr Codesnippet habt wäre das sehr toll Gruß Jens
Re: Treiber Entwicklung Linux Debian 6.0 amd64
Author: Jan Seiffert
Date: Wed, 12 Sep 2012 22:59
Date: Wed, 12 Sep 2012 22:59
26 lines
476 bytes
476 bytes
Jens Kallup schrieb: > genauer gesagt, will ich erreichen, dass ich dll laden kann und Funktionen daraus aufrufen kann. > geht das mit "sys_open"? Höh? Von wo nach wo? wer soll was wo laden? Kernel soll DLL laden? oder userspace? oder wie oder was? ich weiss nicht so ganz was du meinst und sage: man dlopen Das hat nur nix mit dem Kernel zu tun. > wie komme ich dann an die Funktion ran? > Wenn ihr Codesnippet habt wäre das sehr toll > > Gruß > Jens > Gruss Jan
Re: Treiber Entwicklung Linux Debian 6.0 amd64
Author: Jens Kallup
Date: Thu, 13 Sep 2012 16:30
Date: Thu, 13 Sep 2012 16:30
21 lines
647 bytes
647 bytes
Hallo Jan, Jan Seiffert Wrote: > Jens Kallup schrieb: > > genauer gesagt, will ich erreichen, dass ich dll laden kann und Funktionen daraus aufrufen kann. > > geht das mit "sys_open"? > > Höh? > > Von wo nach wo? > wer soll was wo laden? > Kernel soll DLL laden? > oder userspace? > oder wie oder was? > ich wollte nur nachfragen, ob es eine Möglichkeit gibt, per SysCall oderTreiber, die dlopen ausführen und Funktionen laden können- Ich Frage deshalb, weil ich im Moment auf niedrigsten Level ELF Programmiere und die erster ELF 400 bytes groß ist und einen int 0x80 SysCall macht, um wieder aus der ELF zurück zur Shell zu kehren. Jens
Re: Treiber Entwicklung Linux Debian 6.0 amd64
Author: Jan Seiffert
Date: Thu, 13 Sep 2012 20:24
Date: Thu, 13 Sep 2012 20:24
41 lines
1053 bytes
1053 bytes
Jens Kallup schrieb: > Hallo Jan, > > Jan Seiffert Wrote: > >> Jens Kallup schrieb: >>> genauer gesagt, will ich erreichen, dass ich dll laden kann und >>> Funktionen daraus aufrufen kann. geht das mit "sys_open"? >> >> Höh? >> >> Von wo nach wo? wer soll was wo laden? Kernel soll DLL laden? oder >> userspace? oder wie oder was? >> > > ich wollte nur nachfragen, ob es eine Möglichkeit gibt, per SysCall > oderTreiber, die dlopen ausführen und Funktionen laden können- Nein. Das ist nicht Kernel-Sache. Das macht der Runtime-Linker, im Userspace. Der Kernel liefert dem Runtime-Linker syscalls wie open, mmap, read, write mprotect, etc. um das Ziel zu erreichen, aber .so werden im Userspace aufgelöst. > Ich > Frage deshalb, weil ich im Moment auf niedrigsten Level ELF > Programmiere und die erster ELF 400 bytes groß ist und einen int 0x80 > SysCall macht, um wieder aus der ELF zurück zur Shell zu kehren. > Linke mit -ldl (halt der libdl.so) und rufe die Funktionen darin auf. Ganz normal mit "call". > Jens > Gruss Jan
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads