🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#1614
Author: Jens Kallup
Date: Mon, 10 Sep 2012 23:05
87 lines
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
#1615
Author: Jan Seiffert
Date: Tue, 11 Sep 2012 21:30
157 lines
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
#1616
Author: Jens Kallup
Date: Wed, 12 Sep 2012 15:46
8 lines
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
#1617
Author: Jan Seiffert
Date: Wed, 12 Sep 2012 22:59
26 lines
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
#1618
Author: Jens Kallup
Date: Thu, 13 Sep 2012 16:30
21 lines
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
#1619
Author: Jan Seiffert
Date: Thu, 13 Sep 2012 20:24
41 lines
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