新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 如何在16位單片機上移植linux

如何在16位單片機上移植linux

作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
一、一些想法
一直以來,linux被認為是個32位的“現(xiàn)代化”操作系統(tǒng),一般也沒有人在8位、16位單片機上面去移植linux。但是,從原理上來講,從任意位數(shù)的單片機,都是可以運行l(wèi)inux的——本質(zhì)上就是個操作系統(tǒng)么,既然ucos可以,為什么linux不行?
于是,我的畢業(yè)設(shè)計打算做這個選題。當然,雖然從原理上來講是可行的,但是在實際中遇到了一個非常大的困難,那就是底層的代碼量改動非常大。并且linux體系中涉及到很多32位的東西,比如MMU。
后來就萌發(fā)了另外一個思路:作為uclinux而言,本身是為了不支持MMU的單片機而設(shè)計的,可以考慮移植uclinux到16位單片機上面。同時,linux的早期版本,對ram和flash的要求都比較小,因此考慮移植早期版本的uclinux。
二、新的思路及其價值
但是今天又在google上面搜索,突然見到了如下的文章:
http://dmitry.co/index.php?p=./04.Thoughts/07.%20Linux%20on%208bit
這篇文章是用8位單片機來啟動ubuntu,并且發(fā)表時間也比較新(代碼最后修改是在3.22號,最近的網(wǎng)站更新是在4.3號)。其參考價值在于,作者并沒有采用傳統(tǒng)的“移植”的方法,來將linux的內(nèi)核直接搬到8位的單片機上面,而是通過加入了一個中間層的方法——首先,作者在8位單片機上面實現(xiàn)了一個ARM模擬器,模擬出來一個ARM環(huán)境;其次,將linux內(nèi)核在模擬的ARM環(huán)境中進行了運行。其巧妙之處在于,避開了復(fù)雜的移植過程(以及16位和32位的兼容性問題),將工作主要集中在如何在8位單片機上模擬32位的單片機(并且模擬了諸如MMU、DMA等系統(tǒng)模塊,以及UART等外設(shè))。那么這樣的工作還有另外一個重要的價值:在要求不高的情況下,我們可以采用更廉價、更低端的單片機(16位單片機、廉價的32位單片機)來模擬高端的單片機(ARM9系列等等)。
三、新思路的具體實現(xiàn)方案
實際上從原理上來講,這種思路的實現(xiàn)也很簡單。不考慮外設(shè)(當然部分外設(shè)也可以模擬,比如模擬IIC,模擬SPI)的情況下,實際上單片機內(nèi)部就是①指令集②寄存器。
首先來說寄存器。實際上32位的單片機,其寄存器都是32位的。同時,每個單片機的核心寄存器就那么幾個(比如8086,就是AX BX CX DX,還有DS SS SP等等)。既然是寄存器,那么對于8位單片機來說,32位的寄存器不就是4個寄存器連接起來么?不就相當于一個結(jié)構(gòu)體(或者是數(shù)組)么?因此,我們的模擬器可以考慮用一系列的結(jié)構(gòu)體來模擬32位單片機的內(nèi)部寄存器。
再來說指令集。不同單片機之間的指令集是不同的,這個道理顯而易見(同時,這個也是阻礙linux或者其他操作系統(tǒng)移植的最大的因素,因為移植linux的話最難的部分就在于底層匯編的編寫)。但是,匯編語言的本質(zhì)是什么?實際上就是機器語言的一種表現(xiàn)形式。那么機器語言是什么?不就是0和1么。話又說回來,所有的C語言的程序,最終都需要轉(zhuǎn)化成機器語言才能夠執(zhí)行——也就是說,C語言和機器語言是對應(yīng)的。那么,如果我手頭有一個ARM編譯出來的程序,那么肯定全部是機器語言,由0和1組成。如果我知道ARM系列每個機器語言的含義,并且對這個編譯出來的程序進行解碼,那么就能得到對應(yīng)的每一句的匯編語言(這也就是所謂的反編譯)。那么,如果我們在8位單片機的程序中,首先讀出ARM編譯出來的程序中每一句機器指令,然后加以解析,并且將這個機器指令對應(yīng)的操作進行實現(xiàn)——那么我們不就通過程序,來完成了ARM單片機中CPU的功能么?那么,這樣我們實際上就通過8位單片機上面的程序,完成了32位命令的解析,也就完成了一個ARM模擬器的工作的大部分。
當然,除了上述兩項,還有就是linux運行畢竟還是需要一定量的RAM和外設(shè),因此我們還要再加入一些外部RAM和FLASH,這些方案沒有什么難度,就只是工作量的問題啦。
四、一點展望

剛才那篇文檔的作者,已經(jīng)實現(xiàn)了ARMv5TE指令集的模擬,也就是ARM9單片機的內(nèi)核,但是他是啟動的ubuntu系統(tǒng),比較復(fù)雜,而且內(nèi)核啟動也比較麻煩(模塊較多)。事實上,我們完全可以通過這樣一個系統(tǒng)來啟動我們嵌入式的內(nèi)核,大小在幾M級別而已,如果精簡一下的話,啟動會更迅速,也會更具有實用價值。


關(guān)鍵詞: 16位單片機移植linu

評論


技術(shù)專區(qū)

關(guān)閉