close
//----------------------------------------------------------------
//==//auto create device node//==//
vpu_dev_class = class_create(THIS_MODULE, VPU_DEV_NAME);
if (IS_ERR(vpu_dev_class)){
INFO("can't create class %s\n", VPU_DEV_NAME);
ret = PTR_ERR(vpu_dev_class);
return ret;//return -EFAULT;
}
vpu_dev = class_device_create(vpu_dev_class, NULL, MKDEV(VPU_MAJOR, VPU_MINOR), NULL, VPU_DEV_NAME);
if (IS_ERR(vpu_dev)){
INFO("failed to create device %s", VPU_DEV_NAME);
ret = PTR_ERR(vpu_dev);
return ret;//return -EFAULT;
}
//device_destroy(vpu_dev_class, MKDEV(VPU_MAJOR, VPU_MINOR));
//class_destroy(vpu_dev_class);
//----------------------------------------------------------------


REF://http://daydreamer.idv.tw/rewrite.php/read-49.html

過年前跑去書店打發無聊的時間,看到這個月又出了兩本跟linux device driver相關的書籍,隨手拿起來翻翻,發現其中有一篇寫到udev framework,裡面詳盡解釋device node在insert kernel module時如何自動建立,並且可隨著使用者更改規則而產生persistent node…等不同於devfs的變化

在udev的官方網頁有篇不錯的conference paper,裡面有提到幾個重點,udev的出現為了解決目前在devfs上碰到的3個問題
1.udev能夠根據規則建立device node(這可以解決probing時,device node可能會依probing的順序不同而改變)
2.udev動態建立device node,不會像以前在/dev資料夾下擺一堆多而無用的device node
3.提供user更方便的API存取目前device的資訊,在kernel 2.6以上已提供sysfs這個device管理機制

udev運作的原理很簡單,它透過netlink得知目前kernel有那些module新增了,在收到kernel module新增的netlink訊息之後,它會先掃描user是否有指派device node rule,如果沒有,會自動根據module的major和minor number建立device node.有一點比較特殊的地方是,udev用inotify監聽rule變化的event,所以可以即時改變device node的狀態,udev的架構圖可參考如下
udev1


那我做個小實驗,看看udev到底是如何運作的,這個實驗分為兩個部份,一個是character kernel module,而另外一個就是udev的user space program(下載udev-137.tar.gz) http://www.us.kernel.org/pub/linux/utils/kernel/hotplug/

character kernel module寫作的重點在於init時會建立class與create device

character kernel module寫作的重點在於init時會建立class與create device


charmodule_class=class_create(THIS_MODULE, DEVICE_NAME);
if (IS_ERR(charmodule_class))
return -EFAULT;
device_create(charmodule_class, NULL, MKDEV(driver_major, 0), DEVICE_NAME);
character kernel moduel移除時會remove class和destroy device


device_destroy(charmodule_class,MKDEV(driver_major, 0));
class_destroy(charmodule_class);
我把udevd和udevadm移植到實驗平台,並且執行指令udevd –d,當我insert character kernel module時,udevd會自動幫我建立device node
arrow
arrow
    全站熱搜

    BB 發表在 痞客邦 留言(0) 人氣()