2011-10-27 224 views
4

我正在開發涉及kthreads的內核應用程序。我創建了一個結構數組,並在用戶空間中使用malloc分配內存。然後我調用一個系統調用(我實現了這個),並將數組的地址傳遞給內核空間。在我創建的系統調用處理程序中,我創建了2個將監視數組的kthreads。 kthread可以改變某些值,用戶空間線程也可以改變某些值。這個想法是使用數組作爲共享內存。但有些當我在內核空間訪問內存時(使用copy_from_user),數據會以某種方式更改。我可以在分配地址和內核時驗證地址是否相同。但是,當使用copy_from_user時,它會給出各種值,如垃圾值。用戶空間和內核線程之間的共享內存

也是下面的語句好嗎?

int kthread_run_function(void* data){ 
    struct entry tmp; 
    copy_from_user(&tmp, data, sizeof(struct entry)); 
} 

回答

6

這是不正確的,因爲copy_from_user()副本從目前用戶進程(這應該是顯而易見的,因爲沒有辦法告訴它從哪個用戶進程複製)。

在您的用戶空間進程調用的系統調用中,這是可以的,因爲當前進程是您的用戶空間進程。但是,在內核線程中,當前進程可能是系統上的任何其他進程 - 因此您正在從隨機進程的內存中進行復制,這就是爲什麼您會得到垃圾。

如果你想共享內核和用戶空間進程之間的內存,這樣做的正確方法是讓內核分配它,然後讓用戶空間的過程,它與mmap()映射到其地址空間。內核線程和用戶空間進程將使用不同的指針來指向內存區域 - 內核線程將使用指向內核地址空間內分配的內存的指針,並且用戶空間進程將使用指向由mmap()返回的內存區域的指針。

+0

你完全正確。我正在考慮從系統調用保存上下文,並將這個上下文用於copy_from_user,但我想這可能不合適。我也在考慮mmap。你能否給我提供一個適用於Linux內核2.6的例子。 – max

1

沒有,一般也不行,因爲data是內核虛擬地址,用戶虛擬地址。

但是,IFF你叫kthread_createdata參數等於__user指針,這應該是好的。

+0

好吧,我明白了。試着看看它是否有效。謝謝。 – max

+1

我試過,但沒有工作。從內核空間kthread訪問用戶空間指針時遇到了麻煩。我可以訪問系統調用函數中的內存,但在k線程函數中我無法訪問它。我的簡單查詢是如何獲得kthreads和用戶空間之間的共享內存。 – max

+0

您不能只將用戶指針填充到內核線程中。它意味着在用戶進程之外的任何其他任務中沒有*。 –

相關問題