歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux設備驅動的分層設計思想

Linux設備驅動的分層設計思想

日期:2017/2/28 16:34:30   编辑:Linux教程
1.1 設備驅動核心層和例化

在面向對象的程序設計中,可以為某一類相似的事物定義一個基類,而具體的事物可以繼承這個基類中的函數。如果對於繼承的這個事物而言,其某函數的實現與基類一致,那它就可以直接繼承基類的函數;相反,它可以重載之。這種面向對象的設計思想極大地提高了代碼的可重用能力,是對現實世界事物間關系的一種良好呈現。

Linux內核完全由C語言和匯編語言寫成,但是卻頻繁用到了面向對象的設計思想。在設備驅動方面,往往為同類的設備設計了一個框架,而框架中的核心層則實現了該設備通用的一些功能。同樣的,如果具體的設備不想使用核心層的函數,它可以重載之。舉個例子:

return_type core_funca(xxx_device * bottom_dev, param1_type param1, param1_type param2)

{

if (bottom_dev->funca)

return bottom_dev->funca(param1, param2);

/* 核心層通用的funca代碼 */

...

}

上述core_funca的實現中,會檢查底層設備是否重載了funca(),如果重載了,就調用底層的代碼,否則,直接使用通用層的。這樣做的好處是,核心層的代碼可以處理絕大多數該類設備的funca()對應的功能,只有少數特殊設備需要重新實現funca()。

再看一個例子:

return_type core_funca(xxx_device * bottom_dev, param1_type param1, param1_type param2)

{

/*通用的步驟代碼A */

...

bottom_dev->funca_ops1();

/*通用的步驟代碼B */

...

bottom_dev->funca_ops2();

/*通用的步驟代碼C */

...

bottom_dev->funca_ops3();

}

上述代碼假定為了實現funca(),對於同類設備而言,操作流程一致,都要經過“通用代碼A、底層ops1、通用代碼B、底層ops2、通用代碼 C、底層ops3”這幾步,分層設計明顯帶來的好處是,對於通用代碼A、B、C,具體的底層驅動不需要再實現,而僅僅只關心其底層的操作ops1、 ops2、ops3。

圖1明確反映了設備驅動的核心層與具體設備驅動的關系,實際上,這種分層可能只有2層(圖1的a),也可能是多層的(圖1的b)。

圖1 Linux設備驅動的分層

這樣的分層化設計在Linux的input、RTC、MTD、I2 C、SPI、TTY、USB等諸多設備驅動類型中屢見不鮮。下面的2節以input和RTC為例先行進行一番說明,當然,後續的章節會對幾個大的設備類型對應驅動的層次進行更詳細的分析。

Copyright © Linux教程網 All Rights Reserved