程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Linux內核調用用戶空間程序的一般方法分析

Linux內核調用用戶空間程序的一般方法分析

編輯:關於PHP編程

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系統調用中,肯定會有將內核棧指針更換為用戶棧指針的處理。只是猜測,需要後續找到證據。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved