- 初始化時首先向內核申請主芹缔、次設備號,包括動態(tài)分配或者靜態(tài)分配示罗,
register_chrdev_region()
- 對設備需要使用的資源進行分配以及初始化淋淀,比如內存、同步原語等禽额;
- 初始化
cdev
結構,將包含open
脯倒、release
、read
剪撬、write
等函數(shù)的file_operation
結構賦值給cdev->dev
, 然后使用函數(shù)cdev_add()
函數(shù)向系統(tǒng)注冊字符設備悠反,此時完成字符設備與設備號、操作函數(shù)的關聯(lián)梨水; - 但
file_operate
包含的函數(shù)接口為struct inode*
和/或struct file *
茵臭,那怎樣才能找到我們的scull_dev
結構體?所以需要在open
函數(shù)中通過inode
結構體的i_cdev
獲取字符設備指針旦委,然后利用container_of
獲取scull_dev
結構體指針,并賦值給filp->private_data
摩钙,這樣追葡, 我們便可以在read
、write
宜肉、ioctl
等函數(shù)中通過struct file *
獲取自定義字符設備的指針,即scull_dev
啦谬返。
image
image