Module / Erstellen / Make / Testen / POC / Probe / Notizen / Haftungsausschluss / Lizenz / Bücher / Links
Die Sandbox von Linux Kernel Modul (LKM) ist eine Sammlung verschiedener Module, die mit der Entwicklung von Linux -Kernelmodulen lernen, entdecken und experimentieren können. Der Zweck dieses Repositorys besteht auch darin, die Entwicklung innerhalb des Linux -Kernels zu praktizieren und verschiedene Konzepte zu studieren, bevor er den ersten Patch dem Kernel übermittelt.
Die meisten Module veranschaulichen ein Konzept und zeigen, wie die Kernel -API verwendet wird. Einige der Module kombinieren mehr als ein Konzept, um zu präsentieren, wie Konzepte zusammenarbeiten. Zum Beispiel greift das Modul LKM_DEVICE auf ein Zeichengerät zu und speichert seine Hauptnummer in /proc. Oder das Modul LKM_MEM enthält auch Speicher- /Swap -Informationen nach Dateien in /proc.
Ich hoffe, es kann für andere Entwickler wertvoll sein, die versuchen, sich dem Linux -Kernel zu nähern.
| NEIN. | Modul | Quelle | Beschreibung |
|---|---|---|---|
| 1 | LKM -Debugfs | lkm_debugfs.c | Modul zeigt, wie die Debugging -Dateisystem -Debugfs verwendet werden |
| 2 | LKM -Gerät | lkm_device.c | Modul zeigt, wie man mit Charaktergeräten arbeitet und Geräteinformationen in /proc speichert |
| 3 | LKM -Gerätenummern | lkm_device_numbers.c | Statisch und dynamisch zugewiesene Gerätezahlen veranschaulichen |
| 3 | LKM -Speicher | lkm_mem.c | Modul, das Speicher aussetzen und Informationen in /proc eintauschen |
| 4 | LKM-Speicher-basiertes Gerät | lkm_mev.c | Treiber für ein auf Speicher basierendes Zeichengerät, das in gewissem Maße auf Scull basiert und im Buch Linux-Gerätetreiber, Kapitel 3 entwickelt wurde, entwickelt |
| 5 | LKM -Parameter | lkm_parameters.c | Modul zum Übergeben von Parametern von Benutzer- an Kernelspace |
| 6 | LKM Printk | lkm_pp.c | Modul zum Testen der Integration von Printk |
| 7 | LKM Proc | lkm_proc.c | Modulzugriff auf /proc -Dateisystem mit sequentiellem E /O |
| 8 | LKM -Prozess | lkm_process.c | Zugriff auf und drucken aktuelle Prozessinformationen |
| 9 | LKM Sandbox | lkm_sandbox.c | Sandboxmodul für verschiedene Experimente |
| 10 | LKM -Skelett | lkm_skeletton.c | Skelettmodul zum schnelleren Gerüst neuer Module |
Wenn Sie zum ersten Mal klonieren, klonen Sie bitte auch Submodules mit --recurse-submodules um auch Printk zu bekommen.
git clone --recurse-submodules [email protected]:tpiekarski/lkm-sandbox.gitmake clean && make
So führen Sie alle verfügbaren Tests aus, einschließlich grundlegender Laden/Entladen und alle zusätzlichen Konzepttests.
make testTesten durch Laden, Entladen und Ausgabe von Kernel -Ringpuffer (sudo fordert Wurzelberechtigungen an).
make test-module name= < module-name > Zusätzliche Tests für das Sandbox-Gerät, einschließlich Lademodul, Sammeln von Major-Gerätenummer von /Proc, Erstellen von Geräten und Vergleich der endgültigen Meldung. Führen Sie entweder das Makefile-Ziel mit make test-device aus oder führen Sie die folgenden Befehle aus.
Zum Erstellen von Zeichengerät wird die Hauptnummer benötigt und kann erhalten werden, indem die Datei /proc /lkm_device_major gerät. Diese Hauptnummer wird auch in den Kernel -Ringpuffer geschrieben. Es ist möglich, diese Hauptnummer unter Verwendung des Modulparameters param_major_num anzugeben und dieses Modul wie sudo insmod lkm_device.ko param_major_num=241 zu laden (in diesem Moment scheint diese statische Zuweisung nicht zuverlässig zu funktionieren. Die Registrierung des Sandkasten -Geräts scheitert manchmal.
sudo insmod lkm_device.ko
dmesg | grep " Registered sandbox device "
sudo mknod /dev/lkm_device c $( cat /proc/lkm_device_major ) 0
test -c /dev/lkm_device && cat /dev/lkm_device || echo " Device /dev/lkm_device " not found. "
sudo rmmod lkm_device Zusätzliche Tests für Sandbox -Zugriff auf /proc, einschließlich des Ladenmoduls, Tests, ob die Datei in /proc existiert und diese Datei ausgibt. Führen Sie entweder das Makefile-Target -Test-Pro-Proc mit make test-proc oder den folgenden Befehlen aus:
sudo insmod lkm_proc.ko
test -f /proc/lkm_proc && cat /proc/lkm_proc || echo " File /proc/lkm_proc not found. "
sudo rmmod lkm_proc Für zusätzliche Tests zum Übergeben von Parametern an das Modul LKM_Parameters Führen Sie den Makefile-Target-Test-Parameter mit make test-parameters aus. Dadurch wird das Modul geladen/entladen und die Parameternummer und Meldung verglichen, das beim Laden des Moduls mit den im/sys -Dateisystem gelesenen Werten (/sys/modul/lkm_parameters/parameters/*) übergeben wurde. Oder führen Sie die folgenden Befehle aus.
sudo insmod lkm_parameters.ko number=33 message= " Some message... "
cat /sys/module/lkm_parameters/parameters/number
cat /sys/module/lkm_parameters/parameters/message
sudo rmmod lkm_parametersWährend der Triaggen, Debuggen und Arbeiten mit Fehler und Problemen kann es nützlich sein, mit einem Code zu experimentieren und einen POC zu schreiben, um einige Aussagen zu beweisen oder eine Frage zu beantworten. Im Folgenden finden Sie eine Sammlung solcher POC, die eine Führung nachweisen, um Aussagen, Ideen und Fragen zu beweisen, auf die ich kürzlich gestoßen bin.
| Datei | Beschreibung | Motivation |
|---|---|---|
| Vergleichen-iopl-ioperm.c | Vergleich der von IOPL und Ioperm erteilten I/A -Berechtigungen | Bug 205317 - IOPL (2) - Das Privilegien wird pro Prozess oder pro Thread eingestellt? |
| Berechtigungen besucht.c | Wie werden E/A -Berechtigungen erteilt, wenn Klon, Gabel, Ausführung oder PThread verwendet werden? | Bug 205317 - IOPL (2) - Das Privilegien wird pro Prozess oder pro Thread eingestellt? |
Für ein besseres Verständnis der Konzepte im Kernelraum ist es erforderlich, grundlegende Grundlagen von C und der Standardbibliothek zu überprüfen und zu proben. Als ich in der Lage ist, das Verständnis zu verbessern, ist es möglich, Ansätze zu vergleichen. Die meisten dieser Grundlagen sind niedrig und beginnend mit der Datei-E/O und können als Begleitquelle durchgesehen werden. Es ist nie schlecht, Dinge zu proben, aber manchmal ein wenig peinlich, um zuzugeben, dass sie solche Dinge proben mussten :)
| Datei | Konzept |
|---|---|
| Clone.C | Klonierungsprozesse mit Clone () |
| execve.c | Ausführung eines anderen Prozesses mit execve () |
| gabel.c | Erstellen eines Kinderprozesses mit Fork () |
| io_ports.c | Low-Level-I/A-Operationen mit Port-Kartella |
| read.c | Lesen von Dateien in Vanille c |
| Simple_circular_buffer.c | Einfacher und direkter kreisförmiger Puffer |
| write.c | Schreiben/Anhängen an Dateien in Vanille c |
Um diese Dateien auszuführen, make clean && make in ./rehearsals/
"Ein Linux -Kernel -Modul ist ein Stück kompilierter Binärcode, das direkt in den Linux -Kernel eingefügt wird und am Ring 0 ausgeführt wird, dem niedrigsten und am wenigsten geschützten Ausführungsring im X86–64 -Prozessor."
"Traditionelle Paradigmen für Anwendungsentwicklung können weitgehend verworfen werden. Außer dem Laden und Entladen Ihres Moduls schreiben Sie Code, der auf Systemereignisse reagiert, anstatt in einem sequentiellen Muster zu arbeiten."
"Mit der Kernelentwicklung schreiben Sie APIs, nicht selbst Anwendungen."
In diesem Repository werden Sie um die Root -Berechtigung aufgefordert, da bestimmte Vorgänge wie das Laden/Entladen von Modulen und den Zugriff auf Dateien im Linux/GNU -System von Root -Berechtigungen abhängen. Das Makefile wird vorher angeben, was diese Berechtigungen verwendet werden.
Sie können all diese Vorgänge überprüfen, indem Sie dieses Repository für sudo durchsuchen und sicherstellen, dass dies in keiner Weise missbraucht wird. Ich bin mir dessen bewusst, dass dies ein Sicherheitsproblem sein kann, aber ich versuche, diesen Prozess so transparent wie möglich zu gestalten. Seien Sie jedoch auch bewusst, dass diese Module ohne Garantie kommen. Kernel -Panik und Datenverlust können auftreten. Bitte verwenden Sie sie vorzugsweise in einer virtuellen Maschine.
Im Folgenden befindet sich eine Tabelle mit allen Stellen, an denen Sudo verwendet wird (mit Ausnahme des Readme.md).
grep -n -r " sudo " *| Datei: Zeile | Verwendung von sudo |
|---|---|
| Makefile: 118 | |
| Makefile: 119 | $ (eval number_file_content = sudo cat $(number_file) ) |
| Makefile: 122 | |
| Makefile: 123 | |
| Makefile: 126 | @sudo rmmod $ (module_filename) |
| Makefile: 140 | @sudo mknod $ (Device_FileName) c cat $(proc_filename) 0 |
| Makefile: 143 | @sudo rm $ (Device_FileName) |
| Makefile: 144 | @sudo rmmod $ (module_filename) |
| Makefile: 162 | @sudo rmmod $ (module_filename) |
| Makefile: 175 | @sudo mknod |
| Makefile: 176 | @Echo "Tests" | sudo tee $ (Device_file) |
| Makefile: 178 | @sudo rm -fv $ (Device_file) |
| Makefile: 179 | @sudo rmmod $ (Modul) |
| Makefile: 190 | @sudo insmod |
| Makefile: 193 | @sudo rmmod $ (Modul) |
| Makefile: 207 | @sudo rmmod $ {modul} |
| Makefile: 219 | @Sudo Insmod $ (Modul) .KO |
| Makefile: 222 | @sudo rmmod $ (Modul) |
| tests.mk:31 | @lsmod | awk '{print $$ 1}' | grep -qe "^$ (1) $$" && (sudo rmmod |
| tests.mk:75 | @sudo dmesg -Clear |
| tests.mk:78 | @sudo rmmod $ (1) |
LKM SANDBOX ist kostenlose Software: Sie können es neu verteilen und/oder unter den Bestimmungen der GNU General Public Lizenz wie von der Free Software Foundation veröffentlicht, entweder Version 2 der Lizenz oder (nach Ihrer Option) jede spätere Version.
LKM Sandbox wird in der Hoffnung verteilt, dass es nützlich sein wird, jedoch ohne Garantie; Ohne die implizite Garantie für Handelsfähigkeit oder Eignung für einen bestimmten Zweck. Weitere Informationen finden Sie in der GNU General Public Lizenz.
Sie sollten zusammen mit LKM Sandbox eine Kopie der GNU General Public Lizenz erhalten haben. Wenn nicht, siehe https://www.gnu.org/licenses/.