2016-06-03 17 views
0

Ich plane ein Linux-Kernel-Modul zu erstellen, das mit einem User-Space-Gerätetreiber verbunden werden muss, und ich muss Daten in User-Space exportieren. Nach einigem Lesen dachte ich, dass die UIO-Schnittstelle vielleicht das ist, was ich brauche.Kann ein Linux-Kernel-Modul UIO verwenden, wenn es keine physische Hardware verwendet?

sah ich einige Beispiele, und sie sind alle auf der Annahme, dass die Kernel-Modul selbst direkt mit der Hardware interagieren und das Bezug Dinge wie eine Vorrichtungsstruktur, Alarme etc.

Ist es möglich, ein zu schreiben Software nur Kernel-Modul und immer noch die UIO-Bibliothek? Oder wäre die Verwendung von sysfs direkt ein besserer Ansatz?

BEARBEITEN: Ich füge einen Testcode an, an dem ich gerade arbeitete. Das Ziel war es, eine Zeichenfolge aus User-Space über die UIO-Schnittstelle zu lesen, aber ich glaube nicht, dass dies funktioniert, da ich nicht sehen kann, wie man eine struct device richtig einleitet, die ich für uio_register_device benötige.

#include <linux/module.h> // Needed by all modules 
#include <linux/kernel.h> // Needed for KERN_ALERT 

#include <linux/uio_driver.h> 
#include <linux/slab.h> // GFP_ defs 
#include <linux/device.h> 

char test_data[] = "This is some test data to read in user-space via UIO\n"; 

int init_module(void) 
{ 
    struct uio_info *info; 
    struct device *dev; 
    info = kzalloc(sizeof(struct uio_info), GFP_KERNEL); 
    if (!info) 
    return -ENOMEM; 

    // need to use struct device for uio_register_device 
    dev = kzalloc(sizeof(struct device), GFP_KERNEL); 
    dev->parent = 0; 
    dev->init_name = "UIO test driver"; 

    info->name = "uio_test"; 
    info->version = "0.0.1"; 

    info->mem[0].size = sizeof(test_data); 
    info->mem[0].memtype = UIO_MEM_LOGICAL; 
    info->mem[0].addr = (phys_addr_t) kmalloc(sizeof(test_data), GFP_KERNEL); 
    snprintf((char *) info->mem[0].addr, sizeof(test_data), "%s", test_data); 

    info->irq = UIO_IRQ_NONE; 

    // now we need to register the device for it to create /dev/uioN and sysfs files 
    if (uio_register_device(dev, info)) { 
    printk(KERN_ALERT "uio_test: couldn't register UIO device\n"); 
    kfree(dev); 
    kfree((char *) info->mem[0].addr); 
    kfree(info); 
    return -ENODEV; 
    } 

    printk(KERN_ALERT "uio_test: init complete\n"); 

    return 0; 
} 


void cleanup_module(void) 
{ 
    printk(KERN_ALERT "uio_test: exit\n"); 
} 

MODULE_LICENSE("GPL"); 
+0

Wenn Sie mit uns Ihr endgültiges Ziel teilen - wir wären wahrscheinlich besser. Scheint wie [XY Frage] (http://xyproblem.info/) zu mir. –

+0

@SamProtsenko Sorry für den Mangel an Details, aber im Sinne Ihres anderen Kommentars ist mein endgültiges Ziel tatsächlich eine Netzwerkkomponente, die neben TCP/IP sitzen und einen Benutzerraumtreiber für ein softwaredefiniertes Radio verwenden würde. Ich möchte also einen Kernel-Space-Zugriff für das Netzwerk, aber User-Space-Einrichtungen für die Signalverarbeitung. Ich habe UIO als Möglichkeit gesehen, einen Datenpfad vom Netzwerk zur physischen Seite oben zu teilen. –

+0

Sind Sie sicher, dass Sie wirklich Ihr Netzwerk im Kernel-Space arbeiten müssen? Und warum? Vielleicht können wir Ihnen einen User-Space-Weg vorschlagen, um diese Arbeit zu erledigen, wenn Sie mehr Details mit uns teilen können. –

Antwort

1

Der ganze Punkt hinter dem Kernel-Treiber ist mit Hardware zu sprechen. Wenn Sie keine Hardware haben, benötigen Sie wahrscheinlich keinen Kernel-Treiber.

Was macht das Kernelmodul, wenn es nicht mit Hardware spricht? Woher kommen die Daten? Um Ihre Frage zu beantworten, ist es durchaus möglich, einen Kernel-Treiber zu schreiben, der nicht mit der Hardware kommuniziert und immer noch mit UIO kommuniziert, aber ich bin mir nicht sicher, was es eigentlich sagen würde.

+0

Nun, es gibt ** Kernel-Module, die nicht mit irgendeiner Hardware sprechen (zumindest direkt), aber das sind immer noch wertvolle Module. Beispiele: iptables/netfilter Module, Dateisystem Module (ext4, FUSE, etc). Außerdem sind Ihre CPU und RAM auch Hardware, und manchmal benötigen Sie ein Kernel-Modul, um diese Ressourcen direkter oder effizienter für einige benutzerdefinierte Anwendungen zu handhaben. –

+0

Ja, wir arbeiten tatsächlich an einem Netzwerkstapel von Arten. Wir möchten bestimmte Funktionen des Kernels für diese Aufgabe nutzen können, aber dann einen Benutzerraumtreiber verwenden. Ich lese immer noch die Schnittstellen für UIO und frage mich, wie ich Dinge wie die Geräte-Struktur behandeln würde, wenn ich nicht wirklich ein Hardware-Gerät habe. –

+0

@ Mr.Shickadance Was genau möchten Sie dem Benutzer-Space von Ihrem Modul aus zugänglich machen? Wie viele Daten, in welcher Form usw.? Es gibt eine Menge von Kernel-zu-Benutzer-Schnittstellen, die Sie verwenden können, UIO ist nur eine von ihnen, und vey spezifische. Bist du sicher, dass du das wirklich brauchst? –