2010-04-28 37 views
1

我的get_user()宏有問題。我所做的是如下:在內核模式下運行的Get_user返回錯誤

我運行下面的程序

int main() 
{ 
    int a = 20; 
    printf("address of a: %p", &a); 
    sleep(200); 
    return 0; 
} 

當程序運行時,它輸出的,比方說,0xbff91914地址。

然後我把這個地址傳遞給一個運行在內核模式下的模塊,它檢索這個地址的內容(當我這樣做的時候,我也確保了這個過程並沒有終止,因爲我把它放到了睡眠狀態200秒...):

地址首先作爲字符串發送,然後將它們轉換爲指針類型。

int * ptr = (int*)simple_strtol(buffer, NULL,16); 
printk("address: %p",ptr); // I use this line to make sure the cast is correct. When running, it outputs bff91914, as expected. 
int val = 0; 
int res; 
res= get_user(val, (int*) ptr); 

但是,res總是不爲0,這意味着get_user返回錯誤。我想知道是什麼問題....

謝謝!

- 方凱

回答

2

get_user的調用必須在用戶進程的上下文中進行。

既然你寫了「我也確定過程沒有終止,因爲我把它睡了200秒......」我有一種感覺,你不遵守這個規則。對於將get_user調用到用戶進程的上下文中,您必須從該進程進行系統調用,並且不需要休眠該進程。

因此,您需要讓您的用戶進程進行系統調用(一個ioctl就可以),並從該系統調用撥打電話get_user

+0

謝謝,現在我知道是什麼問題。但在我的項目中,我正在開發一個虛擬設備驅動程序,以便用戶可以通過指定其pid和虛擬地址來讀取任何進程的內存內容。因此,一個設備/ dev/gh被註冊,並且用戶嘗試執行如下操作:echo -n targetpid>/dev/gh&echo -n addr>/dev/gh因此,目標進程不能被修改。設備驅動程序將通過pid和虛擬地址檢索值並將其返回給用戶。我不知道如何用我的場景下的get_user解決這個問題。謝謝! – 2010-04-28 06:39:14

3

這可能是因爲你想從不同的用戶空間獲得價值。您得到的地址來自簡單程序的地址空間,而您可能正在使用另一個程序將值傳遞給模塊,不是嗎?

+0

那麼,我試圖不通過任何其他程序的模塊地址。我現在所做的是:在輸出變量的地址之後,我更改模塊的代碼,將ptr設置爲地址,然後重新編譯,重新加載模塊。我確信簡單的程序仍在運行。然而,get_user仍然返回錯誤... – 2010-04-28 05:32:41

+0

是的,我明白你的意思......當我提到用戶空間時,current-> pid指向另一個進程,因此它處於不同的上下文中......如何修復這個問題? – 2010-04-28 06:21:16

+0

當'current'是目標進程時,你必須安排一些事情,以便你可以執行'get_user()',例如,在休眠之後,你的目標進程可以在你的模塊創建的'/ proc'中讀取一個文件,並在proc文件的讀取例程中執行'get_user'。 – caf 2010-04-28 06:25:15

相關問題