2017-03-25 189 views
0

这是我从内核写入文件的代码(我知道从内核直接读写并不是一个好主意,但这只是一个测试)。vfs_write引起内核恐慌

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()作为

if(dbval==NULL) { write_startup_file("FAILED");} 

dbval是一个值为read.But当我编译内核并运行它(IM运行它在VMware)。我得到的内核恐慌是here

显然我做错了什么。寻找一些帮助。谢谢。

+0

如果filp_open失败,会发生'old_fs'怎么办? – MirkoBanchi

回答

1

首先,初始化你的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。

+0

我在'filp_open'之前完成了所有这些更改,即'set_fs()',初始化'struct file *'和文件打开,我使用'IS_ERR'宏来检查,但是我仍然在'vfs_read'处得到内核恐慌。 – linuxnoob

+0

再一次,很难说你的情况是什么导致了恐慌。没有完整的源代码和关于特定条件的额外知识,总是很困难。内核尤其如此。这里是一个小而且伪劣的内核模式编写器http://pastebin.com/kPPLqdcd你可以使用这些小巧方便的'file_xxx' API。插入后,模块创建文件'/ root/test.txt'并从内核写入,卸载时从文件读取6个字节并关闭它。使用dmesg观察作者。在Linux 4.10.5 x86-64上测试,使用gcc 6.3构建。 HTH。 – rfx

+0

对于无意的desinformation关于'filp_open()'和'get | set_fs()'。我的错。 Theres没有错误的调用顺序。但是像vfs_write()和vfs_read()这样的例程仍然很重要。 – rfx