Pokud funkce obdrží ukazatel pro data v uživatelském prostoru musíte použít copy_from_user()
ke zkopírování dat, na která ukazují, z uživatelského prostoru do prostoru jádra (a naopak).
Všimněte si, že samotná hodnota ukazatele je předávána hodnotou (jako všechny parametry C), takže nemusíte dělat copy_from_user()
získat hodnotu ukazatele dříve, než budete moci copy_from_user()
údaje, na které ukazuje.
Číselné argumenty fungují stejně jako argumenty ukazatele; z hlediska C jsou oba skaláry. Nemusíte používat copy_from_user()
zkopírovat hodnotu parametru; to už bylo zkopírováno. Musíte jej použít pouze ke kopírování dat, na která ukazuje předaný ukazatel.
Pokud tedy máte parametr typu int
, můžete jej použít přímo. Pokud váš parametr ukazuje na int
a poté int
objekt bude v uživatelském prostoru a musíte použít copy_to_user
zkopírujte hodnotu tohoto objektu do prostoru jádra.
Když uživatel předá data do prostoru jádra, mohou být tato data rozdělena na několik stránek a tyto stránky mohou být dokonce ve vyměněné paměti . V těchto případech budete muset počkat, až se jádro na stránce prohodí a získáte přístup ke stránce, kde jsou data. V případě elementárních datových typů (jako int nebo pointers) také platí, že některé architektury (zejména x86 intel) nenutí uživatele zarovnávat data, takže i celé číslo může být rozděleno kolem okraje stránky. Můžete mít přístup k první části vašeho celého čísla, ale než se zpřístupní celá věc, počkejte, až bude druhá část zaměněna správcem paměti.
Některé zpáteční cesty můžete ušetřit umístěním všech uživatelských dat do struktury, jejíž ukazatel je předán jádru. Můžete jej zkopírovat_z_uživatele jako blok a uložit přístupy (a riskujete, že budete několikrát zablokováni)
Takže a na závěr použijte funkce i pro základní typy , protože jich je dost. Nepředpokládejte nic o tom, kde mohou být uživatelská data, když běží v režimu jádra. Máte k němu přístup, ale jaderné virtuální adresy uživatelských dat nemají nic společného s virtuálními adresami zobrazenými v uživatelském režimu.