gpt4 book ai didi

c - 系统调用写入

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:12 26 4
gpt4 key购买 nike

系统调用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);

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

这是我生成内核 panic 错误消息的实现:

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

最佳答案

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

关于c - 系统调用写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15502331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com