回覆列表
  • 1 # 使用者6643871735969

    Linux kernel映象 (vmlinux或bzImage等)是一個自包含系統,它不依賴於什麼動態plug-in的東西,所以Linux kernel無法直接呼叫任保不存在核心vmlinux之外的函式。

    與之相反的是,Linux使用者態程式是可以呼叫運態庫函式的,比如main函式呼叫printf函式(glibc動態庫上的函式),動態連結器在程式執行時,會將程式依賴的動態庫裝載到記憶體,並靜態(或延時繫結)地做重定位工作。

    Linux的kernel映象都是自包含的,它不依賴任何其它元件,所以無法呼叫任何不在vmlinux裡的函式。 這是Linux kernel 自身設計所決定的。

    但是Linux kernel提供Loadable kernel Module功能,但並不是Linux kernel呼叫它,Linux kernel是看不到它存在的。實際上,Loadable kernel Module在載入時,init函式執行,向核心註冊鉤子函式,然後Linux kernel才呼叫Loadable kernel module的函式,這個是回撥,不是直調。

    所以,如果你想在核心擴充套件功能,老老實實寫好各種各樣的回撥鉤後,當前核心執行到相應的功能,就會回撥你的函數了。

    打個比方,你實現了一個字元裝置,編寫了fs_operations下.write鉤子函式叫 my_write,假如透過mknod命令建立的裝置是/dev/mychar,那以下使用者態程式碼:

    就會回撥你寫的my_write鉤子函式

  • 中秋節和大豐收的關聯?
  • 傳令妃魏嬿婉歷史原型揭秘歷史上的令妃結局怎麼死的?