Ich habe ein Linux-Kernel-Modul, das während seiner Initialisierungsroutine eine 4KB große Struktur in den Kernel-Speicher schreibt. Ich möchte diesen Speicher freigeben, sodass ein einzelner Userspace-Prozess schreibgeschützten Zugriff auf diese Struktur haben kann.
Mir wurde gesagt, dass ich die Verwendung von IOCTLS vermeiden sollte, da dies nicht der beste Weg ist, dies zu tun. Aus dem was ich gelesen habe, wäre es am besten, die Funktion mmap
zu verwenden Ich bin ein wenig verwirrt darüber, wie ich implementieren kann, was ich in C brauche.
Ich habe mit der Funktion shmget
gesucht, aber es scheint, dass dies für Userspace-Apps gedacht ist, die IPC-Funktionalität benötigen.
Jeder Rat oder besser ein einfaches Beispiel würde sehr geschätzt werden.
Danke!
Sie können dies nicht sicher mit einem direkten Zugriffsmechanismus wie mmap tun, weil dann jeder es benutzen kann.
In Linux sind Benutzerspeicher und Kernelspeicher unabhängig und in separaten Adressräumen implementiert. Die Adressräume sind virtualisiert, was bedeutet, dass die Adressen vom physischen Speicher abstrahiert werden. Da die Adressräume virtualisiert sind, können viele existieren. Tatsächlich befindet sich der Kernel selbst in einem Adressraum und jeder Prozess befindet sich in seinem eigenen Adressraum. Diese Adressräume bestehen aus virtuellen Speicheradressen, wodurch viele Prozesse mit unabhängigen Adressräumen auf einen wesentlich kleineren physikalischen Adressraum (den physikalischen Speicher in der Maschine) verweisen können. Dies ist nicht nur praktisch, sondern auch sicher, da jeder Adressraum unabhängig und isoliert und daher sicher ist.
Aber mit dieser Sicherheit sind Kosten verbunden. Da jeder Prozess (und der Kernel) identische Adressen haben können, die sich auf verschiedene Bereiche des physischen Speichers beziehen, ist es nicht sofort möglich, Speicher gemeinsam zu nutzen. ( source )