++++++++++++++++++++++++++++++++++++++++++
本文系本站原創,歡迎轉載! 轉載請註明出處:
http://blog.csdn.net/mr_raptor/article/details/6269507
++++++++++++++++++++++++++++++++++++++++++
一、裝置註冊(fs/char_dev.c)
register_chrdev_region
->
__register_chrdev_region
->
主要任務:
從struct char_device_struct類型的全域變數chrdevs[255]中倒著找到第一個可用的char_device_struct結構,將裝置號和裝置名稱等相關資訊填充進去。
二、裝置結構分配(fs/char_dev.c)
cdev_alloc
-> 通過struct cdev *p = kzalloc()
實現cdev結構的分配
cdev_init
-> cdev->ops = fops;
cdev_add
->
在cdev_add裡,調用了kobj_map()這個裝置模組映射函數,將dev_t裝置號加入到了kobj_map結構體裡。其實就是將裝置號(最大為255)放入到了一個排好序的數組裡,如下代碼中的
struct probe *probes[255];。</p><p>struct kobj_map {</p><p> struct probe {</p><p> struct probe *next;</p><p> dev_t dev;</p><p> unsigned long range;</p><p> struct module *owner;</p><p> kobj_probe_t *get;</p><p> int (*lock)(dev_t, void *);</p><p> void *data;</p><p> } *probes[255];</p><p> struct mutex *lock;</p><p>};</p><p>
三、裝置驅動的開啟
當字元裝置檔案通過open系統調用開啟時,VFS會調用chrdev_open:
int chrdev_open(struct inode * inode, struct file * filp)
chrdev_open主要完成以下工作:
1.
利用傳遞過來的inode結構裡的i_rdev裝置號,通過kobj_lookup找到當前裝置對應的kobj對象
drivers/base/map.c:
struct kobject *kobj_lookup (struct kobj_map *domain, dev_t dev, int *index)
2.
通過container_of找到kobj所在的cdev結構(註冊字元裝置時分配上面第二步)
3.
將cdev結構中的ops(操作函數指標)賦值給file結構(傳遞迴去讓使用者空間訪問)。
4.
調用ops中的open(註冊字元驅動時的open操作函數),實現對驅動的open訪問。
++++++++++++++++++++++++++++++++++++++++++
本文系本站原創,歡迎轉載! 轉載請註明出處:
http://blog.csdn.net/mr_raptor/article/details/6269507
++++++++++++++++++++++++++++++++++++++++++