Linux核心調用使用者空間程式的一般方法分析

來源:互聯網
上載者:User

Linux核心調用使用者空間程式的一般方法分析

當在核心空間中希望執行使用者空間的程式時,我們通常會調用call_usermodehelper函數或者kernel_execve。實際上,call_usermodehelper最終也執行了kernel_execve。但call_usermodehelper所多做的是將該執行請求添加到工作隊列中,待處理器執行。

函數實現在/include/linux/kmod.h中,該函數首先調用call_usermodehelper_setup初始化subprocess_info(其中包含工作隊列對象)並將__call_usermodehelper作為工作隊列的處理函數。然後調用call_usermodehelper_exec將工作隊列對象加入到khelper_wq隊列中,並等待其執行完成。__call_usermodehelper處理函數中將調用kernel_execve函數以在使用者空間執行所要執行的程式。至於kernel_execve的實現,在/arch/x86/kernel/entry_64.S中實現,其將調用sys_execve系統調用。

 
  1. ENTRY(kernel_execve)
  2. CFI_STARTPROC
  3. FAKE_STACK_FRAME $0
  4. SAVE_ALL
  5. movq %rsp,%rcx
  6. call sys_execve
  7. movq %rax, RAX(%rsp)
  8. RESTORE_REST
  9. testq %rax,%rax
  10. je int_ret_from_sys_call
  11. RESTORE_ARGS
  12. UNFAKE_STACK_FRAME
  13. ret
  14. CFI_ENDPROC
  15. END(kernel_execve)


這裡有個小技巧:subprocess_info中的第一個欄位必須為work_struct結構,因為在工作隊列執行__call_usermodehelper時,其可以擷取到subprocess_info的全部內容。

分析:這裡為什麼要使用call_usermodehelper來執行程式呢,個人認為執行使用者空間程式時,不需要佔用調用者的資源和時間,由工作隊列來處理即可。

遺留的問題:所要執行的程式是執行在使用者空間,還是核心空間呢?個人認為應該執行在使用者空間,原因很簡單,當我們在使用者態程式中調用該系統調用時,所執行的程式執行在使用者空間。所以我推測sys_execve系統調用中,肯定會有將核心棧指標更換為使用者棧指標的處理。只是猜測,需要後續找到證據。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.