2009-11-08 14 views
9

Bir çeşit karakter aygıtı uygulamam ve copy_ from_user işleviyle ilgili yardıma ihtiyacım var. Ben kullanıcı uzayında da başlatmak ve 'yazma' fonksiyonunu kullanarak karakter aygıtına my_struct için işaretçi geçmesiLinux Kernel: copy_from_user - işaretçilerle yapı

struct my_struct{ 

int a; 

int *b; 
}; 

:

Ben bir yapı var. Kernel'in Uzay karakterindeki 'yazma' fonksiyonunda, onu bir “char” dan bu yapıya çevirdim. Kmalloc kullanarak bir yapı için biraz bellek ayırdım ve copy_from_user'u buna giriyorum.

Basit 'int a' için iyidir, ancak b değeriyle değil, b değerinin yalnızca işaretçisini (adres) kopyalar, bu yüzden şimdi Kernel Space'de çalışıyorum ve işaret eden bir işaretçi ile çalışıyorum. Bir kullanıcı alanı belleği. Bu yanlış mı ve ben doğrudan kullanıcı alanı işaretçisi erişmem gerekir ve copy_from_user benim her bir işaretçi benim yapı ve copy_to_user işlevini kullanarak "Oku" işlevinde her işaretçi geri kopyalamak zorunda?

cevap

6

Durumunuz doğru. *b değerine erişmeniz gerekiyorsa, copy_from_user (ve kullanıcı işleminde onu güncellemek için copy_to_user) kullanmanız gerekir.

+2

Ayrıca, içlerinde işaretçi içeren yapıları alan herhangi bir syscalls veya ioctls düşünemiyorum. Dizeleri olanların bile, yapıda bir dizi char grubu olacaktır. Her işaretçi üyesi için bunu yapmak için kod yazmak oldukça can sıkıcı olması, bununla ilgili bir şey olabilir. :-) – asveikau

+0

@asveikau: 'readv()' ve 'writev()'? – caf

13

copy_from_user'u her zaman kullanmalısınız ve işaretçiye nasıl sahip olduğunuzdan bağımsız olarak, kullanıcı alanı belleğine çekirdek alanından erişmek için benzer. b, kullanıcı alanı belleğinin bir göstergesi olduğundan, erişim sağlamak için copy_from_user kullanmanız gerekir. Onlar kullanıcı uzaya emin işaretçi puan yapmak ve uzay çekirdek değil

  1. :

    Bu işlevler iki önemli ek görevleri yapmak. Bu kontrol olmadan, kullanıcı alanı programları normal güvenliği atlayarak çekirdek belleğini okuyabilir veya yazabilir.

  2. Sayfa hataları doğru şekilde işliyor. Normalde, çekirdek modunda bir sayfa hatası, bir OOPS veya paniğe neden olur - copy_*_user işlev ailesinin, PF işleyicisine her şeyin iyi olduğunu söyleyen özel bir geçersiz kılma özelliği vardır ve hata normal olarak ele alınmalıdır; ve hatanın IO tarafından karşılanamaması durumunda (yani, normal olarak bir SIGSEGV veya SIGBUS neden olur), bir hata kodu döndürün, böylece arayanlar -EFAULT ile kullanıcı alanına dönmeden önce gerekli temizleme işlemini yapabilirler.