使用J-link调试内核

使用J-link调试内核

一、烧写uboot+linux内核+根文件系统

对于一块空白的mini6410开发板,或者对于项目所要求的需要支持netfilter框架的内核,原厂装好的内核显然不能满足需要,这时可以根据需要重新编译内核,(具体编译过程参照将iptables移植到mini2440那篇文章),将最终生成的zImage映像烧写到开发板中。

烧写过程采用SD卡是最简单的,

1、首先用光盘的tools目录下的SD-Flashersuperboot(静像文件在images目录下)烧写到SD卡中。

2、在SD卡根目录下建一个images目录,把将光盘images目录下的FriendlyARM.ini文件,以及要安装的系统的目录拷贝到images目录下

3、修改ini配置文件,根据需要这里只需要修改OS选项,将其改成linux即可。在配置文件中还可以设置一些其他选项,依次是检测按键、执行操作、操作系统、校验烧写的完整性、状态提示,下面则是各系统烧写静像的路径。

4、将SD卡插入开发板,S2开关拨到SDBOOT上,这时打开S1开关即能听到滴一声,LED4点亮并闪烁,接着LED321逐个开始闪烁亮起,当听到滴滴两声后,所有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;这里我们主要是设置bootcmdipaddrseveripgatewayip等,对应的含义分别是启动后执行的命令(这里是从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.denyhosts.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。其中rsizewsize是读写数据块的大小,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-ssecurity*/

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-linkUSB端插到电脑上,十针的连接线插到开发板上,并打开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来跳过断点直到内核启动完成为止。

你可能感兴趣的:(Linux内核,基于Linux的ARM开发)