鉴于越来越多运用者将Linux移植到晶心渠道(Andes Embedded)上(AndesCore N12或N10),本文的意图在帮忙运用者快速、有用率的将Linux 移植到自建的FPGA板子上(CPU是AndesCore 的 N12或N10)。笔者曾帮忙多家公司工程师进行Linux移植到晶心渠道的作业,将Linux移植进程简略遭受的问题与盲点进行实践阐明,期望能对运用者有所帮忙,也期望读者不吝珠玉供给您名贵的定见。
在进行Linux移植时会发现,运用者的晶心渠道或许会有林林总总的组合,除了CPU是运用N12或N10外,运用者关于其他的周边(如RAM,ROM,Timer…。.)之调配各有所好,为了有体系性阐明Linux移植的办法,将选定一清晰的硬件,软件,与开发东西(toolchain)环境做演练阐明,除了让读者能够实作明晰文中的叙说,当运用者的周边非原规划的硬件(用户自己的IP)时,能够运用移植的根本原则,更改期望移植IP的Linux驱动程序,其他原始码不动,逐个的将运用者的周边驱动程序移植到晶心的渠道。
在Linux移植进程中,运用者须树立一根本观念,那便是整个Linux OS可分为两部分,榜首部分是与硬件相关的HW dependence code,这部分的程序代码会因对应不同的硬件而形成软件部分需做不同程度的改写;第二部份是与硬件无关的generic code,这部分的程序代码与硬件无关,纯软件运作,不会因渠道(Andes, X86, Arm.。)的改动而有不同。移植Linux的工程师榜首步需求能区分出哪一部分程序代码是 HW dependence code,别的部分的程序代码便是generic code,假如在这阶段对程序代码判别过错(HW dependence code/generic code)会延迟Linux移植的进程并添加调试时的困难。
Linux移植到晶心渠道进程中,首要须先做到Linux根底架构移植成功。在调试时,Linux的根底架构组件是CPU,TImer,interrupt与UART,当CPU与这3项周边移植成功后,scheduler能够运行了,printk也能够运行了Linux体系现已能够正常的运作了。接下来的作业只需将需移植的驱动程序一个一个移植即可,根底骨架移植完结后,调试也有printk可用,接下来只需将肉 (需求加的device drivers) 填上即可。Linux移植比较困难的当地是Linux根底架构没有完结之前(Linux移植的初期阶段)的调试,所幸晶心供给的规范调试东西与AndeShape的调试器AICE,能够一步一步找出问题之地点,让初期移植Linux的调试也变得很简略,具体得作法,后文会具体阐明。本文叙说要点是如安在晶心渠道上树立Linux根底架构,至于单个Linux 驱动程序的移植,坊间有许多的书在介绍,本文就不多加赘述。
1. 开发环境与程序
运用者开端进行Linux移植到晶心渠道,首要须先选定一版晶心的Linux原始码作为基准再进行软件移植,修正原始码以契合运用者的开发渠道,经由东西链的compile与link所发生的Linux的映像文件,再放到FPGA板上以验证程序编写的正确与否,依此开发程序:软件编写-》FPGA板验证,再回到软件编写程序直到一切周边IP在FPGA板上验证彻底,Linux 移植才完结,如图表 1所示,Linux移植进程中,AICE调试能够有用加速Linux移植的速度。
图表 1 Linux 移植的开发流程
本文选定一组Linux原始码、东西链、FPGA 板和netlist作为晶心的渠道(于1.1,1.2,1.3中所述)进行linux的移植。读者可将自己的渠道与晶心的渠道做类比,然后有用缩短产品开发进程。
1.1 晶心版Linux原始码
现在晶心最新版别的Linux原始码在AndeSoft的BSP310中,Linux原始码在BSP310套件中的方位为: BSPv310/source/Linux/linux-2.6.tgz。运用BSP310中的ramdisk ”xc5_glibc_ramdisk.img”作为filesystem。
1.2 东西链
此晶心渠道选用的东西链是AndeSoft™的nds32le-linux-glibc-v2。
1.3 FPGA 板子与 netlist
FPGA板子是晶心AndeShape的 XC5 开发板。Netlist 为晶心AndesCore的N10 producTIon version.
移植渠道是指运用者要移植Linux的渠道,也便是移植Linux的方针渠道。将移植渠道与晶心渠道的比较列表如下: (其间所列之软件皆归于BSP310中之套件)。
移植渠道
晶心渠道
阐明
Linux原始码
linux-2.6.tgz
linux-2.6.tgz
运用者应从晶心版原始码进行开发
东西链
nds32le-linux-glibc-v2
nds32le-linux-glibc-v2
运用者如用新版的AndesCore™,可更换新的对应东西链
FPGA板子
运用者规划
XC5
Netlist
运用者生成
N10 producTIon version
图表 2渠道与晶心渠道的比较表
2. Boot loader
假如运用者有自己惯用的boot loader,能够运用惯用的boot loader以加速开发时程,假如没有boot loader的开发经历,能够选用u-boot作为体系的boot loader.。u-boot的source ocde方位在BSPv310/source/Standalone/u-boot/u-boot.tgz。
2.1 U-boot
AndeSoft™的BSP310中u-boot source code是需求EBIOS boot up后再履行的u-boot版别。直接boot up不需求其他软件帮忙的U-boot版别(ROM版)是比较契合运用者的需求,晶心版的u-boot运用办法请参阅BSP310 User Manual。假如要ROM版的u-boot需求在BSP310中的u-boot软件做patch,其指令如下:
# patch -p1 patching file arch/nds32/cpu/n1213/ag101/cpu.c
patching file arch/nds32/cpu/n1213/start.S
patching file arch/nds32/include/asm/u-boot-nds32.h
patching file arch/nds32/lib/board.c
patching file board/AndesTech/adp-ag101p/config.mk
patching file include/configs/adp-ag101p.h
patch 完结的u-boot source code 能够发生ROM版的u-boot image,直接开机后的履行成果如图表3所示。
图表 3 u-boot 履行成果图
3. 调试环境
在移植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的产品将是一件愉快与简略的作业。