Linux için bir çekirdek modülü yazarken, module_param
ve değişkenleri bir dizeyi bir modül parametresi olarak alabilir ve bu dize için gerekli olan bellek alanı, herhangi bir şey yapmak zorunda kalmadan sahnelerin arkasına ayrılır. Sorum şu, bu bellek parçasını nasıl ele almalısın? Artık ihtiyacın yoksa, onu açıkça serbest bırakmak zorunda mısın? Dizeyi modülün içinden değiştirmek isterseniz ne yapmalısınız? dize (charp
tipi) argümanı için module_param
tarafından tahsisBir Linux çekirdek modülü yazarken, module_param tarafından elde edilen bellek nasıl kullanılır?
cevap
Bellek kernel/params.c
tanımlanan param_set_charp
, param_get_charp
ve param_free_charp
fonksiyonları, bu parametrenin türü için geri aramaları tarafından korunur.
böyle param ile çalışır en kolay yolu olarak ilan etmektir Sadece okuyun ve sadece için modülden erişirken okuyun. Bu durumda, erişimin kilitlenmesi veya serbest bırakılması parametresinin değerini zahmet etmemeye gerek yoktur. Eğer sadece parametreyi oku için modülünden yazma istiyorsanız
şunlar gereklidir:
param_free_charp
yoluyla parametrenin1) Ücretsiz eski değerini.
2) Parametre için yeni değer atayın. Eğer bu değer tahsis edilirse,
module_exit
numaranızda veya bir sonraki parametrede yazarak elle ayırmanız gerekir.Her iki eylem de tek kritik bölüm
kernel_param_lock(THIS_MODULE)
/kernel_param_unlock(THIS_MODULE)
içinde gerçekleştirilmelidir, bu nedenle, kullanıcı alanından gelen parametre değerlerinin okunması, değeri tam olarak başlatılmış olarak bulunacaktır. Sonra modülü içinde okuma sen yazılabilir olarak parametreyi bildirirseniz, kritik bölüm
kernel_param_lock(THIS_MODULE)
/kernel_param_unlock(THIS_MODULE)
gerektirir.parametre yazılabilir için yeni değer başka bir yerdekayıtlı tutulduğu izin verilir Yazma, bu yüzden parametre kullanıcı uzaydan yeniden yazılır eğer, önceki değer bulunabilir ve gerekirse kurtardı. Modül içinde bu tür bir parametrenin yazılması ve okunması, duruma göre 2 ve 3 vakalar gibi aynı istekleri takip etmelidir.