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

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