copy_to_user vs memcpy

In Büchern und Tutorials wurde mir immer gesagt, dass beim Kopieren von Daten aus dem Kernel-Space in den User-Space copy_to_user () und die Verwendung von memcpy () Probleme auf dem System verursachen würden. In letzter Zeit habe ich versehentlich memcpy () verwendet und es hat einwandfrei funktioniert, ohne dass Probleme aufgetreten sind.Warum sollten wir copy_to_user anstelle von memcpy () verwenden?

Mein Testcode (Kernel-Modul) sieht ungefähr so ​​aus:

static ssize_t test_read(struct file *file, char __user * buf,
             size_t len, loff_t * offset)
{
    char ani[100];

    if (!*offset) {
        memset(ani, 'A', 100);
        if (memcpy(buf, ani, 100))
            return -EFAULT;
        *offset = 100;
        return *offset;
    }

    return 0;
}

struct file_operations test_fops = {
    .owner = THIS_MODULE,
    .read = test_read,
};

static int __init my_module_init(void)
{
    struct proc_dir_entry *entry;

    printk("We are testing now!!\n");
    entry = create_proc_entry("test", S_IFREG | S_IRUGO, NULL);
    if (!entry)
        printk("Failed to creats proc entry test\n");

    entry->proc_fops = &test_fops;
    return 0;
}
module_init(my_module_init);

Von User-Space-App lese ich meine/proc Eintritt und alles funktioniert gut.

Ein Blick auf den Quellcode von copy_to_user () zeigt, dass es sich auch um einfaches memcpy () handelt, bei dem wir nur versuchen, zu überprüfen, ob der Zeiger mit access_ok gültig ist oder nicht, und memcpy ausführen.

Somein Verständnis derzeit ist das,Wenn wir sicher sind, welchen Zeiger wir übergeben, kann memcpy () immer anstelle von copy_to_user verwendet werden.

Bitte korrigieren Sie mich, wenn mein Verständnis falsch ist und auch,Jedes Beispiel, in dem copy_to_user funktioniert und memcpy () fehlschlägt, wäre sehr nützlich. Vielen Dank.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage