From 91f8ca7f49278100ed064bf8484389c989e9a591 Mon Sep 17 00:00:00 2001 From: Florian RICHER Date: Wed, 26 Feb 2025 17:08:49 +0100 Subject: [PATCH] Begin work on rust versions of modules --- .vscode/extensions.json | 3 ++- README.md | 10 +++++++- .../01_basic_module}/Makefile | 0 .../01_basic_module}/test_module.c | 2 +- .../02_module_params}/Makefile | 0 .../02_module_params}/test_module.c | 2 +- .../03_character_device}/Makefile | 0 .../03_character_device}/README.md | 0 .../03_character_device}/test_module.c | 2 +- .../04_process_monitor}/Makefile | 0 .../04_process_monitor}/test_module.c | 2 +- .../05_packet_filter}/Makefile | 0 .../05_packet_filter}/test_module.c | 2 +- .../06_virtual_led_basic}/Makefile | 0 .../06_virtual_led_basic}/test_module.c | 2 +- .../07_virtual_leds_more_complex}/Makefile | 0 .../test_module.c | 2 +- .../08_gpio_pin_rpi3}/Makefile | 0 .../08_gpio_pin_rpi3}/test_module.c | 0 .../09_gpio_led_rpi3}/Makefile | 0 .../09_gpio_led_rpi3}/test_module.c | 0 lang_rust/01_basic_module/Makefile | 10 ++++++++ lang_rust/01_basic_module/test_module.rs | 25 +++++++++++++++++++ 23 files changed, 53 insertions(+), 9 deletions(-) rename {01_basic_module => lang_c/01_basic_module}/Makefile (100%) rename {01_basic_module => lang_c/01_basic_module}/test_module.c (87%) rename {02_module_params => lang_c/02_module_params}/Makefile (100%) rename {02_module_params => lang_c/02_module_params}/test_module.c (95%) rename {03_character_device => lang_c/03_character_device}/Makefile (100%) rename {03_character_device => lang_c/03_character_device}/README.md (100%) rename {03_character_device => lang_c/03_character_device}/test_module.c (97%) rename {04_process_monitor => lang_c/04_process_monitor}/Makefile (100%) rename {04_process_monitor => lang_c/04_process_monitor}/test_module.c (92%) rename {05_packet_filter => lang_c/05_packet_filter}/Makefile (100%) rename {05_packet_filter => lang_c/05_packet_filter}/test_module.c (94%) rename {06_virtual_led_basic => lang_c/06_virtual_led_basic}/Makefile (100%) rename {06_virtual_led_basic => lang_c/06_virtual_led_basic}/test_module.c (95%) rename {07_virtual_leds_more_complex => lang_c/07_virtual_leds_more_complex}/Makefile (100%) rename {07_virtual_leds_more_complex => lang_c/07_virtual_leds_more_complex}/test_module.c (97%) rename {08_gpio_pin_rpi3 => lang_c/08_gpio_pin_rpi3}/Makefile (100%) rename {08_gpio_pin_rpi3 => lang_c/08_gpio_pin_rpi3}/test_module.c (100%) rename {09_gpio_led_rpi3 => lang_c/09_gpio_led_rpi3}/Makefile (100%) rename {09_gpio_led_rpi3 => lang_c/09_gpio_led_rpi3}/test_module.c (100%) create mode 100644 lang_rust/01_basic_module/Makefile create mode 100644 lang_rust/01_basic_module/test_module.rs diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 71db16a..fb6f860 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,5 +1,6 @@ { "recommendations": [ - "ms-vscode.cpptools-extension-pack" + "ms-vscode.cpptools-extension-pack", + "rust-lang.rust-analyzer" ] } \ No newline at end of file diff --git a/README.md b/README.md index 446b5ee..0c14449 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,14 @@ On other distros: 2. With nix only, use `nix develop .#other` -3. Otherwise, you need to setup LINUX_MODULES_FOLDER to linux modules folder of your distro (ex: `/lib/modules/$(uname -r)`) in your shell (ex: .bashrc) +3. Otherwise, you need `kernel-devel` to compile C code and `rust rust-src bindgen-cli rustfmt clippy` to compile rust + And also to setup LINUX_MODULES_FOLDER to linux modules folder of your distro (ex: `/lib/modules/$(uname -r)`) in your shell (ex: .bashrc) + +### Note for Rust + +`cat /boot/config-$(uname -r) | grep CONFIG_RUST` + +Must contains CONFIG_RUST=y ## make : targets list @@ -55,6 +62,7 @@ sudo rmmod [module_name].ko - https://elixir.bootlin.com/linux/v6.13/source/ - https://static.lwn.net/images/pdf/LDD3/ch01.pdf - https://sysprog21.github.io/lkmpg +- https://github.com/Rust-for-Linux/rust-out-of-tree-module ## Notes diff --git a/01_basic_module/Makefile b/lang_c/01_basic_module/Makefile similarity index 100% rename from 01_basic_module/Makefile rename to lang_c/01_basic_module/Makefile diff --git a/01_basic_module/test_module.c b/lang_c/01_basic_module/test_module.c similarity index 87% rename from 01_basic_module/test_module.c rename to lang_c/01_basic_module/test_module.c index b8211ae..de55984 100644 --- a/01_basic_module/test_module.c +++ b/lang_c/01_basic_module/test_module.c @@ -17,6 +17,6 @@ module_init(basic_module_init); module_exit(basic_module_exit); MODULE_LICENSE("MIT License"); -MODULE_AUTHOR("Florian RICHER"); +MODULE_AUTHOR("Florian RICHER "); MODULE_DESCRIPTION("Un module noyau qui affiche un message"); MODULE_VERSION("1.0"); diff --git a/02_module_params/Makefile b/lang_c/02_module_params/Makefile similarity index 100% rename from 02_module_params/Makefile rename to lang_c/02_module_params/Makefile diff --git a/02_module_params/test_module.c b/lang_c/02_module_params/test_module.c similarity index 95% rename from 02_module_params/test_module.c rename to lang_c/02_module_params/test_module.c index 9867346..4970cc2 100644 --- a/02_module_params/test_module.c +++ b/lang_c/02_module_params/test_module.c @@ -50,6 +50,6 @@ module_init(module_params_init); module_exit(module_params_exit); MODULE_LICENSE("MIT License"); -MODULE_AUTHOR("Florian RICHER"); +MODULE_AUTHOR("Florian RICHER "); MODULE_DESCRIPTION("Un module noyau avec paramètre déchargé."); MODULE_VERSION("1.0"); diff --git a/03_character_device/Makefile b/lang_c/03_character_device/Makefile similarity index 100% rename from 03_character_device/Makefile rename to lang_c/03_character_device/Makefile diff --git a/03_character_device/README.md b/lang_c/03_character_device/README.md similarity index 100% rename from 03_character_device/README.md rename to lang_c/03_character_device/README.md diff --git a/03_character_device/test_module.c b/lang_c/03_character_device/test_module.c similarity index 97% rename from 03_character_device/test_module.c rename to lang_c/03_character_device/test_module.c index f0115b1..5aaf6af 100644 --- a/03_character_device/test_module.c +++ b/lang_c/03_character_device/test_module.c @@ -87,6 +87,6 @@ module_init(basic_module_init); module_exit(basic_module_exit); MODULE_LICENSE("MIT License"); -MODULE_AUTHOR("Florian RICHER"); +MODULE_AUTHOR("Florian RICHER "); MODULE_DESCRIPTION("Un module noyau avec un périphérique de caractère"); MODULE_VERSION("1.0"); diff --git a/04_process_monitor/Makefile b/lang_c/04_process_monitor/Makefile similarity index 100% rename from 04_process_monitor/Makefile rename to lang_c/04_process_monitor/Makefile diff --git a/04_process_monitor/test_module.c b/lang_c/04_process_monitor/test_module.c similarity index 92% rename from 04_process_monitor/test_module.c rename to lang_c/04_process_monitor/test_module.c index 74b1f35..73a6011 100644 --- a/04_process_monitor/test_module.c +++ b/lang_c/04_process_monitor/test_module.c @@ -33,6 +33,6 @@ module_init(basic_module_init); module_exit(basic_module_exit); MODULE_LICENSE("MIT License"); -MODULE_AUTHOR("Florian RICHER"); +MODULE_AUTHOR("Florian RICHER "); MODULE_DESCRIPTION("Un module noyau qui affiche les processus en cours"); MODULE_VERSION("1.0"); diff --git a/05_packet_filter/Makefile b/lang_c/05_packet_filter/Makefile similarity index 100% rename from 05_packet_filter/Makefile rename to lang_c/05_packet_filter/Makefile diff --git a/05_packet_filter/test_module.c b/lang_c/05_packet_filter/test_module.c similarity index 94% rename from 05_packet_filter/test_module.c rename to lang_c/05_packet_filter/test_module.c index fe28ac6..3ed32ed 100644 --- a/05_packet_filter/test_module.c +++ b/lang_c/05_packet_filter/test_module.c @@ -44,6 +44,6 @@ module_init(packet_filter_init); module_exit(packet_filter_exit); MODULE_LICENSE("MIT License"); -MODULE_AUTHOR("Florian RICHER"); +MODULE_AUTHOR("Florian RICHER "); MODULE_DESCRIPTION("Un module noyau pour filtrer les paquets réseau"); MODULE_VERSION("1.0"); diff --git a/06_virtual_led_basic/Makefile b/lang_c/06_virtual_led_basic/Makefile similarity index 100% rename from 06_virtual_led_basic/Makefile rename to lang_c/06_virtual_led_basic/Makefile diff --git a/06_virtual_led_basic/test_module.c b/lang_c/06_virtual_led_basic/test_module.c similarity index 95% rename from 06_virtual_led_basic/test_module.c rename to lang_c/06_virtual_led_basic/test_module.c index 820d15e..d0dc7fd 100644 --- a/06_virtual_led_basic/test_module.c +++ b/lang_c/06_virtual_led_basic/test_module.c @@ -53,6 +53,6 @@ module_init(virtual_led_init); module_exit(virtual_led_exit); MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Florian RICHER"); +MODULE_AUTHOR("Florian RICHER "); MODULE_DESCRIPTION("Un module noyau qui ajoute une LED virtuelle"); MODULE_VERSION("1.0"); diff --git a/07_virtual_leds_more_complex/Makefile b/lang_c/07_virtual_leds_more_complex/Makefile similarity index 100% rename from 07_virtual_leds_more_complex/Makefile rename to lang_c/07_virtual_leds_more_complex/Makefile diff --git a/07_virtual_leds_more_complex/test_module.c b/lang_c/07_virtual_leds_more_complex/test_module.c similarity index 97% rename from 07_virtual_leds_more_complex/test_module.c rename to lang_c/07_virtual_leds_more_complex/test_module.c index ca58d29..6dc0aaa 100644 --- a/07_virtual_leds_more_complex/test_module.c +++ b/lang_c/07_virtual_leds_more_complex/test_module.c @@ -93,6 +93,6 @@ module_init(virtual_led_init); module_exit(virtual_led_exit); MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Florian RICHER"); +MODULE_AUTHOR("Florian RICHER "); MODULE_DESCRIPTION("Un module noyau qui ajoute des LEDs virtuelles"); MODULE_VERSION("1.0"); diff --git a/08_gpio_pin_rpi3/Makefile b/lang_c/08_gpio_pin_rpi3/Makefile similarity index 100% rename from 08_gpio_pin_rpi3/Makefile rename to lang_c/08_gpio_pin_rpi3/Makefile diff --git a/08_gpio_pin_rpi3/test_module.c b/lang_c/08_gpio_pin_rpi3/test_module.c similarity index 100% rename from 08_gpio_pin_rpi3/test_module.c rename to lang_c/08_gpio_pin_rpi3/test_module.c diff --git a/09_gpio_led_rpi3/Makefile b/lang_c/09_gpio_led_rpi3/Makefile similarity index 100% rename from 09_gpio_led_rpi3/Makefile rename to lang_c/09_gpio_led_rpi3/Makefile diff --git a/09_gpio_led_rpi3/test_module.c b/lang_c/09_gpio_led_rpi3/test_module.c similarity index 100% rename from 09_gpio_led_rpi3/test_module.c rename to lang_c/09_gpio_led_rpi3/test_module.c diff --git a/lang_rust/01_basic_module/Makefile b/lang_rust/01_basic_module/Makefile new file mode 100644 index 0000000..aef2d00 --- /dev/null +++ b/lang_rust/01_basic_module/Makefile @@ -0,0 +1,10 @@ +obj-m += test_module.o + +all: + make -C $(LINUX_MODULES_FOLDER)/build M=$(PWD) LLVM=1 modules + +clean: + make -C $(LINUX_MODULES_FOLDER)/build M=$(PWD) LLVM=1 clean + +rust-analyzer: + make -C $(LINUX_MODULES_FOLDER)/build M=$(PWD) LLVM=1 rust-analyzer diff --git a/lang_rust/01_basic_module/test_module.rs b/lang_rust/01_basic_module/test_module.rs new file mode 100644 index 0000000..317a151 --- /dev/null +++ b/lang_rust/01_basic_module/test_module.rs @@ -0,0 +1,25 @@ +use kernel::prelude::*; + +module! { + type: RustOutOfTree, + name: "test_module", + author: "Florian RICHER ", + description: "Un module noyau qui affiche un message", + license: "GPL", +} + +struct RustOutOfTree; + +impl kernel::Module for RustOutOfTree { + fn init(_module: &'static ThisModule) -> Result { + pr_info!("Bonjour! Le module est chargé.\n"); + + Ok(RustOutOfTree) + } +} + +impl Drop for RustOutOfTree { + fn drop(&mut self) { + pr_info!("Au revoir! Le module est déchargé.\n"); + } +}