首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >系统呼叫写入

系统呼叫写入
EN

Stack Overflow用户
提问于 2013-03-19 14:33:24
回答 1查看 1.8K关注 0票数 1

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

代码语言:javascript
复制
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来修改内容,然后在以下位置使用这个新变量:

代码语言:javascript
复制
vfs_write(file, new_buf, count, &pos);

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

下面是我的实现,它生成内核恐慌错误消息:

代码语言:javascript
复制
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 12 -内核版本: 3.0.30

EN

回答 1

Stack Overflow用户

发布于 2013-03-20 02:39:31

您也应该发布您的代码。即,您对write系统调用所做的更改以确定错误所在。

也就是说,有些检查是不允许您在系统调用中使用内核内存的。您需要在进程的用户地址空间中分配缓冲区(坏的),或者禁用检查(不像坏的那样坏)。

我不太熟悉3.0内核,但是this answer看起来很有前途:

代码语言:javascript
复制
mm_segment_t old_fs;

old_fs = get_fs();
set_fs(KERNEL_DS);
/* Your syscall here */
set_fs(old_fs);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15502331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档