Módulos / edificio / make / testing / poc / ensayo / notas / descargo de responsabilidad / licencia / libros / enlaces
El Sandbox del módulo de kernel Linux (LKM) es una colección de diferentes módulos para aprender, descubrir y experimentar con el desarrollo de módulos de núcleo Linux. El propósito de este repositorio también es practicar el desarrollo dentro del núcleo de Linux y estudiar conceptos varios antes de pasar a enviar el primer parche al kernel.
La mayoría de los módulos ilustran un concepto y muestran cómo usar la API del núcleo. Algunos de los módulos combinan más de un concepto para presentar cómo los conceptos funcionan juntos. Por ejemplo, el módulo lkm_device está accediendo a un dispositivo de caracteres y almacena su número principal en /proc. O el módulo LKM_MEM también está exponiendo la información de memoria /intercambio por archivos en /proc.
Espero que pueda ser valioso para otros desarrolladores que intentan acercarse al núcleo de Linux.
| No. | Módulo | Fuente | Descripción |
|---|---|---|---|
| 1 | LKM DEBUGFS | lkm_debugfs.c | Módulo que muestra cómo usar los debuges del sistema de archivos de depuración. |
| 2 | Dispositivo LKM | lkm_device.c | Módulo que muestra cómo operar con dispositivos de caracteres y almacenamiento de información del dispositivo en /proc |
| 3 | Números de dispositivo LKM | lkm_device_numbers.c | Ilustración de números de dispositivo asignados estadic y dinámicamente |
| 3 | Memoria LKM | lkm_mem.c | Módulo Exponer la memoria y la información de intercambio a /proc |
| 4 | Dispositivo basado en la memoria LKM | LKM_MEV.C | Controlador para un dispositivo de caracteres basado en la memoria, basado en cierto grado en Scull, desarrollado en el libro Linux Device Directs, Capítulo 3 |
| 5 | Parámetros LKM | lkm_parameters.c | Módulo para pasar los parámetros de usuario a kernelspace |
| 6 | LKM Pretty Printk | lkm_pp.c | Módulo para probar la integración de Pretty Printk |
| 7 | LKM Proc | lkm_proc.c | Sistema de acceso de acceso /proceso de módulo utilizando E /S secuencial |
| 8 | Proceso LKM | lkm_process.c | Acceder e imprimir información actual del proceso |
| 9 | LKM Sandbox | lkm_sandbox.c | Módulo de sandbox para diferentes experimentos |
| 10 | Esqueleto LKM | lkm_skeleton.c | Módulo esqueleto para andamios más rápido de nuevos módulos |
Al clonarse por primera vez, por favor clone también submódulos con --recurse-submodules para obtener bastante imprenta también.
git clone --recurse-submodules [email protected]:tpiekarski/lkm-sandbox.gitmake clean && make
Para ejecutar todas las pruebas disponibles, incluida la carga/descarga básica y todas las pruebas de concepto adicionales.
make testPrueba de carga, descarga y salida de búfer de anillo de núcleo (sudo solicitará permisos de raíz).
make test-module name= < module-name > Pruebas adicionales para el dispositivo Sandbox, incluido el módulo de carga, la recopilación del número de dispositivo principal desde /Proc, creando el dispositivo y comparando el mensaje final, ejecute el objetivo Makefile con make test-device o ejecute los siguientes comandos.
Para crear el dispositivo de caracteres, el número principal se necesita y se puede obtener atacando el archivo /proc /lkm_device_major. Este número importante también está escrito en el búfer de anillo de núcleo. Es posible proporcionar este número principal utilizando el parámetro del módulo param_major_num y cargar este módulo como sudo insmod lkm_device.ko param_major_num=241 (en este momento esta asignación estática parece que no funciona confiable. El registro del dispositivo de sandbox falla a veces.
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 Pruebas adicionales para el acceso /proc, incluido el módulo de carga, las pruebas si el archivo dentro /PROC existe y la salida de ese archivo. Ejecute el programa de prueba de destino MakeFile con make test-proc o los siguientes comandos:
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 Para pruebas adicionales para pasar los parámetros al módulo LKM_PARAMETERS, ejecute el parámetro de prueba de destino MakeFile con make test-parameters . Esto cargará/descargará el módulo y comparará el número de parámetros y el mensaje pasado al cargar el módulo con los valores leídos en el sistema/sistema de archivos (/sys/módulo/lkm_parameters/parámetros/*). O ejecute los siguientes comandos.
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_parametersMientras triando, la depuración y el trabajo con errores y problemas, puede ser útil para experimentar con algún código y escribir un POC para probar algunas declaraciones o responder una pregunta. A continuación se encuentran una colección de tales POC que hace un seguimiento de las declaraciones, ideas y preguntas de Probación de prueba que recientemente encontré.
| Archivo | Descripción | Motivación |
|---|---|---|
| Comparación-IOPL-IOPERM.C | Comparación de permisos de E/S otorgados por IOPL e IOPERM | Error 205317 - IOPL (2) - El nivel de privilegio se establece por proceso o por hilo? |
| permisos-revisados.c | ¿Cómo se otorgan los permisos de E/S al usar Clone, Hork, ExecVe o PThread? | Error 205317 - IOPL (2) - El nivel de privilegio se establece por proceso o por hilo? |
Para una mejor comprensión de los conceptos en el espacio del kernels, es necesario revisar y ensayar los conceptos básicos fundamentales de C y la biblioteca estándar. Además de poder mejorar la comprensión, es posible comparar los enfoques. La mayoría de esos conceptos básicos son de bajo nivel, comenzando con E/S de archivos y pueden ser revisados como una fuente complementaria. Nunca es malo ensayar las cosas, pero a veces un poco vergonzoso admitir tener que ensayar esas cosas :)
| Archivo | Concepto |
|---|---|
| clon.c | Procesos de clonación con clon () |
| ejecve.c | Ejecutando otro proceso con ExecVe () |
| horquilla | Creación del proceso infantil con Fork () |
| io_ports.c | Operaciones de E/S de bajo nivel |
| leer.c | Lectura de archivos en Vanilla C |
| simple_circular_buffer.c | Búfer circular simple y sencillo |
| escribir.c | Escribir/agregar a archivos en Vanilla C |
Para construir esos archivos, simplemente ejecute make clean && make in ./rehearsals/ y todos los ejecutables se colocarán en el directorio de compilación.
"Un módulo de núcleo Linux es una pieza de código binario compilado que se inserta directamente en el núcleo de Linux, que se ejecuta en el anillo 0, el anillo de ejecución más bajo y menos protegido en el procesador X86–64".
"Los paradigmas tradicionales de desarrollo de aplicaciones se pueden descartar en gran medida. Aparte de la carga y descarga de su módulo, escribirá un código que responda a los eventos del sistema en lugar de opera en un patrón secuencial".
"Con el desarrollo del núcleo, estás escribiendo API, no aplicaciones en sí mismas".
Este repositorio le solicitará un permiso raíz, porque ciertas operaciones como la carga/descarga de módulos y acceder a archivos en el sistema Linux/GNU depende de los privilegios raíz. El Makefile indicará de antemano lo que se utilizarán estos permisos.
Puede revisar todas estas operaciones buscando en este repositorio sudo y asegurarse de que esto no se use mal de ninguna manera. Soy consciente de que esto puede ser un problema de seguridad, pero estoy tratando de hacer que este proceso sea lo más transparente posible. Pero también sea consciente de que estos módulos vienen sin ninguna garantía. Pueden ocurrir los pánico del kernel y la pérdida de datos, úsalos preferiblemente dentro de una máquina virtual.
A continuación se encuentra una tabla con todas las ubicaciones donde se usa sudo (excepto el readme.md).
grep -n -r " sudo " *| Archivo: Línea | Uso de sudo |
|---|---|
| Makefile: 118 | |
| Makefile: 119 | $ (eval number_file_content = sudo cat $(number_file) ) |
| Makefile: 122 | |
| Makefile: 123 | |
| Makefile: 126 | @sudo rmmod $ (módulo_filename) |
| Makefile: 140 | @sudo mknod $ (dispositivo_filename) c cat $(proc_filename) 0 |
| Makefile: 143 | @Sudo RM $ (dispositivo_filename) |
| Makefile: 144 | @sudo rmmod $ (módulo_filename) |
| Makefile: 162 | @sudo rmmod $ (módulo_filename) |
| Makefile: 175 | @Sudo Mknod |
| Makefile: 176 | @echo "Testing" | Sudo Tee $ (dispositivo_file) |
| Makefile: 178 | @Sudo RM -FV $ (dispositivo_file) |
| Makefile: 179 | @sudo rmmod $ (módulo) |
| Makefile: 190 | @Sudo Insmod |
| Makefile: 193 | @sudo rmmod $ (módulo) |
| Makefile: 207 | @sudo rmmod $ {módulo} |
| Makefile: 219 | @sudo insmod $ (módulo) .ko |
| Makefile: 222 | @sudo rmmod $ (módulo) |
| tests.mk:31 | @lsmod | Awk '{imprimir $$ 1}' | grep -qe "^$ (1) $$" && (sudo rmmod |
| Tests.mk:75 | @Sudo DMESG -CLEAR |
| Tests.mk:78 | @sudo rmmod $ (1) |
LKM Sandbox es un software gratuito: puede redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General de GNU publicada por la Free Software Foundation, ya sea la versión 2 de la licencia o (a su opción) cualquier versión posterior.
LKM Sandbox se distribuye con la esperanza de que sea útil, pero sin ninguna garantía; Sin siquiera la garantía implícita de comerciabilidad o estado físico para un propósito particular. Vea la Licencia Pública General de GNU para más detalles.
Debería haber recibido una copia de la Licencia Pública General de GNU junto con LKM Sandbox. Si no, consulte https://www.gnu.org/licenses/.