vfs_write 导致内核恐慌
vfs_write causes a kernel panic
这是我从内核写入文件的代码。(我知道直接从内核读写不是一个好主意,但这只是一个测试)。
static void write_startup_file(char *startstring)
{
mm_segment_t oldfs;
struct file *f;
loff_t pos=0;
f = filp_open("/bin/startupcheck",O_WRONLY|O_CREAT, 0644);
oldfs = get_fs();
set_fs (KERNEL_DS);
if(f)
{
vfs_write(f,startstring, strlen(startstring), &pos);
set_fs(oldfs);
filp_close(f, NULL);
}
else
printk(KERN_CRIT "Unable to open startfile...\n");
}
我在另一个函数中调用它 ourVeryOwnFunction()
as
if(dbval==NULL) { write_startup_file("FAILED");}
其中 dbval
是一个值 read.But 当我编译内核时 运行 它(我 运行 在 vmware 上编译它)。我得到的内核恐慌是 here
很明显我做错了什么。寻求帮助。谢谢。
首先,初始化你的struct file *
指针。不要依赖于 NULL
对返回指针的简单检查。请改用 IS_ERR
宏。老实说,一般来说,很难说还有什么问题。阅读类似这样的内容 http://ytliu.info/notes/linux/file_ops_in_kernel.html 或参考 SO
上的这些问题
How to read/write files within a Linux kernel module?
File I/O in a Linux kernel module
也许它会给您一些见解或阐明一些事情。当然,不要从内核写入 fs :)
HTH.
也许startstring不能来自用户space,但是作为一个模块,模块驱动可以把它放到内核,不在用户 space 中。我想你可以尝试在堆栈中使用一个简单的字符串并删除参数 startstring ,这可以验证我的猜测是否正确。
这是我从内核写入文件的代码。(我知道直接从内核读写不是一个好主意,但这只是一个测试)。
static void write_startup_file(char *startstring)
{
mm_segment_t oldfs;
struct file *f;
loff_t pos=0;
f = filp_open("/bin/startupcheck",O_WRONLY|O_CREAT, 0644);
oldfs = get_fs();
set_fs (KERNEL_DS);
if(f)
{
vfs_write(f,startstring, strlen(startstring), &pos);
set_fs(oldfs);
filp_close(f, NULL);
}
else
printk(KERN_CRIT "Unable to open startfile...\n");
}
我在另一个函数中调用它 ourVeryOwnFunction()
as
if(dbval==NULL) { write_startup_file("FAILED");}
其中 dbval
是一个值 read.But 当我编译内核时 运行 它(我 运行 在 vmware 上编译它)。我得到的内核恐慌是 here
很明显我做错了什么。寻求帮助。谢谢。
首先,初始化你的struct file *
指针。不要依赖于 NULL
对返回指针的简单检查。请改用 IS_ERR
宏。老实说,一般来说,很难说还有什么问题。阅读类似这样的内容 http://ytliu.info/notes/linux/file_ops_in_kernel.html 或参考 SO
How to read/write files within a Linux kernel module?
File I/O in a Linux kernel module
也许它会给您一些见解或阐明一些事情。当然,不要从内核写入 fs :)
HTH.
也许startstring不能来自用户space,但是作为一个模块,模块驱动可以把它放到内核,不在用户 space 中。我想你可以尝试在堆栈中使用一个简单的字符串并删除参数 startstring ,这可以验证我的猜测是否正确。