Kernel uzayından kullanıcı alanına veri kopyalarken, copy_to_user() yöntemini kullanmalı ve memcpy() kullanarak sistemde sorunlara neden olabilecek her zaman söylendi (Kitaplarda ve öğreticilerde). Geçenlerde yanlışlıkla memcpy() kullandım ve herhangi bir sorunla mükemmel bir şekilde çalıştı. Nedencopy_to_user vs memcpy
Testim kodu (Kernel modülü) böyle bir şeydir yerine memcpy() ait copy_to_user kullanmak gerektiğidir:
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);
kullanıcı uzay uygulamasından, benim /proc
girişi okuyorum ve her şey iyi çalışıyor.
copy_to_user() kaynak koduna bir bakış, bunun da basit bir şekilde memcpy() olduğunu belirtir; burada yalnızca işaretçinin geçerli olup olmadığını, access_ok ve memcpy ile çalışıp çalışmadığını kontrol etmeye çalışırız.
Yani benim anlayış anda biz geçiyoruz pointer hakkında eminseniz , memcpy() her zaman copy_to_user yerine kullanılabilecek olmasıdır.Anlayışım yanlışsa ve ayrıca, , copy_to_user öğesinin çalıştığı ve memcpy() 'nin başarısız olduğu herhangi bir örnek, çok yararlı olabilir. Teşekkürler.
Sayfalama nedeniyle. – Linuxios
@Linuxios Üzgünüm Ama bir littl daha açıklayabilir misiniz. Çekirdeğin mükemmel bir şekilde kopyalayabildiğini doğrulayamıyorum, ayrıca copy_to_user kaynak kodundaki sayfalama ile ilgili hiçbir şey göremiyorum. Nazikçe detay verebilir misiniz? –
@Sandy: Varsayımsal soru: 16 GB RAM ile 32 bit bir sistem kullanıyorsunuz. Memcpy çalışacak mı? –