Linux作業系統sysctl機制的思想與實現

2021-08-25 01:29:29 字數 2231 閱讀 4200

續《linux的netlink機制》:其實只要同時提供實現乙個核心netlink的核心模組和乙個定製使用者策略的使用者空間netlink程式,你就可以完全控制linux核心了,這裡核心的netlink就是機制,而使用者的netlink就是策略,正好一套,這樣的機制是在太棒了,把自己的機制和策略用netlink隨意往linux裡面插,linux竟然成了乙個舞台了,實際情況就是這樣的。

linux中不乏使用者空間與核心空間的通訊的機制,比如netlink,procfs,sysctl,/dev下的裝置驅動,當然還有更xx的系統呼叫。其實這些都是機制和策略的結合,核心實現的是機制,而使用者實現的是策略,在**表現上,一般都是一套**,也就是一套程式,使用者空間的策略控制程式和核心空間的機制**邏輯,核心空間傻傻的為使用者服務,它只知道來命令就做事而根本不管是什麼命令以及這個命令達到了什麼效果,這就是linux,機制和策略分離,很好很強大。前面分析了netlink,其實正如《linux的netlink機制》說的,netlink必須提供一套程式才會發揮作用,乙個機制乙個策略,那麼sysctl當然也是這樣的,在linux中有sysctl機制,它可以控制和改變核心中的變數,然後各個模組可以根據這些變數的值來採取不同的行為,這些變數就好像開關一樣負責核心中一些重要機制的開關和微調。

在核心中sysctl機制的實現十分簡單,和linux核心的大多數機制一樣,採用先註冊後使用的方式,只要你register了乙個sysctl的實體,那麼在使用者空間你就可以控制你註冊的實體變數了,然後在核心中你就可以用這些變數,根據這些變數的不同值來採取不同的動作,核心中的sysctl實現根本不涉及任何使用者策略方面的東西,僅僅是註冊,具體如何使用,那純粹是使用者設計該sysctl實體時要考慮的事情。下面就是乙個例子:

static struct ctl_table zhaoya_test = ,

}; static struct ctl_table zhaoya_root = ;

static int __init test_init(void)

就這就完事了,當我用sysctl的-w命令來改寫value變數的時候,proc_dointvec就會將我傳入的新值賦給value,其實載入模組後你會發現,在/proc/sys下有了zhaoya目錄,在這個目錄下有了value檔案,那麼如果你讀/proc/sys/zhaoya/value的話就會讀到新值。sysctl的核心實現就是sys_sysctl,最終呼叫do_sysctl:

int do_sysctl(int __user *name, int nlen, void __user *oldval, size_t __user *oldlenp, void __user *newval, size_t newlen)

tmp = &root_table_header.ctl_entry;

do while (tmp != &root_table_header.ctl_entry);

return -enotdir;

} static int parse_table(int __user *name, int nlen, void __user *oldval, size_t __user *oldlenp, void __user *newval, size_t newlen, ctl_table *table, void **context)

error = do_sysctl_strategy(table, name, nlen, oldval, oldlenp, newval, newlen, context);

return error;

} }

return -enotdir;

} 最後的do_sysctl_strategy實現了變數的替換,該函式中的ctl_perm很有意思,它就是利用ctl_table中的mode欄位和sysctl中的操作欄位來判斷當前操作是否被允許的,其實也沒有什麼意思。

int do_sysctl_strategy (ctl_table *table, int __user *name, int nlen, void __user *oldval, size_t __user *oldlenp, void __user *newval, size_t newlen, void **context) }

if (newval && newlen)

} return 0;

} 這就是sysctl的幾乎全部了,十分簡單,為何如此簡單,正是因為linux核心沒有那麼多策略性的東西,它只實現機制。記住,只要是機制和策略分離的東西,你要想提供乙個功能你就必須提供一套程式,乙個來實現機制,另乙個實現策略,正如sysctl和netlink一樣。

Linux作業系統sysctl機制的思想與實現

續 linux的netlink機制 其實只要同時提供實現乙個核心netlink的核心模組和乙個定製使用者策略的使用者空間netlink程式,你就可以完全控制linux核心了,這裡核心的netlink就是機制,而使用者的netlink就是策略,正好一套,這樣的機制是在太棒了,把自己的機制和策略用net...

Linux作業系統sysctl機制的思想與實現

續 linux的netlink機制 其實只要同時提供實現乙個核心netlink的核心模組和乙個定製使用者策略的使用者空間netlink程式,你就可以完全控制linux核心了,這裡核心的netlink就是機制,而使用者的netlink就是策略,正好一套,這樣的機制是在太棒了,把自己的機制和策略用net...

Linux系統中sysctl命令

sysctl n e w variable value sysctl n e p default etc sysctl.conf sysctl n e a常用引數的意義 w 昨時改變某個指定引數的值,如 sysctl w net.ipv4.ip forward 1 a 顯示所有的系統引數 p 從指定...