使用J-link调试内核
一、烧写uboot+linux内核+根文件系统
对于一块空白的mini6410开发板,或者对于项目所要求的需要支持netfilter框架的内核,原厂装好的内核显然不能满足需要,这时可以根据需要重新编译内核,(具体编译过程参照将iptables移植到mini2440那篇文章),将最终生成的zImage映像烧写到开发板中。
烧写过程采用SD卡是最简单的,
1、首先用光盘的tools目录下的SD-Flasher将superboot(静像文件在images目录下)烧写到SD卡中。
2、在SD卡根目录下建一个images目录,把将光盘images目录下的FriendlyARM.ini文件,以及要安装的系统的目录拷贝到images目录下
3、修改ini配置文件,根据需要这里只需要修改OS选项,将其改成linux即可。在配置文件中还可以设置一些其他选项,依次是检测按键、执行操作、操作系统、校验烧写的完整性、状态提示,下面则是各系统烧写静像的路径。
4、将SD卡插入开发板,S2开关拨到SDBOOT上,这时打开S1开关即能听到滴一声,LED4点亮并闪烁,接着LED3、2、1逐个开始闪烁亮起,当听到滴滴两声后,所有LED灯开始亮起,此后开始不停的跑马跳动,这时说明系统已经烧写完毕。
二、配置开发板环境变量
步骤如下:
1、将开发板接好电源线、串口、网线等,将S2开关拨到NAND上,打开电源,在终端用minicom(如果第一次使用则需要用sudo apt-get install minicom,并用命令sudo minicom -s进行串口、速度,流的配置,保存并退出)进行操作。
2、当开发板启动后随便按下一个键进入BIOS界面,按q切换到shell界面。这时就可以使用uboot为我们提供的命令的,可以输入help进行查看有哪些命令。
3、输入printenv查看当前的环境变量,用setenv命令来设置环境变量,这里可以一次性输入多条命令进行设置,多条命令之间需要用分号隔开,命令如下:setenv bootcmd "nfs 50008000 /home/zc/mini6410/linux;bootm 50008000";setenv ipadd 202.117.132.133;setenv serverip 202.117.132.126;setenv gatewayip 202.117.132.1;saveenv;这里我们主要是设置bootcmd、ipaddr、severip、gatewayip等,对应的含义分别是启动后执行的命令(这里是从NFS服务器端的共享目录中下载linux映像文件,并加载到50008000内存地址中),开发板ip、虚拟机ip、开发板默认网关,这里也可以使用tftp服务来加载内核映像。
4、开发板配置好后,需要将编译好的内核映像放到NFS共享目录下,并改名为linux。
三、配置NFS服务器
NFS(Network File System, 网络文件系统)可以通过网络将分享不同主机(不同的OS)的目录——可以通过NFS挂载远程主机的目录, 访问该目录就像访问本地目录一样,这一步需要在windows系统下的linux虚拟机上配置。
搭建步骤如下:
1、在服务器端安装服务程序
sudo apt-get install nfs-kernel-server(安装NFS服务器)
sudo apt-get install portmap (安装端口映射器portmap),此处这个包可以装也可以不装,安装它只是为了更好的配置映射哪些端口,如安装则使用sudo dpkg-reconfigure portmap命令来进行配置。
2、根据需要配置/etc目录下的hosts.deny和hosts.allow两个文件来设置禁止和允许哪些主机访问NFS服务器,并用restart portmap重启portmap daemon。
3、配置/etc目录下exports文件,这个非常关键,我的配置如下:/home/zc/mini6410 *( rw,sync,no_root_squash)。
前面的路径是共享的NFS目录
* 表示所有网段的都可以挂接此目录;
rw 表示挂接此目录的客户机对该目录有读写的权力;
sync 表示所有数据在请求时写入共享,即数据同步写入内存和硬盘;
no_root_squash 表示允许挂接此目录的客户机享有该主机的root身份。
4、关闭防火墙,命令如下:sudo ufw disable。关闭防火墙是以防共享目录挂载不上,后面的tftp服务也可能需要关闭防火墙。
5、重启NFS服务:sudo /etc/init.d/nfs-kernel-server restart。
6、在开发板上使用mount命令挂载共享的NFS目录:mount –t nfs –o nolock, rsize=10240,wsize=10240 202.117.132.126:/home/zc/mini6410 /mnt。其中rsize和wsize是读写数据块的大小,IP是服务器端的IP,后面紧跟:和共享的NFS目录。
注:(1)、若改动/etc/exports,则要对exports进行更新,命令如下:sudo exportfs –r;
(2)、如果安装portmap,重启portmap服务使用sudo /etc/init.d/portmap restart。
(3)、NFS服务器和客户端最好设置在一个网段中,不同网段是否可行,没有测试;
四、配置tftp服务器
这一步也需要在windows系统下的linux虚拟机上配置,主要是用来实现通过tftp协议在虚拟机和开发板之间传输数据。
搭建步骤如下:
1、在服务器端安装服务程序、客户端程序、守护进程,命令如下: sudo apt-get install tftpd-hpa tftp-hpa xinetd。
2、在守护进程的目录下建立配置文件。在/etc/xinetd.d/下建立一个配置文件tftp,命令如下:sudo vim tftp,输入以下内容,并保存退出。
service tftp
{
socket_type = dgram
wait = yes
disable = no
user = root
protocol = udp
server = /usr/sbin/in.tftpd
server_args = -s /home/zc/tftpboot
log_on_success += PID HOST DURATION
log_on_failure += HOST
}
3、建立tftp服务的目录用于上传文件与下载文件,并且更改其权限。
sudo mkdir ~/tftpboot
sudo chmod –R 777 /tftpboot
4、重新启动服务:sudo /etc/init.d/xinetd restart
5、修改tftpd-hpa服务的默认路径:sudo vim /etc/default/tftpd-hpa
修改内容如下:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/zc/tftpboot"/*和上面的server_args一致即可*/
TFTP_ADDRESS="202.117.132.126:69"/*设置的serverip*/
TFTP_OPTIONS="-l -c -s"/*命令参数,-l是可以load,-c是可以create,-s是security*/
6、重启服务程序:sudo service tftpd-hpa restart。
搭建完成可以测试看是否搭建成功,首先切换到tftp目录下,随便创建一个文件如a.c,再切换到另一个目录下,输入如下命令:sudo tftp localhost,这时输入get a.c,再输入q退出,看当前目录下是否存在a.c,如果存在说明tftp服务器搭建成功。
五、使用j-link调试内核
j-link是以windows系统作为gdb服务器,虚拟机作为gdb客户端。因此这里首先要在windows下安装j-link服务器程序,在j-link配套光盘里有这个程序,安装好后再配置gdb客户端,需要到官网下载gdb源码文件,这里以gdb6.8版为例,下载完解压到主目录下,将其权限改为777,将arm-linux-gcc环境变量加到PATH中(移植iptables文档里有详细的方法)。
首先切换到gdb目录,使用configure生成Makefile文件,命令如下:./configure –target=arm-linux –prefix=/usr/local/arm/4.4.3。
待执行完后使用make命令进行编译,make install进行安装,我尝试了多次编译都出错,始终找不到解决的办法。最终只能将别人安装好的拷贝到我的目录下。
以上步骤都完成后就可以连接j-link调试了。
1、用minicom连接到开发板上,将j-link的USB端插到电脑上,十针的连接线插到开发板上,并打开windows下的服务器程序gdb server。
2、在虚拟机下切换到内核源代码目录,输入arm-linux-gdb命令,这时便进入了gdb命令行了。
3、输入file vmlinux命令加载符号表文件。
4、输入target remote 202.117.132.126:2331命令连接到xp系统下的服务器端程序gdb server。
5、设置断点:b start_kernel,输入c继续,这时在minicom终端下就停在初始化内核的一个位置不动了,在gdb命令行下可以输入n执行函数的下一行代码,也可以输入print 变量名,输出变量当前的值,输入info break可以查看当前设置的所有断点的信息,其他相关操作请参照gdb手册,最终输入c来跳过断点直到内核启动完成为止。