如何移植Linux到晶心平台
3. 调试环境
在移植Linux到晶心平台之前,先架设好调试的环境,尤其对底层Linux原始码的移植,有莫大的帮助,在 printk尚未正常运作前,需依靠AndeShape™的AICE与 AndeSoft™的GDB来进行调试。
3.1设定Linux kernel 调试选项
Linux Kernel 需要设定一些调试选项,才能顺利的运用AndeSoft™的GDB进行调试。晶心平台中Linux kernel 调试选项设定如图表4所示,增加这些选项会增加kernel 映像文件的空间,如果空间占用过大以至于不符合设计需求时,可在调试工作完毕后将调试选项关闭以节约不必要的空间浪费。
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.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。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)
评论