linux driver中的面向對象的應用和相關設計模式

創建類設計模式:

  • 單例模式、
  • 工廠模式、
  • 抽象工廠模式、
  • 原型模式、
  • 建造者模式

結構類設計模式

  • 裝飾器模式、
  • 適配器模式、
  • 門面模式、
  • 組合模式、
  • 享元模式、
  • 橋樑模式

行爲類設計模式。

  • 策略模式、
  • 責任鏈模式、
  • 命令模式、
  • 中介者模式、
  • 模板模式、
  • 迭代器模式、
  • 訪問者模式、
  • 觀察者模式、
  • 解釋器模式、
  • 備忘錄模式、
  • 狀態模式

linux 中的設計模式

  • 模板方法(Template Method)
    定義中間層,抽象出總線或者一類設備的接口

  • 觀察者模式
    Linux內核中的通知鏈系統,callback函數

  • 橋接模式(handle/body)
    橋接模式的設計意圖將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
    Linux內核中使用的最重要的橋接模式,在於萬物皆文件的思想。即將用戶態的抽象字符設備文件,與實際的字符設備驅動實現分離,從而使得文件描述符和內核設備驅動可以分別在用戶態和內核態獨立變化,只需要在open的時候將抽象文件與實際的設備驅動關聯起來即可。
    在這裏插入圖片描述

  • Linux設備驅動中的繼承關係
    Linux內核設備驅動中,字符設備模型是典型的基類,而video_device、 framebuffer、miscdevice都是字符設備,滿足IS-A的關係,因而都繼承了字符設備的特性(支持字符設備open, ioctl, read,write等典型的訪問方法函數), 都是字符設備的子類。

struct cdev {
	struct kobject kobj;
	struct module *owner;
	const struct file_operations *ops;
	struct list_head list;
	dev_t dev;
	unsigned int count;
};
  • 通過基類訪問子類的方法
    在Linux內核設備驅動中,我們在用戶態open一個字符設備,然後調用字符設備的read/write/ioctl函數,最終也會調用到內核態設備驅動程序相應的read/write/ioctl函數的實現,從而模擬了通過基類與多態函數的特性來訪問子類的目的。

實際上,Linux內核會維護基類與子類cdev對象實例的鏈表,當用戶態發起read/write/ioctl等字符設備系統調用函數時,read/write/ioctl等字符設備系統調用函數會通過/dev/*下的字符設備,設備節點號的方式(主節點號major,次節點號minor)從cdev鏈表的子類中,找到對應子類的cdev對象實例,然後判斷是否爲空並調用子類cdev->ops->read/write/ioctl等實際子類的多態函數實現,從而最終實現了通過訪問基類的多態函數,最終訪問到子類實際的多態函數,這個面向對象的特性。

  • 實例化:
    大部分情況下,內核設備是通過總線的接口(包括platform虛擬總線,也包括USB、SPI、I2C等真正的總線,只要是繼承structbus_type基類對象的總線都可以)的probe()函數進行實例化的。例如三星的framebuffer驅動s3c-fb.c,就是通過實現struct platform_driver這個接口,在接口的probe()函數中,爲識別到的framebuffer設備創建/dev/*下的節點,實現s3c-fb字符設備的實例化。

在不實現總線接口的字符設備中,定義一個struct cdev mycdev;之後,在模塊加載module_init()的時候,也是可以調用構造函數(初始化函數),創建/dev/*下的設備節點,從而完成實例化的。這種情況下,mycdev可以代表一個設備的實例,這種情況下模擬了面向對象設計模型中的單例模式,這也是可行的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章