2011年12月13日 星期二

程設技巧:linux device driver如何在編譯期/載入期改變變數值

ldd3的scull提供了一個很優秀的範例,終於看懂了。

編譯期(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);
}

沒有留言:

張貼留言