linux驅動之 fops的關聯

2021-07-25 23:49:33 字數 2013 閱讀 7929

**

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 工作者都會知道裝置是通過匯流排連到計算機上的,而且還需要對應的驅動才能用,可是匯流排是如何發現裝置的,裝置又是如何和驅動對應起來的?匯流排 裝置 驅動,也就是...