Ich arbeite gerade an einem Modul mit Schnittstelle ins Userland, um die Kernspannungen von Centrino-CPUs im laufenden Betrieb zu ändern. Dafür benötige ich ein einfaches SysFS-Interface. Ich habe mir einige der Kernel-Module angeschaut, die SysFS benutzen, allerdings finde ich die Dokumentation bzgl. kobjects mehr als dürftig. Ich kann zwar Dateien anlegen (diese existieren dann auch wirklich in dem entsprechenden virtuellen Ordner), die show bzw. store Funktion SIGSEGV aber jedesmal. Dann kann ich das Modul nicht mehr "rmmod"den und muss neu Booten. Dadurch ist die Fehlersuche sehr aufwendig. Die unten gepostete Variante funktioniert gar nicht, ist aber denke ich vom Ansatz her viel besser.
Wenn jemand einen einfachen und kurzen Source posten könnte wäre das super. Was ich bis jetzt habe funktioniert wahrscheinlich nicht, weil ich folgendes KObject verwende:
&(centrino_driver.owner)->mkobj.kobj
Ich stelle mir die Lösung so ähnlich vor:
struct kobject sysFS_Interface= { .name="test", }; struct device_attribute irgendEtwas= { .attr = {.name="xyz", .mode = 0644}, .show = show_value, .store= store_value, }; static struct sysfs_ops sysfs_ops = { .show = show, .store = store, }; static struct attribute * default_attrs[] = { &(irgendEtwas).attr, NULL }; static struct kobj_type ktype_Testing= { .sysfs_ops = &sysfs_ops, .default_attrs = default_attrs, // <- Denke mal das pass tso wie oben definiert .release = ???, // <- Was soll hier hin? }; static ssize_t show_value(struct kobject * kobj, struct attribute * attr ,char * buf) { return sprintf (buf, "TEST"); } static ssize_t store(struct kobject * kobj, struct attribute * attr, const char * buf, size_t count) { int freq; int ret = sscanf (buf, "%u", &freq); if (ret != 1) return -EINVAL; return count; } [ ... Code ... ] // in der Init-Routine: sysFS_Interface.ktype=&ktype_Testing; kobject_register (&sysFS_Interface); struct attribute **defAttr= default_attrs; // Create File in SysFS: while ((defAttr) && (*defAttr)) { sysfs_create_file(&sysFS_Interface, (*defAttr)); defAttr++; } // Rest vom Programm ...
So in etwa. Kann mir jemand sagen, was da falsch ist? Vielen Dank. Auch alternative Vorschläge werden dankend angenommen. Leider hat auch das Buch von Robert Love mir auch nicht wirklich weitergeholfen, da alles bzgl. SysFS recht knapp abgehandelt ist. In C bin ich leider nicht so bewandert (etwas Erfahrung mit C++ und Qt/KDE sowie MFC-Programmierung).
Ziel ist wie gesagt lediglich das Einlesen von UINTs und deren Ausgabe.