2010-10-01 84 views
1

對於類分配,我們正在編寫一個自定義系統調用,它可以獲取有關現有進程樹的某些信息。系統調用大部分工作正常,並獲得適當的信息。但是,有一些進程在崩潰時顯示錯誤消息「無法處理虛擬地址[地址]處的內核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(再次嘗試幾次後),它給了我一個「無法處理虛擬地址的內核分頁請求」錯誤。據我所知,我有正確的鎖定來讀取這些數據。但是,在我訪問內容之前還有什麼需要檢查內存嗎?

+0

你有沒有見過'parent_process'爲NULL的情況?我懷疑NULL指針不是明顯的指針訪問,但需要更多的代碼來告訴。 – nategoose 2010-10-01 20:24:41

+0

是的,我看到了parent_process爲NULL的情況。例如,init進程(進程1)有一個NULL real_parent,並將進入else情況。 – achinda99 2010-10-01 20:36:13

+0

請問我們能否看到parent_process的結構聲明/定義? – 2010-10-02 05:31:20

回答

1

我在這裏猜測,但可能parent_process->pidNULL是你的「內核恐慌」的原因?如果是這樣,你也可以檢查。

它或者,或者訪問數組即i th元素的問題即。 *(k_buf+i)

+0

授予parent_process似乎是有效的(見下面的評論),我傾向於parent_process-> PID爲NULL。但是,在嘗試訪問它之前,我測試了「if(&parent_process-> pid!= NULL)」,並且仍然出現錯誤。 – achinda99 2010-10-01 20:39:53

+0

咦? 'parent_process-> pid'不是一個指針,那它怎麼可能是NULL? – 2010-10-01 20:43:10

+0

我知道這是沒有道理的,但現在,它的parent_process-> pid是拋出錯誤(從我的理解)。我知道它不是一個指針。現在我已經把我的頭撞在牆上了。 – achinda99 2010-10-01 20:50:10

0

我有兩個問題。 real_parent有什麼可能的值?它可能不是NULL?你能打印這個值並檢查它在內核恐慌之前是什麼嗎?

另外,你確定k_buf [i]正確解引用?我不確定,只是試圖拋出一些想法。

編輯:我同意crypto
parent_process-> pid可能爲空。

+0

在include \ linux \ sched.h中,在task_struct結構中,您會看到real_parent是指向task_struct的指針。 如果我打印parent_process的值,它會打印一些整數。所以我猜這意味着它不是NULL? 但是,如果我嘗試打印parent_process-> pid,它會拋出錯誤並進入內核恐慌。 k_buf [i]正確解引用(通過嘗試分配int並打印它進行測試)。 – achinda99 2010-10-01 20:33:22

1

在訪問之前,您似乎沒有測試kbufkbuf[i]。還有,你可以用printk這些指針,這樣你就可以捕獲到非空,但是顯然無效的地址(比如0xbfff0c3a

+0

kbuf和kbuf [i]是有效的並且已經過測試。原來問題出在current_process上。它被設置的方式,在某些情況下是有效的,在其他情況下是無效的,但以某種方式超過了先前的NULL檢查。 – achinda99 2010-10-07 00:08:59