2008-09-15 11 views
3

Çekirdek alanından kullanıcı alanına özel bir yapı kopyalamaya çalışıyorum. kullanıcı alanı errno içinde 'kötü adres' döndürür. Kötü adres hatasının genel nedeni nedir?' bad address 'hatası

if(copy_to_user(info, &kernel_info, sizeof(struct prinfo))) 

cevap

5

Hatalı Adres hatası, verdiğiniz adres konumunun geçersiz olduğu anlamına gelir. Yukarıda gördüğünüz durumda, info'un bellek konumuna bir işaretçi yerine info kopyasını geçirdiğinizi tahmin ediyorum. docs baktığımızda

, copy_to_user sizin info değişken ı güncellerdi bir gösterici ise Yani kod olmaya

copy_to_user(void __user * to, const void * from, unsigned long n); 

olarak tanımlanır: bu bilgi varsayarsak

if(copy_to_user(&info, &kernel_info, sizeof(struct prinfo))) { 
    //some stuff here i guess 
} 
2

bir işaretçi türüdür ve bu bilgi geçerli bir yere işaret ediyorsa, bilginin fonksiyonun gerektirdiği kullanıcı boşluğunda olmayan bir adresi göstermesi hala mümkündür.

-1

Küçük bir sürücü yüklerken aynı sorunla karşılaştım. Yanlış yaptığım tek şey, copy_to_user işlevinin başarısızlık durumunda sıfırdan geri döndüğüydi, bu yüzden bunu yapmak zorundasın ..

if(copy_to_user(void *userbuf, void *kernelbuf, long len)) 
    return -EFAULT; 

// Continue with code.. 
+0

Bu OP hakkında ne sormadı – Adam