系统调用 write 定义如下:
SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf, size_t, count)
{
struct file *file;
ssize_t ret = -EBADF;
int fput_needed;
file = fget_light(fd, &fput_needed);
if (file) {
loff_t pos = file_pos_read(file);
ret = vfs_write(file, buf, count, &pos);
file_pos_write(file, pos);
fput_light(file, fput_needed);
}
return ret;
}
我想复制变量buf来修改您的内容,然后在以下位置使用这个新变量:
vfs_write(file, new_buf, count, &pos);
我尝试将内存分配给 char 指针变量,kmalloc
然后我使用copy_from_user(
) 来进行复制。最后,我使用了新变量 at vfs_write()
。重新编译内核并重新启动系统后,我收到内核恐慌错误消息。
这是我生成内核恐慌错误消息的实现:
SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf, size_t, count){
struct file *file;
ssize_t ret = -EBADF;
int fput_needed;
char *data;
data = kmalloc(count, GFP_KERNEL);
if(!data)
return ret;
copy_from_user(data, buf, count);
file = fget_light(fd, &fput_needed);
if (file) {
loff_t pos = file_pos_read(file);
ret = vfs_write(file, data, count, &pos);
file_pos_write(file, pos);
fput_light(file, fput_needed);
}
return ret;
}
如何在内核模式下进行此复制?
我正在使用 Linux Mint 12 - 内核版本:3.0.30