linux簡單字元驅動很簡單,只需要在初始化時對物理地址進行映射,再註冊一個fileopenration操作集,然後就和寫裸機程式一樣實現操作集就可以了。 問題一:為什麼要進行物理地址到虛擬位址的映射? 因為引入了MMU記憶體管理,只允許使用者操作虛擬位址。 問題二:為什麼要引入MMU,而不讓使用者直接操作物理地址? 因為記憶體管理非常複雜,主要是為了安全考慮。假如:驅動甲用到了一塊物理地址0x20000000進行操作,驅動乙也剛好用到了這塊物理地址。這種情況怎麼辦?注意,這時候並不會報錯,可能發生的事情不可預料。而用虛擬位址為種情況就可以避免發生了,該物理地址要是已有人用,核心會提醒映射失敗使用者則可以考慮另選一塊物理地址映射。百度的結果:第一,是安全。第二,便捷。第三,統一通用。第四,方便管理。第五,便於應用… 可是這麼簡單的驅動你幾乎是在linux核心裡看不到了,幾乎所有核心帶的驅動都是平台驅動.(你自己寫的除外) 問題三:linux為什麼要引入平台驅動來增加驅動的開發難度呢? 答案就是:便於移植。 打個比方:從你家到北京。如果你知道地形的話隨便怎麼走都可以到北京。可是現在要所有的人都能從你家到北京,大部分人可能都不會走,這時候該怎麼辦?當然你可以帶他們走,可是我們講的是所有人。這時候可以這樣,修一條高速公路從你家到北京,然後所有的人(包括認路的不認路的,會開車的不會開車的)只需要按照一定規則在路邊等待專車就可以了,車子會帶你到北京。 缺點:必須要先修一條從你家到北京的路,然後請一些有專業經驗的司機。 優點:原本所有人需要學會認路的本領自己上北京,現在只需要知道一些車子的資訊在公路旁邊按照一定規則等就可以了(你只需要知道你坐哪一路車,然後告訴司機你到哪下就行了)。 1、修一條路就好比建一條平台匯流排,有經驗的司機就好比各種器件的原始裝置廠商。 2、所有人就表示要做平板電腦,手機…各種的系統產品製造商。 3、“坐哪一路車,告訴司機到哪下”就是我們移植驅動需要告訴核心我們不同的晶片使用的硬體資源是哪些。 分析:建立一條平台匯流排,這事linux幫你做了, 各種各樣複雜的驅動(各種網卡晶片,感應器晶片…)原始裝置廠商他幫你實現了驅動與硬體無關的驅動部分。(當然也不要佩服這些人,因為這些人他們只會寫一種驅動,就是說網卡產商他們專門寫網卡驅動,唯寫一種驅動從無到有並不是很困難) 好了,現在最難的部分都讓有linux核心和原始裝置廠商都幫我們做了。我們只需要在驅動移植的時候告訴驅動我們使用的硬體資源就行了。 總結:隨著linux核心越來越複雜化linux從2.6開始引入了平台驅動,其實是對開發做分工從而發揮嵌入式的優勢. 平台驅動、平台裝置主要設及到四個重要的結構體。struct platform_driver,struct platform_device,struct device_driver,struct device。
|