編譯期(compile time)改變的技巧很簡單,就是在標頭檔定義巨集;實作檔中再對把巨集賦值給目標變數。
這麼做的好處是如果要改,去標頭找就好了。方便集中管理。
如main.c(scull的實作檔)中接近開頭處宣告這些變數
int scull_major = SCULL_MAJOR; int scull_minor = 0; int scull_nr_devs = SCULL_NR_DEVS; /* number of bare scull devices */ int scull_quantum = SCULL_QUANTUM; int scull_qset = SCULL_QSET;
而scull.h(scull的標頭檔)中定義以下巨集
#define SCULL_MAJOR 0 #define SCULL_QUANTUM 10 #define SCULL_QSET 10
而載入期(load time)改變的技巧,是透過module_param這個巨集將宣告的變數釋出,讓insmod指令能夠接受額外參數,達到載入期賦值的效果。細節請參閱insmod的參數。
值得一提的是,該範例將scull_major定義成0,如果沒有在上述兩個期間改變scull_major,driver將動態alloc一個給它。這段寫在scull_init_module()的程式碼如下:if (scull_major) { dev = MKDEV(scull_major, scull_minor); result = register_chrdev_region(dev, scull_nr_devs, "scull"); } else { result = alloc_chrdev_region(&dev, scull_minor, scull_nr_devs, "scull"); scull_major = MAJOR(dev); }
沒有留言:
張貼留言