2013-04-23 485 views
0

我需要從內核線程調用get_user_pages_fast()。但get_user_pages_fast()內部使用current->mm,對於內核線程,其設置爲NULL。有什麼辦法可以解決這個問題嗎?正在討論的內核線程正在代表另一個進程工作,如x,將x->mm設置爲current->mm並調用get_user_pages_fast()可以嗎?get_user_pages_fast()來自內核線程

[編輯1]:我驗證了這一點,它似乎工作。我仍然擔心它是否會在某些情況下破裂。任何見解都值得歡迎。謝謝。

+0

你將需要說你正在嘗試使用什麼語言 – thecoshman 2013-04-23 07:41:11

+1

這是linux內核,我使用C.爲防萬一我沒有正確的框架,它不是一個編程問題(如分配工作),但在Linux內核和內核線程的環境中是否合適。 – spa 2013-04-23 08:15:07

+0

將'x-> mm'指定爲'current-> mm'告訴內核您的線程具有與進程'x'相同的虛擬內存空間。這真的是你想要的嗎? (它會打擾我有一個內核線程,應該留在一個純粹的內核上下文有一個虛擬內存空間?!) – Rerito 2013-04-23 12:03:33

回答

1

我不相信這是完全安全的。 get_user_pages_fast_fast部分意味着不需要獲取mm->mmap_sem,並且工作的部分原因是因爲假定我們在流程本身內運行(因此例如current->mm不能完全消失)。由於你在另一個線程中運行,如果真正的進程做了某些改變其映射的事情,那麼你很容易受到種族歧視。

我想問題是爲什麼你不能只用get_user_pages來代替?

+0

當kthread運行時,用戶進程需要做的就是''fork''或''exit'',並且會有比競爭條件更嚴重的猴子業務來應對。我同意直接調用''get_user_pages'''設置''mm''更好。 – 2013-04-23 17:56:04

+0

Roland,@Jonathan Ben-Avraham,謝謝你,我明白現在的風險。我將探討如何使用get_user_pages()而不是上面的hack。 – spa 2013-04-24 00:30:43

2

你的「黑客」確實會工作,但讓我們退一步,並瞭解它的想法是:

當你在一個內核線程的,(我說的是純內核線程(不是在內核模式下執行的用戶線程,如服務系統調用的情況),那麼沒有用戶內存可言。這就是current-> mm爲空的原因:沒有「當前」用戶空間內存。

當你將current-> mm分配給x-> mm時,通過附加無辜x的進程內存空間成爲你自己的「作弊」。因此,您執行的任何分配都將被計入x,並且將由x(它畢竟是其內存空間的一部分)可見。此外,可能會有內核對current-> mm進行內核檢查,這可能會被欺騙,導致內核模式線程被內核視爲用戶模式線程(儘管可以說其他檢查依賴於KERNEL_DS/USER_DS,你沒有修改)。仍然是一個問題。如果x消亡(嘿 - 沒有人的不朽),這將會破壞,並且如果不是恐慌,可能會導致哎呀。

你還沒有說過爲什麼你需要獲取用戶頁面 - 如果你知道x是活的並且你正在做這個作爲IPC/shmem的一部分,我可以看到一個原因。如果是這種情況,您可能需要爲有問題的進程提供一些API來向內核線程「註冊」。否則,你的解決方案是有效的,但是......不是那麼簡單。

+0

@Technologygeeks,是的,我相信X是活着的。原因 - 內核線程發現X的特定頁面不在內存中,需要映射頁面。這就是爲什麼它使用get_user_page_fast()來分配新頁面。 – spa 2013-04-24 00:54:39