linux字元裝置完全分析(二)

2021-08-13 21:55:04 字數 1840 閱讀 5008

這裡主要分析一下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代表字元裝置型別 字元裝置是指裝置無需緩衝即可直接進行讀寫的裝置,如滑鼠,鍵盤,串列埠裝置等...