如何移植Linux到晶心平臺?
圖表 3 u-boot 執行結果圖
本文引用地址:http://www.104case.com/article/201807/384683.htm3. 調試環境
在移植Linux到晶心平臺之前,先架設好調試的環境,尤其對底層Linux原始碼的移植,有莫大的幫助,在 printk尚未正常運作前,需依靠AndeShape的AICE與 AndeSoft的GDB來進行調試。
3.1設定Linux kernel 調試選項
Linux Kernel 需要設定一些調試選項,才能順利的運用AndeSoft的GDB進行調試。晶心平臺中Linux kernel 調試選項設定如圖表4所示,增加這些選項會增加kernel 映像文件的空間,如果空間占用過大以至于不符合設計需求時,可在調試工作完畢后將調試選項關閉以節約不必要的空間浪費。

圖表 4設定Kernel hacking 中調試選項勾選
3.2 Linux kernel 調試的程序
Build成kernel bootpImage (含kernel debug message如圖表四選項) 后,Linux的映像檔放到FPGA板子上,PC host 端的AndeSoft的GDB透過網絡(socket)與AICE連接至FPGA板子,進行調試的工作。
3.2.1. 編譯鏈結成映像檔
設定好AndeSoft的 cross-compiler 路徑后,利用下列指令經由compiler and linker后可以得到 bootpImage,指令如下:
#CROSS_COMPILE=nds32le-linux- ARCH=nds32 make xc5_defconfig
#CROSS_COMPILE=nds32le-linux- ARCH=nds32 make menuconfig
# CROSS_COMPILE=nds32le-linux- ARCH=nds32 make bootpImage INITRD=xc5_glibc_ramdisk.img
將生成的bootpIamge放到FPGA板子上,將AICE連接到FPGA板子啟動ICEman,指令如下:
#C:AndestechAndeSight200MCUice>ICEman.exe --p 1234
PC host端的AndeSoft™的GDB透過網絡(socket)與AICE連接至FPGA板子,進行調試的工作,示范指令如下:
#ddd --debugger nds32le-linux-gdb vmlinux
gdb>target remote 10.0.2.164:1234
其中IP值 10.0.2.164是一個應用范例,用戶可依環境實際IP值進行設定。環境設定完成后,可以開始進行調試工程。
4. 移植Linux至晶心平臺關鍵點經驗傳承
4.1 Kernel加載程序調試實作
kernel加載程序目的將kernel主程序進行解壓縮并加載正確位置,此程序與kernel主程序是兩個不同程序,但會一起包在zImage中只是kernel加載程序會attached在zImage的前面。調試時需 file不同的 ELF file才能進行正確的調試工作,kernel加載程序的位置在arch/nds32/boot/compressed/vmlinux,指令如下所示。
#ddd --debugger nds32le-linux-gdb arch/nds32/boot/compressed/vmlinux
kernel主程序的ELF file “vmlinux”在kernel source code的根目錄下指令如下所示。
#ddd --debugger nds32le-linux-gdb vmlinux
4.2 Linux kernel 調試實作
kernel加載程序執行完畢后會跳到kernel主程序執行。進入點是arch/nds32/kernel/head.S的assembly code執行完后會進入 kernel 的主要函數 “start_kernel”。
4.2.1. RAM offset patch
晶心版Linux原始碼搭配XC5平臺,RAM的起始位置(指的是PA)是0x0,使用者FPGA開發板的RAM起始位置如果不是0x0,必須要修改FPGA板子中RAM的起始位置,做法是在晶心版的Linux原始碼中進行RAM address patch,將原始碼中RAM位置調整到FPGA開發板中RAM的真實位置。
4.2.2. PA/VA remap table
當FPGA板子IO的PA設定正確后,使用者需要設定PA/VA remap table,作法可參考arch/nds32/include/asm/spec-ag101.h,依照apec-ag101.h中PA/VA對應的關系去增減使用者自己IO device的 PA/VA remap table。
4.2.3. Kernel 解壓縮與software breakpoint
在進行kernel 調試時,如果在低地址處,例如:head.S中進行調試,當設定 software breakpoint時,會有breakpoint無法停下來與AICE 斷線的情況發生。原因是當使用者設定software breakpoint時,breakpoint處的instruction會修改并加入break instruction。但kernel解壓縮時會將調試的程序代碼覆蓋造成與GDB調試不一致性而產生錯誤。解決的方法就是原設定software breakpoint改為hardware breakpoint,這樣就可以避免因kernel解壓縮所造成調試的錯誤,降低調試時的困難度。
4.2.4. PA/VA 觀念說明與調試要領
在原始碼arch/nds32/kernel/head.S中
la $lp, __mmap_switched
mtsr $lp, $IPC
iret
執行完iret后,系統就會從PA轉成VA,MMU translation status從translation off轉為translation on在此分界處調試規則如下所述,如果觀念不清楚及容易產生調試時的錯誤,請務必牢記。
4.2.4.1. MMU translation off 時期調試
在這個時期調試,VA是不存在的。所有的IO address與memory都是PA沒有VA,如果調試地址設成VA,容易hit illegal address 而造成exception。
4.2.4.2. MMU translation on 時期調試
在這個時期調試,PA是不存在的。所有的IO address與memory都是VA沒有PA,如果調試地址設成PA,容易hit illegal address 而造成exception.
4.2.5. 移植Linux的基礎組件
MMU translation on后,很快就會進入start_kernel 函數,接下來移植的重點就是移植Linux基礎組件,那就是interrupt,timer and UART。當這3個device移植成功后,Linux的架構就建立起來了,printk也可以用了,Linux已經可以正常的運作。如果沒有意外,可以執行完kernel甚至將filesystem帶起來。接下來用戶可以將自己的周邊組件一個一個的device driver移植入系統。當周邊組件移植完成后,Linux系統移植到晶心平臺就完成了。
5. 結語
Linux操作系統運作在晶心平臺已有多年的時間。各式各樣的Linux軟件運作在晶心平臺不計其數。皆可證明Linux操作系統運作結合晶心平臺是一個穩定與成熟的產品,只要能明了熟悉Linux 移植的技巧與重點,使用晶心平臺開發Linux的產品將是一件愉快與簡單的工作。
評論