2012-06-20 15 views
5

Linux çekirdek modülünden ioctl'u aramak mümkün mü? Herkes nasıl kullanıldığına dair bir örnek verebilir mi?Linux'ta çekirdek alanından ioctl() nasıl kullanılır?

+3

Gerçekten böyle şeyler yapmak zorunda değilsiniz. Eğer bir arama yaparsanız, çekirdek alanından keyfi bir sistem çağrısı yapmak için uygulamaya bağlı bir kod bulacaksınız, ancak lütfen bu gibi bir modeli kırmadan gerçek amacınızı gerçekleştirmenin bir yolu olup olmadığını düşünün. File_operations içinde –

cevap

5

sys_ioctl'u aramayı deneyebilirsiniz.
Çekirdek CONFIG_COMPAT ile derlenmişse dışa aktarılır.

Veya, aygıt sürücüsü en struct file_operations doğrudan onun ioctl işleyicisi çağırabilirsiniz varsa.

Ancak, ioctl tanıtıcısı, işaretçi parametrelerinin, çekirdek adres alanında değil, çalışmakta olan işlemin adres alanında olmasını bekler. Bunları okumak için copy_from_user kullanılacaktır. Çekirdek adres alanına işaretçiler verirseniz, copy_from_user başarısız olur. Bunu nasıl başaracağımı anlamıyorum.

Düzenleme:

Hiç başarısız olmayacak copy_from_user daha kodunun altına arasındaki ioctl yöneticisini çağırmak olacaktır.

mm_segment_t fs; 

    fs = get_fs();  /* save previous value */ 
    set_fs (get_ds()); /* use kernel limit */ 

    /* system calls can be invoked */ 

    set_fs(fs); /* restore before returning to user space */ 
+1

ioctl işleyicisi kullanımdan kaldırıldı. Ioctl'yi kullanmak için daha yeni bir yol bulabilir misin? – iammurtaza

+0

get_fs() ve set_fs() işlevlerinin çekirdek alanın sistem çağrılarını yürütmesine nasıl izin verdiğini ve bu "copy_from_user()" öğesinin bundan sonra nasıl bir sorun yaratmadığını nasıl detaylandırabilirsiniz? –

+0

'set_fs',' copy_to_user' öğesine iletilen adreslerin gerçekten geçerli kullanıcının adres alanında olduğunu doğrulayan mekanizmayı etkiler. Çekirdeği mevcut adres alanının çekirdek adres alanı olduğunu düşünür. – ugoren

İlgili konular