feat: ajouter character_device_in_rust.rs avec miscdev #10
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "openclaw/kernel_module_learn:feat/char-device-rust-miscdev"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Version Rust du character device utilisant l'API
miscdevicekernel 6.19.Basé sur
samples/rust/rust_misc_device.rs(source officielle kernel 6.19).Avantages vs C
class_create,device_createMutexvianew_mutex!+pin_data(safe, pinned)KVVec<u8>pour le buffer — alloué dynamiquement, pas de taille fixe sur la pilePinnedDropsurFloDevDataInPlaceModule+try_pin_init!pour initialisation correctement pinnéeRéférences
kernel::miscdevicekernel::iovkernel::fs::KiocbNotes
MiscDeviceRegistration::register()crée/dev/flodevautomatiquement.Compile sur kernel 6.19.8. Non testé à l'exécution (desync nixpkgs/OS).
Ref #1
0d479195d3to1ce0126a43@florian.richer PR mise à jour pour kernel 6.19 :
IoBufferReader/IoBufferWriterremplacés parUserSliceReader/UserSliceWriterdepuiskernel::uaccess(changement introduit ~6.14)Toujours à tester à la compilation — si
miscdev::Registration::new_pinnedou la signature deOperations::read/writea encore changé en 6.19, dis-moi l'erreur de compilation et je corrige.feat: ajouter character_device_in_rust.rs avec miscdevto WIP: feat: ajouter character_device_in_rust.rs avec miscdev1ce0126a43to2a3509e0ed@florian.richer PR mise à jour — réécriture complète basée sur
samples/rust/rust_misc_device.rs(source officielle kernel) :Erreurs corrigées :
kernel::file/kernel::miscdev→kernel::miscdevice+ imports correctsArc/ArcBorrow→Pin<KBox<Self>>(pattern officiel)Operations→ traitMiscDeviceavec#[vtable]IoBufferReader/IoBufferWriter→IovIterDest/IovIterSource+KiocbModule→InPlaceModule+try_pin_init![u8; 256]→KVVec<u8>+new_mutex!À tester à la compilation —
KVVecetsimple_read_from_buffersont présents en 6.19 mais leur disponibilité hors arbre peut varier selon la config kernel (CONFIG_RUST=yrequis).2a3509e0edtof0b0edb3baf0b0edb3bato2ac674924d@florian.richer Récap des 2 derniers patchs :
Patch 1 — Réécriture complète pour kernel 6.19
La première version utilisait une ancienne API. Réécriture basée sur
samples/rust/rust_misc_device.rs:kernel::miscdevice(pasmiscdev) → sourceInPlaceModule+try_pin_init!à la place deModule+BoxMiscDevicetrait avec#[vtable]read_iter/write_iteravecKiocb+IovIterDest/IovIterSource→ sourceKVVec<u8>+new_mutex!+Pin<KBox<Self>>Patch 2 — Suppression du
impl DropsurCharDeviceModule#[pin_data]génère un trait interneMustNotImplDropqui interdit unimpl Dropdirect sur la struct. Suppression duDropdeCharDeviceModule— le message de déchargement reste dansPinnedDropdeFloDevData.2ac674924dto5b4d74b503@florian.richer Dernier patch — ajout de
ARef<Device>+dev_info!:Ce qui a changé :
dev: ARef<Device>dansFloDevData(récupéré viamisc.device()dansopen)pr_info!pardev_info!(me.dev, ...)— les logs sont maintenant préfixés avec le nom du device (flodev:) au lieu d'un simple[module_name]kernel::sync::aref::ARefetkernel::device::Deviceajoutés aux importsPourquoi
dev_info!plutôt quepr_info!?Comme dans le sample officiel (
rust_misc_device.rs),dev_info!préfixe le message avec le device concerné — plus utile pour debugger quand plusieurs devices sont actifs.pr_info!n'a pas ce contexte.Explication de
iov.copy_from_iter_vec(&mut inner.buf, GFP_KERNEL):Copie les données depuis l'espace utilisateur (passées via
write()) dans leKVVec<u8>kernel :iov— itérateur sur les données userspace duwrite()copy_from_iter_vec— lit depuisiovet appende dans le vecteur (vérifie les pointeurs userspace automatiquement)GFP_KERNEL— flag d'allocation mémoire (allocation normale, peut dormir)inner.buf.clear()juste avant — remplace le contenu plutôt que d'appenderÉquivalent Rust de
copy_from_user(buf, user_buf, len)en C, mais safe par construction.@florian.richer Explication de
iov.simple_read_from_buffer(kiocb.ki_pos_mut(), &inner.buf):Copie les données du buffer kernel vers l'espace utilisateur (appelé lors d'un
read()) en tenant compte de la position courante dans le fichier :iov— itérateur de destination vers l'espace utilisateursimple_read_from_buffer— helper kernel qui gère automatiquement :len - offset)0si on est déjà en fin de buffer (EOF)kiocb.ki_pos_mut()— pointeur vers la position courante dans le fichier (l'offset), passé en&mutpour être mis à jour après la lecture&inner.buf— slice du buffer kernel sourceÉquivalent Rust du pattern C classique :
Mais en une seule ligne safe, sans gestion manuelle des bornes ni
copy_to_userexplicite.WIP: feat: ajouter character_device_in_rust.rs avec miscdevto feat: ajouter character_device_in_rust.rs avec miscdev