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鉤子函式
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鉤子函式