系统调用将其定义如下:
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);
我尝试使用kmalloc
将内存分配给char指针变量,然后我使用copy_from_user(
)来复制。最后我在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
答案 0 :(得分:0)
您可能也应该发布您的代码。即您对write
系统调用所做的更改,以确定错误的位置。
也就是说,有些检查不允许您使用内核内存进行系统调用。您需要在进程的用户地址空间中分配缓冲区(错误)或禁用检查(不是那么糟糕)。
我对3.0内核并不熟悉,但this answer看起来很有希望:
mm_segment_t old_fs;
old_fs = get_fs();
set_fs(KERNEL_DS);
/* Your syscall here */
set_fs(old_fs);