這裡主要分析一下cdev_add函式。
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
這個時候就有個關鍵的資料結構了,塊裝置也是這樣儲存的,這個結構就是cdev_map。
static
struct kobj_map *cdev_map;
struct kobj_map *probes[255];
struct mutex *lock;
};
看到和上一章的chrdevs的相似之處了嗎,這個probes也是個雜湊鍊錶結構,它的演算法也是用major%255來算它的索引號。然後把衝突域用鍊錶的形式掛接起來。
void __init chrdev_init(void)
struct kobj_map *kobj_map_init(kobj_probe_t *base_probe, struct mutex *lock)
base->dev = 1;
base->range = ~0;
base->get = base_probe;
for (i = 0; i < 255; i++)
p->probes[i] = base;//所有表頭都指向base結構。
p->lock = lock;
return p;
}
回過頭看kobj_map(cdev_map, dev, count, null, exact_match, exact_lock, p);
int kobj_map(struct kobj_map *domain, dev_t dev, unsigned long range,
struct module *module, kobj_probe_t *probe,
int (*lock)(dev_t, void *), void *data)
mutex_lock(domain->lock);
for (i = 0, p -= n; i < n; i++, p++, index++)
mutex_unlock(domain->lock);
return
0;}
**是用來分析的,不是用來講的,多看看就知道程式設計者思想。這就是分析底層**的原因。
至此,當kobj_map之後,字元裝置就註冊到了系統上,kobj_map有什麼用?那就簡單提一下。
使用者在使用者空間使用open、write、read的時候通過swi指令實現軟中斷(arm),切換到核心態,也就是通過cpsr切換到管理模式。。。。這也是系統呼叫的實現。。
—–(使用者態)open
——-sys_open(系統呼叫 核心態)
——-do_sys_open
———-do_filp_open
———nameidata_to_filp
————__dentry_open
之後就會呼叫chrdev_open ,
static
int chrdev_open(struct inode *inode, struct file *filp)
{ 。。。。。。。
kobj = kobj_lookup(cdev_map, inode->i_rdev, &idx);
。。。。。。。
這裡就用到了cdev_map,他從cdev_map裡面通過裝置號查詢出到裝置,再將其file_operations 成員賦值給filp指標裡面的i_fop。
裡面有許多檔案系統的知識我也不清楚。。慢慢學吧。。。學到了在分享
linux字元裝置完全分析(一)
終於。我開始寫部落格了。因為懶。所以拖了很久。以後要多堅持。今天主要是linux 字元裝置分析,既然是分析,那就要往深了分析才有意思。字元裝置的表示當然是指這個struct cdev結構。let us see。struct cdev kobj用來表示sys下的目錄,owner模組使用者指標,一般賦值...
linux 字元裝置 驅動框架 二
前面編寫了乙個簡單的 linux字元裝置驅動 linux driver 1 接下來簡單地來看一下字元裝置驅動的框架。在linux 字元裝置裡,有三個比較重要的資料結構,分別是 struct file operations,struct file和struct inode 下面來簡單的說明一下 這個結...
linux字元裝置
字元裝置的定義 linux下有三種裝置 字元裝置 塊裝置 網路裝置等等。它們均以乙個檔案節點形式顯示在檔案系統的 dev目錄下 crw w 1 root tty 4,0 7月 11 09 11 tty0其中c代表字元裝置型別 字元裝置是指裝置無需緩衝即可直接進行讀寫的裝置,如滑鼠,鍵盤,串列埠裝置等...