2017-03-25 215 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