Вы можете сделать get_user
в цикле, но 128 вызовов функции, вероятно, не суперэффективны. Вы можете сделать все это одним выстрелом, используя следующий подход.
Прежде всего, вам нужно copy_from_user
buf в буфер на стороне ядра. Вы не знаете размер буфера заблаговременно, поэтому вы должны k / vmalloc его (РЕДАКТИРОВАТЬ: вы можете пропустить выделение памяти, так как ваши данные <= 128 байт, может иметь локальный буфер в стек) </p>
u8 * kernel_buf;
kernel_buf = kmalloc(len, GFP_KERNEL);
if(!kernel_buf)
return -ENOMEM;
.
.
kfree(kernel_buf); // no memory leaks please
Вам также необходимо убедиться, что вы можете читать / записывать len
байтов из буфера пользовательского пространства, а затем копировать в / из только что выделенного буфера на стороне ядра.
if(!access_ok(VERIFY_WRITE, buf, len))
{
kfree(kernel_buf);
return -EFAULT;
}
if(copy_from_user(kernel_buf, buf, len))
return -EFAULT;
// now do your business in a for loop
for(i = 0; i < len; i++)
{
outb(*pos + i, 0x70);
outb(kernel_buf[i], 0x71),
}
// cleanup kernel buf
kfree(kernel_buf);
return len;
Очевидно, вам следует дважды проверить мои предложения, поскольку я их не компилировал и не проверял, но, надеюсь, это поможет.
Удачи и веселья!