對於類分配,我們正在編寫一個自定義系統調用,它可以獲取有關現有進程樹的某些信息。系統調用大部分工作正常,並獲得適當的信息。但是,有一些進程在崩潰時顯示錯誤消息「無法處理虛擬地址[地址]處的內核NULL指針取消引用」。我不明白的是,我正在測試指針是否爲NULL,然後它仍然失敗。Linux內核編程:「無法在虛擬地址[地址]處理內核NULL指針取消引用」
實施例:在下面的代碼,current_process是一個有效的指針的task_struct和k_buf是有效
printk("Setting parent process\n");
parent_process = current_process->real_parent;
printk("Parent process set\n");
if (parent_process != NULL) {
printk("Parent process is not null and getting pid\n");
k_buf[i].parent_pid = parent_process->pid;
} else {
k_buf[i].parent_pid = 0;
}
printk("Done with parent process\n");
當運行時,該程序打印:
Setting parent process
Parent process set
Parent process is not null and getting pid
Done with parent process
幾次,並然後
Setting parent process
Parent process set
Parent process is not null and getting pid
之前拋出的錯誤和進入內核恐慌。
我在做什麼錯?有什麼想法嗎?
編輯:
暫時,我註釋掉上面的代碼,所以我可以繼續在系統調用的其他工作。當我嘗試訪問一個子進程的PID(再次嘗試幾次後),它給了我一個「無法處理虛擬地址的內核分頁請求」錯誤。據我所知,我有正確的鎖定來讀取這些數據。但是,在我訪問內容之前還有什麼需要檢查內存嗎?
你有沒有見過'parent_process'爲NULL的情況?我懷疑NULL指針不是明顯的指針訪問,但需要更多的代碼來告訴。 – nategoose 2010-10-01 20:24:41
是的,我看到了parent_process爲NULL的情況。例如,init進程(進程1)有一個NULL real_parent,並將進入else情況。 – achinda99 2010-10-01 20:36:13
請問我們能否看到parent_process的結構聲明/定義? – 2010-10-02 05:31:20