【问题标题】:System Call write系统调用写
【发布时间】:2013-03-19 14:33:24
【问题描述】:

系统调用写它的定义如下:

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

【问题讨论】:

  • 我尝试使用“kmalloc”将内存分配给 char 指针变量,然后使用 copy_from_user() 进行复制。最后,我在 vfs_write() 处使用了新变量。重新编译内核并重新启动系统后,我收到内核恐慌错误消息。

标签: c linux kernel system


【解决方案1】:

您可能还应该发布您的代码。 IE。您对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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2014-12-25
    • 2011-10-24
    • 1970-01-01
    相关资源
    最近更新 更多