探尋linux系統移植的世界

把linux在arm開發板上進行定制,并在arm開發板上運行起來。
更好地理解linux的構架過程。

驅動開發是在系統運行起來后,在內核中增加一些驅動子功能而已。


一、概述

1、arm裸機程序系統結構圖

ARM裸機程序系統結構圖

硬件層:硬件工程師決定硬件放在哪個資源。如,是在GPA口,GPH口,還是GPG口。

驅動層:驅動工程師根據硬件的架構,把驅動的資源用代碼去指向,比如C語言的指針去指向相應的資源;硬件需要什么樣的高/低電平或組合的數據,讓其工作,是由驅動層封裝的。

應用層:根據傳遞的不同的值,來得到不同的結果。

該架構存在的問題:
耦合性太強,一旦一層發生改變, 其他層都會變。

2、類android等復雜功能系統結構圖

為了解決上述問題,引入一個概念:OS;引入一層:kernel層。

可以讓應用層程序員解放出來,不用關心底層。
同時,也可以進行資源管理、多進程多線程管理等。

類android等復雜功能系統結構圖

驅動控制硬件工作。

驅動與內核:驅動把支持的設備向內核報告,內核根據傳來的信息,會調用不同的驅動程序,來控制相應的硬件。

它們可以認為是一個整體,都屬于底層軟件的范圍。

3、android系統框架圖

android系統框架圖
hal層的加入,使得Libraries層和kernel層又隔離開了

通過分層,可以實現軟件復用性、可移植性。而且不同模塊解耦。

不是分層越多越多,分層越多,速度也越慢。


二、系統移植學習內容

1、交叉編譯環境

搭建交叉開發環境

2、bootloader功能子系統

bootloader的選擇和移植

系統一上電會運行一個程序:bootloader(啟動加載),目的是load kernel。

可以做很多種方案的選擇。
很多大型項目中,更多是選擇適合項目的啟動加載代碼,然后再改改(移植)。
很多時候,買芯片的時候,芯片廠商就已經提供好了。

3、內核核心子系統

kernel的配置、編譯、移植和調試

4、文件系統子系統

根文件系統的制作

給用戶用,還得提供文件系統。

這4個就是整個系統移植的精髓。


三、學習思路和方法

先整體后局部,層層推進。

每個子系統是如何編譯的 ---> 在基本功能下,如何添加命令或功能 ---> 如何自定義自己的開發板,與自己的開發板具體硬件相聯系

每個子系統都具有一個復雜的層次關系。
所以要先掌握整體,需要首先掌握相關子系統的藏寶圖,有了這個地圖,去探索它就有了方向。


四、系統移植的基本步驟

拿到一塊板子,如何讓整個系統跑起來呢?

1、確定目標機(開發板,客戶端)和主機(PC,開發機器,服務端)的連接方式

主機性能會比目標機好太多,因此一般在主機開發,把主機編譯好的內容數據傳輸給目標機。

數據就是高低電平。

傳輸方式:

(1)UART異步串行通信接口 (串口)
它是非常經典的與PC機通信的接口。

優點:

  • 功能很強大,既可以輸入,也可以輸出,比較萬能。
  • 實用性強(90%的板子都支持)

缺點:速度比較低,效率比較差。
大文件一般不用串口傳輸,小文件可以。

(2)USB串行通信接口
現在已經發展到USB 3.0

優點:速度快
缺點:USB的驅動要移植修改。
板子剛剛上電,就讓串口工作,是不現實的。

(3)TCP/IP網絡通信接口
優點:速度快(10/100Mbps)
缺點:驅動需要移植

TCP/IP已經很成熟了。開發板與PC可以以C/S模式進行數據的傳輸和下載。比較通用。而且網卡的速率也比較快,最少10M,100M網卡也很多。

通過網絡接口去下載數據的情況很多。

(4)Debug Jtag調試接口
方便快捷,但價格很高,很少使用。

2、安裝交叉編譯器

PC的cpu架構是X86,X86程序和arm程序不兼容,因此需要交叉編譯器。

2種方法:

(1)安裝芯片廠商已經編譯好的工具鏈

一般有如下前綴名:

arm-none-linux-gnueabi-
簡稱:arm-linux-
(把arm-linux-軟鏈接為上述前綴名)

arm-none-eabi-
這個不支持操作系統。

arm-elf-
這個非常老了。很少見到了。

第一列:目標體系結構
gcc:默認編譯x86
有arm,就會編譯arm

第二列:廠商名。開源的話,一般是none

第三列:該編譯器默認編譯出來的功能是針對linux操作系統去用的。
這個編譯器內部有些標準C庫,是與linux系統相關的。
在windows下運行不了。

第四列:
gnu:開源
eabi:嵌入式的標準調用接口。針對嵌入式精簡的相關庫。

(2)自己動手編譯交叉工具鏈
《The GNU Toolchain for ARM Target HOWTO》這本書會介紹。

自動動手編譯非常耗時,而且會報很多不兼容的問題。調試需要功力,對編譯原理要理解的很清楚。很多公司都不會去做。不建議使用該方法。

思路其實比較單一,唯一的不好是版本間的依賴關系比較大。

3、搭建主機-目標機數據傳輸通道

比如用網絡,則需要網絡相關服務器的配置。

一般嵌入式中,用的比較多的服務:

  • TFTP :基于UDP協議傳輸的,是FTP的簡版。UDP比FTP簡單。
  • NFS:網絡文件系統。目的是linux與linux之間掛載用的。
    文件系統的調試,很多時候用NFS作為調試的工具。

4、編譯三大子系統:

bootloader功能子系統
內核核心子系統
文件系統子系統

該步驟難度最大。

5、燒寫測試

整個進行集成,然后放到工廠進行集成化生產就可以了。


五、環境搭建需求分析

需求分析:
主機中的數據 如何傳遞 到開發板?

目的1:普通數據的傳遞:比如,uboot,kernel。
主要目的就是為了傳遞。
UART很少使用,更多使用的是網絡接口。最主要的使用方式是TFTP服務。

TFTP主要傳輸的是kernel的文件。
uboot會通過其他方式燒寫(當然網絡接口也可以傳輸。看開發環境來決定。)

目的2:調試:主機的一塊內存空間,直接掛載在板子上。

在x86上調好,再放到板子上。
但是,有可能調試不是很順利,因此需要開發板與PC間建立更合理、方便的解決方案。

不能在板子上直接調試,就是因為板子容量太小。
要想辦法擴大板子空間,但是flash太貴。

板子可以外掛很大空間的存儲器,比如U盤。
但是U盤很麻煩,插開發板上,完了還得拔下來插PC上。

思路:調試時,不一定非要進行網絡傳輸。只需要把數據掛到板子上就可以了。

辦法:通過網線把共享的數據塊(當作USB),通過TCP/IP來傳。
共享的數據庫就在PC上。

調試起來更加方便,PC上的修改板子上就可以直接看到了,不需要進行更多的數據傳輸了。

調試內核驅動、應用程序,很多時候是借助這種方式,在PC上進行軟件開發,然后直接在板子上進行驗證。


六、筆記本移植環境搭建

串口:連接方式方便,驅動簡單。
少數據量的東西,會用串口。
標準輸入/輸出,會定位到串口驅動上。

筆記本都是USB接口,而開發板要用串口,因此要買USB轉串口。

如何排查目標機與主機的各層是否通了?

  • 應用層:調試程序
  • 傳輸層:主要是端口port沒有開放。要不就是服務器開放端口不對或未開放端口,或者客戶端訪問的端口不對。
  • 網絡層:通過ping看看在不在一個局域網段。
  • 物理層:查看插上的網卡燈有沒有亮。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 移植 下面我們就來看下一個內容叫做移植的基本步驟,也就是說我們要現有一個大體的思路,如果說我作為產品開發者,或者說...
    隨波逐流007閱讀 1,173評論 0 1
  • 姓名:吳兆陽 學號:14020199009 轉自韋東山 嵌牛導讀:對嵌入式初學者,沒有足夠的視野選擇一個合適投入方...
    吳兆陽閱讀 2,426評論 0 4
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,242評論 25 708
  • 仿佛下一秒就要死去 現在這一秒如此珍貴 舍不得給你一個擁抱 只因為有更重要的事要去做 如果下一秒活得更好 怎么說也...
    之亦夫閱讀 158評論 4 4
  • 文/高一點兒 自古何為緣? 是冥冥之中以注定? 還是前世輪回的相遇? 昔年的霧中相遇,懵懂混著朦朧,迷霧中看到了婀...
    高一點兒閱讀 530評論 11 15