**
1.各種驅動形式不過是表象,本質還是把fops註冊到inode中。
2.一直沒有找到確實的「證據」不過還是有點線索的:
device_create->device_create_vargs-> dev_set_drvdata(dev, drvdata)把fops設定到了dev->p->driver_data中 device_register->device_add->devtmpfs_create_node->vfs_mknod這裡應該就是終點了
注:前半部分把fops函式陣列放到了dev->device_private->driver_data中,後半部分vfs_mknod(nd.path.dentry->d_inode,dentry, mode, dev->devt);建立了裝置號與inode名稱的對映關係,這樣通過檔名可以找到裝置號,通過裝置號就能找到dev結構,通過dev->device_private->driver_data就能解析出fops,從而給系統呼叫open時建立file operation
linux平台驅動其實不是真正的「驅動」它只不過做點初始化硬體的事情(在probe函式裡)真正操作裝置的函式在device結構裡。
這裡體現了c++類的影子
3.簡單點說系統呼叫open會建立乙個file結構體,並且通過檔名和路徑找到inode結構,並提取i_fop給fops
4.至於提取的過程
static int chrdev_open(struct inode *inode, struct file *filp)
else if (!cdev_get(p))
ret = -enxio;
} else if (!cdev_get(p))
ret = -enxio;
spin_unlock(&cdev_lock);
cdev_put(new);
if (ret)
return ret;
ret = -enxio;
filp->f_op = fops_get(p->ops);
if (!filp->f_op)
goto out_cdev_put;
if (filp->f_op->open)
return 0;
out_cdev_put:
cdev_put(p);
return ret;
}注:貌似只有 open(!/dev/testchar!, o_rdwr) 開啟才是這樣的,因為/dev目錄下都是字元的驅動,是不是使用cdev的都不在sysfs內呢?
在linux裝置模型**之裝置篇中有段描述:device_add定義在drivers/base/core.c中
int device_add(struct device *dev)
{................
if (major(dev->devt)) {
error = device_create_file(dev, &devt_attr); //如果存在裝置號則新增dev_t屬性,這樣udev就能讀取裝置號屬性從而在/dev/目錄下建立裝置節點,這樣kobj和cdev也關聯了
if (error)
goto ueventattrerror;
注:所以我一直追求的目標貌似在這裡,是udev把device裡包含的fops關聯到cedv裡,然後chrdev_open就順理成章了!!
補充點內容:device結構有個device_private用來放一些不想對外開放的東西,其中還有個driver_data。所以是這樣的device->p->driver_data
一般情況下這裡放的是file_operations但是也未必,對於platform來說有2個函式void *dev_get_drvdata(const struct device *dev)
和void dev_set_drvdata(struct device *dev, void *data)
註冊的時候set,至於以後怎麼用就不一定了,比如led的驅動,使用get函式又取出資料,放在了attr裡匯出到使用者空間使用
領域驅動設計之關聯設計
在找到實體與值物件後,我們就需要進行物件之間的關聯設計。1.關聯盡量少,不要形成複雜的關係網。複雜的關係網不利於劃分邊界,理解與維護物件,同時對效能也有不利影響,通常關係只找出在整個業務生命週期都需要存在的關係。比如乙個訂單項需要關聯到產品,但是仔細分析,乙個訂單項並不需要再整個業務生命週期都需要存...
linux驅動之 led驅動
練手,第乙個字元驅動.用模組載入方法 華清遠見 嵌入式linux裝置驅動開發詳解 的 拿來改的.編譯過程發現很多錯誤.最後發現 這本書帶的驅動 都是基於linux2.4的.目前我用的linux2.6,部分需要做修改.我的板子是 友善之臂的 2410.vmware ubuntu nfs交叉編譯 首先 ...
Linux中匯流排 裝置 驅動是如何關聯的?
對於linux驅動開發來說,裝置模型的理解是根本,顧名思義裝置模型是關於裝置的模型,裝置的概念就是匯流排和與其相連的各種裝置了。電腦城的it 工作者都會知道裝置是通過匯流排連到計算機上的,而且還需要對應的驅動才能用,可是匯流排是如何發現裝置的,裝置又是如何和驅動對應起來的?匯流排 裝置 驅動,也就是...