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");
Wenn Sie mit uns Ihr endgültiges Ziel teilen - wir wären wahrscheinlich besser. Scheint wie [XY Frage] (http://xyproblem.info/) zu mir. –
@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. –
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. –