Linux驅動軟硬件兼容性問題的考慮

Linux驅動軟硬件兼容性問題的考慮

-v0.1 2020.5.25 Sherlock init

簡介:本文簡單分析Linux驅動軟硬件兼容性問題方面的問題。提供一個簡單的高層邏輯分析

  1. 面對的問題

首先看我們的工作模型是怎麼樣。

硬件設計一代接着一代進行,前後之間的設計可能有:1. 把一個功能砍了(硬件爲了保
證兼容性一般不會這樣); 2. 新加了一個功能; 3. 改了一個功能(爲了兼容性一般也不會
這樣); 4. 改了一個功能,但是爲了兼容性還支持老的使用方式。

Linux驅動開發,我們一般先直接上傳到Linux主線。然後,根據需要回合到各個實際使用
的發行版本中。各個髮型版本中因爲要做質量控制,所以在發佈後,有可能只回合bugfix,
不做大特性的回合。

	mainline: a -> b -> c -> d -> e -> f -> g

	distribution a: a -> b -> c
	distribution b: a -> b -> c -> d -> e

軟件兼容性要求我們:1. 加一個新特性的時候,不能破壞老特性的使用; 2. 老的軟件
在新的硬件上使用時,老的特性還是可以使用的。

  1. 解決辦法

針對上面的,軟件兼容性要求第一點,我們不能改動已有的對外接口,比如各種內核ABI
接口(sysfs,debugfs,ioctl,mmap等等)。

針對以上第二點,軟件中不能用硬件版本號區分特性,比如:

 if (harware version == X)
	 feature_one();

上面這樣,在hardware version == X + 1硬件時,老的軟件feature_one就無法使用了。

一般的做法是, 通過預留的功能使能標記來判斷是否有該功能。而hardware version只用
來修復正常流程裏的bug。

 if (feature_on_enable())
	 feature_one();

對於純粹新加的硬件,我們只要原子的加上一個相關的支持補丁就可以,沒有回合這個
補丁就不支持新的功能。

對於硬件設計中的第4點。我們可以把改動後的功能認爲是正常流程,而把兼容之前的
硬件設計作爲一個bug用hardware version隔開。具體可以:

 if (harware version == X)
	 feature_one();
 if (feature_on_enable())
	 feature_one_new();

這裏我們假設硬件在X + 1這個版本上對feature_one做了如上第4點裏的改動。
我們加一個原子的補丁,把硬件爲了向前兼容做的努力看成是一個特殊硬件版本的bug,
而新的改動,我們把它看成是主流程。這樣,如果不合這個補丁,之前老的軟件可以運行
在新的硬件上。合入這個補丁,新的軟件可以跑在新的硬件上,並且使用改動後的特性,
新的軟件也可以跑在老的硬件上,同時新的軟件也可以兼容更新的硬件(只要硬件保證兼容)。

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