4.1 Kernel加載程序調(diào)試實作
kernel加載程序目的將kernel主程序進行解壓縮并加載正確位置,此程序與kernel主程序是兩個不同程序,但會一起包在zImage中只是kernel加載程序會attached在zImage的前面。調(diào)試時需 file不同的 ELF file才能進行正確的調(diào)試工作,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 調(diào)試實作
kernel加載程序執(zhí)行完畢后會跳到kernel主程序執(zhí)行。進入點是arch/nds32/kernel/head.S的assembly code執(zhí)行完后會進入 kernel 的主要函數(shù) "start_kernel".
4.2.1. RAM offset patch
晶心版Linux原始碼搭配XC5平臺,RAM的起始位置(指的是PA)是0x0,使用者FPGA開發(fā)板的RAM起始位置如果不是0x0,必須要修改FPGA板子中RAM的起始位置,做法是在晶心版的Linux原始碼中進行RAM address patch,將原始碼中RAM位置調(diào)整到FPGA開發(fā)板中RAM的真實位置。
4.2.2. PA/VA remap table
當(dāng)FPGA板子IO的PA設(shè)定正確后,使用者需要設(shè)定PA/VA remap table,作法可參考arch/nds32/include/asm/spec-ag101.h,依照apec-ag101.h中PA/VA對應(yīng)的關(guān)系去增減使用者自己IO device的 PA/VA remap table.
4.2.3. Kernel 解壓縮與software breakpoint
在進行kernel 調(diào)試時,如果在低地址處,例如:head.S中進行調(diào)試,當(dāng)設(shè)定 software breakpoint時,會有breakpoint無法停下來與AICE 斷線的情況發(fā)生。原因是當(dāng)使用者設(shè)定software breakpoint時,breakpoint處的instruction會修改并加入break instruction.但kernel解壓縮時會將調(diào)試的程序代碼覆蓋造成與GDB調(diào)試不一致性而產(chǎn)生錯誤。解決的方法就是原設(shè)定software breakpoint改為hardware breakpoint,這樣就可以避免因kernel解壓縮所造成調(diào)試的錯誤,降低調(diào)試時的困難度。
4.2.4. PA/VA 觀念說明與調(diào)試要領(lǐng)
在原始碼arch/nds32/kernel/head.S中
la $lp, __mmap_switched
mtsr $lp, $IPC
iret
執(zhí)行完iret后,系統(tǒng)就會從PA轉(zhuǎn)成VA,MMU translation status從translation off轉(zhuǎn)為translation on在此分界處調(diào)試規(guī)則如下所述,如果觀念不清楚及容易產(chǎn)生調(diào)試時的錯誤,請務(wù)必牢記。
4.2.4.1. MMU translation off 時期調(diào)試
在這個時期調(diào)試,VA是不存在的。所有的IO address與memory都是PA沒有VA,如果調(diào)試地址設(shè)成VA,容易hit illegal address 而造成exception.
4.2.4.2. MMU translation on 時期調(diào)試
在這個時期調(diào)試,PA是不存在的。所有的IO address與memory都是VA沒有PA,如果調(diào)試地址設(shè)成PA,容易hit illegal address 而造成exception.
4.2.5. 移植Linux的基礎(chǔ)組件
MMU translation on后,很快就會進入start_kernel 函數(shù),接下來移植的重點就是移植Linux基礎(chǔ)組件,那就是interrupt,timer and UART.當(dāng)這3個device移植成功后,Linux的架構(gòu)就建立起來了,printk也可以用了,Linux已經(jīng)可以正常的運作。如果沒有意外,可以執(zhí)行完kernel甚至將filesystem帶起來。接下來用戶可以將自己的周邊組件一個一個的device driver移植入系統(tǒng)。當(dāng)周邊組件移植完成后,Linux系統(tǒng)移植到晶心平臺就完成了。
5. 結(jié)語
只要能明了熟悉Linux 移植的技巧與重點,使用晶心平臺開發(fā)Linux的產(chǎn)品將是一件愉快與簡單的工作。
電子發(fā)燒友App


















評論