模組參數(module parameters)
有時驅動程式需要一個設定,不是在編譯期決定,而是在它載入的那一刻決定:要用哪個 I/O 連接埠、緩衝區做多大、是否啟用除錯模式。模組參數就是你載入模組時能交給它的具名旋鈕,像是給模組的命令列旗標。你可以在 insmod 或 modprobe 那一行設定它們,甚至寫在設定檔裡。
在模組裡,你用 module_param(name, type, perm) 巨集宣告一個參數:它把一個普通的 C 變數綁到一個名字上,由載入器填入。例如 module_param(buffer_size, int, 0644) 建立參數 buffer_size;若你以 insmod my.ko buffer_size=4096 載入模組,到 init 執行時該變數就持有 4096。權限引數(此處為 0644)控制該參數是否也出現在 /sys/module/<名稱>/parameters/ 底下且可寫,讓有特權的使用者能讀取,有時還能在執行中的模組上更改它。也有 module_param_array() 用於值的清單。
它們之所以重要,是因為讓同一份二進位檔不必重新編譯就能跨機器調整設定,這對散布驅動程式至關重要。兩個誠實的提醒:一個能透過 sysfs 在執行期被寫入的參數,可能在你程式碼腳下被改變,所以驅動程式不可假設它是常數;而參數在載入時只被讀進變數一次,除非你接好了 sysfs 寫入處理,否則對於一個你在 insmod 時讀取、之後再也不碰的值,事後更改那個 sysfs 檔並不會回溯地重跑你的設定。
static int buffer_size = 1024; // 預設值 module_param(buffer_size, int, 0644); MODULE_PARM_DESC(buffer_size, "buffer size in bytes"); // $ sudo insmod my.ko buffer_size=4096 // 之後可見於 /sys/module/my/parameters/buffer_size
一個可設定的緩衝區大小,有預設值、載入時覆寫,以及 sysfs 檢視。MODULE_PARM_DESC 為它加上說明。
一個可寫的 sysfs 參數可能隨時從另一個情境被更改;若你的程式碼快取它或依它行動,你可能需要加鎖,並且必須重新讀取,而不是假設載入時的值仍然成立。