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