VMware+Ubuntu8.10+Skyeye+gdb实现u-boot源码调试
虚拟机: VMware Workstation 6.5.0
Ubuntu8.10 安装程序 ubuntu-8.10-desktop-i386.iso
下载地址:http://mirror.ylmf.net/ubuntu/8.10/ubuntu-8.10-desktop-i386.iso
u-boot-1.2.0
官方下载地址:ftp://ftp.denx.de/pub/u-boot/
Skyeye-1.2.6
图形化GDB调试工具:insight-6.8.tar.bz2
下载地址ftp://sourceware.org/pub/insight/releases/
(一) 安装虚拟机VMware及虚拟安装Ubuntu8.10
VMware及在VMware上虚拟安装Ubuntu8.10的安装很简单这里不详细描述,不懂的朋友可在Baidu中搜索“Vmware 上安装Ubuntu8.10”,网上这方面的帖子很多。
安装完VMware 及Ubuntu8.10后要安装VMware Tools
安装好VMware Tools后可以就可在WindowsXP和Ubuntu8.10间进行文件共享及实现Ubuntu8.10下对屏幕分辨率的调整。
这里给个链接参考:
http://linux.chinaunix.net/techdoc/system/2009/04/30/1109676.shtml
http://blog.chinaunix.net/u3/93889/showart_1915654.html
这两个链接讲的很详细,非常感谢作者如此详细认真的描述。
(二) 为Ubuntu8.10换更新源
用虚拟机运行Ubuntu8.10
打开终端输入:sudo gedit /etc/apt/sources.list
用以下内容覆盖原文件
#台湾:台湾的官方源速度也相当不错,有时甚至快于内地的
deb http://tw.archive.ubuntu.com/ubuntu intrepid main restricted universe multiverse
deb http://tw.archive.ubuntu.com/ubuntu intrepid-security main restricted universe multiverse
deb http://tw.archive.ubuntu.com/ubuntu intrepid-updates main restricted universe multiverse
deb http://tw.archive.ubuntu.com/ubuntu intrepid-backports main restricted universe multiverse
deb http://tw.archive.ubuntu.com/ubuntu intrepid-proposed main restricted universe multiverse
deb-src http://tw.archive.ubuntu.com/ubuntu intrepid main restricted universe multiverse
deb-src http://tw.archive.ubuntu.com/ubuntu intrepid-security main restricted universe multiverse
deb-src http://tw.archive.ubuntu.com/ubuntu intrepid-updates main restricted universe multiverse
deb-src http://tw.archive.ubuntu.com/ubuntu intrepid-backports main restricted universe multiverse
deb-src http://tw.archive.ubuntu.com/ubuntu intrepid-proposed main restricted universe multiverse #电信服务器,Ubuntu China Official Mirror, maintained by Shanghai Linux User Group):
deb http://cn.archive.ubuntu.com/ubuntu intrepid main restricted universe multiverse
deb http://cn.archive.ubuntu.com/ubuntu intrepid-security main restricted universe multiverse
deb http://cn.archive.ubuntu.com/ubuntu intrepid-updates main restricted universe multiverse
deb http://cn.archive.ubuntu.com/ubuntu intrepid-backports main restricted universe multiverse
deb http://cn.archive.ubuntu.com/ubuntu intrepid-proposed main restricted universe multiverse
deb-src http://cn.archive.ubuntu.com/ubuntu intrepid main restricted universe multiverse
deb-src http://cn.archive.ubuntu.com/ubuntu intrepid-security main restricted universe multiverse
deb-src http://cn.archive.ubuntu.com/ubuntu intrepid-updates main restricted universe multiverse
deb-src http://cn.archive.ubuntu.com/ubuntu intrepid-backports main restricted universe multiverse
deb-src http://cn.archive.ubuntu.com/ubuntu intrepid-proposed main restricted universe multivers
保存并退出。
在终端中输入:sudo apt-get update 更新列表。
由于更新源很多,可根据情况选择速度较快的几个。
(三) 用新立得软件管理器更新安装以下软件包
binutils
binutils-dev
build-essential
libx11-dev
libncurse5-dev
texinfo
autoconf
点击System-》系统管理-》新立得软件管理器 输入root权限密码 在软件管理器中标记以上软件,然后点击Apply进行软件包的安装。
(四) Skyeye的安装
下载skyeye-1.2.6_rc1.tar.bz2
tar jxvf skyeye-1.2.6_rc1.tar.bz2
cd skyeye-1.2.6_rc1
修改文件 device/nandflash/nandflash_smallblock.c line 519 to
if(( nf->fdump=open(dev->dump,FILE_FLAG,))<)
./configure
make
make install
查看/usr/local/bin,多出一项skyeye,这就是我们启动skyeye的命令文件。之后可在任何目录下运行skyeye。
在终端输入skyeye将显示以下内容,说明安装正确:
**************************** WARNING **********************************
If you want to run ELF image, you should use -e option to indicate
your elf-format image filename. Or you only want to run binary image,
you need to set the filename of the image and its entry in skyeye.conf.
***********************************************************************
Your elf file is little endian.
Failed to open skyeye config file skyeye.conf in the same directory
error: No such file or directory
SkyEye 1.2.
Bug report: skyeye-developer@lists.gro.clinux.org
Usage: skyeye [options] -e program [program args]
Default mode is STANDALONE mode
------------------------------------------------------------------
Options:
-e exec-file the (ELF executable format)kernel file name.
-l load_address,load_address_mask
Load ELF file to another address, not its entry.
-b specify the data type is big endian when non "-e" option.
-d in GDB Server mode (can be connected by GDB).
-c config-file the skyeye configure file name.
-h The SkyEye command options, and ARCHs and CPUs simulated.
------------------------------------------------------------------
----------- Architectures and CPUs simulated by SkyEye-------------
-------- ARM architectures ---------
at91
lpc
s3c4510b
s3c44b0x
s3c44b0
s3c3410x
ep7312
lh79520
ep9312
cs89712
sa1100
pxa_lubbock
pxa_mainstone
at91rm92
s3c2410x
s3c2440
sharp_lh7a400
ns9750
-------- BlackFin architectures ----
bf533
bf537
(五) 安装arm-linux交叉编译工具链
交叉编译工具可以自己编译或使用别人已经编译好的交叉编译工具。
交叉编译工具的制作过于复杂,有兴趣有时间的可以学习下如何制作,这里我就使用别人已经编译好的交叉编译工具cross-3.2
下载地址:ftp://ftp.arm.linux.org.uk/pub/armlinux/toolchain/
sudo cp cross-3.2.tar.bz2 / 将cross-3.2.tar.bz2 拷贝到跟目录下
sudo tar jxvf cross-3.2.tar.bz2
sudo rm –rf cross-3.2.tar.bz2
在/usr/local/下会多出一arm文件夹
/usr/local/arm 就是交叉编译工具所在的目录
设置环境变量PATH
sudo gedit /ect/apt/environment
将 :/usr/local/arm/bin 加入末尾保存并退出
注销重新登陆
在终端输入:arm-linux-gcc -v
显示以下信息说明安装正确
Reading specs from /usr/local/arm/bin/../lib/gcc-lib/arm-linux/3.2/specs Configured with: ./configure --target=arm-linux --prefix=/usr/local/arm/ --with-headers=/home/sylam/armbuild/src/linux/include --disable-shared --disable-threads --enable-languages=c : (reconfigured) ./configure --target=arm-linux --prefix=/usr/local/arm/ --with-headers=/home/sylam/armbuild/src/linux/include Thread model: posix gcc version 3.2
(六) 编译u-boot
下载u-boot-1.2.0.tar.bz2
官方下载地址:ftp://ftp.denx.de/pub/u-boot/
tar jxvf u-boot-1.2.0.tar.bz2
cd u-boot-1.2.0
vim common/cmd_bootm.c
将第464-477行
U_BOOT_CMD(
bootm, CFG_MAXARGS, , do_bootm,
"bootm - boot application image from memory\n",
"[addr [arg ...]]\n - boot application image stored in memory\n"
"\tpassing arguments 'arg ...'; when booting a Linux kernel,\n"
"\t'arg' can be the address of an initrd image\n"
#ifdef CONFIG_OF_FLAT_TREE
"\tWhen booting a Linux kernel which requires a flat device-tree\n"
"\ta third argument is required which is the address of the of the\n"
"\tdevice-tree blob. To boot that kernel without an initrd image,\n"
"\tuse a '-' for the second argument. If you do not pass a third\n"
"\ta bd_info struct will be passed instead\n"
#endif
);
改为:
#ifdef CONFIG_OF_FLAT_TREE
U_BOOT_CMD(
bootm, CFG_MAXARGS, , do_bootm,
"bootm - boot application image from memory\n",
"[addr [arg ...]]\n - boot application image stored in memory\n"
"passing arguments 'arg ...'; when booting a Linux kernel,\n"
"\t'arg' can be the address of an initrd image\n"
"\tWhen booting a Linux kernel which requires a flat device-tree\n"
"\ta third argument is required which is the address of the of the\n"
"\tdevice-tree blob. To boot that kernel without an initrd image,\n"
"\tuse a '-' for the second argument. If you do not pass a third\n"
"\ta bd_info struct will be passed instead\n"
);
#else
U_BOOT_CMD(
bootm, CFG_MAXARGS, , do_bootm,
"bootm - boot application image from memory\n",
"[addr [arg ...]]\n - boot application image stored in memory\n"
"\tpassing arguments 'arg ...'; when booting a Linux kernel,\n"
"\t'arg' can be the address of an initrd image\n"
);
#endif
原文参见:http://shkliu.blogbus.com/logs/7898682.html
编译u-boot
make smdk2410_config
make
(七) 将GCC 版本降由GCC-4.3.2到GCC-4.2.0
GCC-4.3.2版本过高对语法要求较严格编译gdb会有错误,若出现编译错误可将gcc 版本降低
sudo apt-get install gcc-4.2
rm /usr/bin/gcc
ln –s /usr/bin/gcc-4.2 /usr/bin/gcc
运行gcc –v查看gcc 版本将显示以下信息
Using built-in specs. Target: i486-linux-gnu Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu Thread model: posix gcc version 4.2. (Ubuntu 4.2.-3ubuntu4)
要更改其他gcc 版本方法同上。
(八) 安装gdb-6.8
下载gdb-6.8.tar.bz2
tar jxvf gdb-6.8.tar.bz2
cd gdb-6.8
./configure --target=arm-linux
make
sudo make install
编译 gdb-server
cd gdb-6.8/gdb/gdbServer
./configure --target=arm-linux --host=arm-linux
make CC=/usr/local/arm/bin/arm-linux-gcc
(九) 安装图形化GDB调试工具:
insight-6.8
下载insight-6.8.tar.bz2
下载地址ftp://sourceware.org/pub/insight/releases/
tar jxvf insight-6.8.tar.bz2
cd insight-6.8
./configure --target=arm-linux --enable-sim --prefix=/usr/local
make
sudo make install
安装结束后在/usr/local/bin 中会有arm-linux-insight
在终端中是输入: arm-linux-insight 将启动insight
(十) 用arm-linux-insight 及skyeye对u-boot 进行调试
cd $HOME
mkdir skyeye
拷贝第六步中u-boot-1.2.0目录下编译生成的u-boot 及u-boot.bin文件到此文件下
建立skyeye.conf 文件
文件内容如下:
# skyeye config file for S3C2410X cpu: arm920t
mach: s3c2410x # physical memory
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00100000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000
#mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=./u-boot.bin,boot=yes
mem_bank: map=M, type=RW, addr=0x30000000, size=0x03f80000
mem_bank: map=M, type=RW, addr=0x33F80000, size=0x00080000,file=./u-boot.bin,boot=yes # all peripherals I/O mapping area
mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000
mem_bank: map=I, type=RW, addr=0x19000300, size=0x00000020
net: type=cs8900a, base=0x19000300, size=0x20,int=, mac=::3E::0A:5B, ethmod=tuntap, hostip=192.168.245.100 #nandflash: type=s3c2410x,name=K9F1208U0B,dump=./nand.dump
#lcd: type=s3c2410x, mod=gtk #dbct:state=on
本人skyeye的配置如下,boot则表示从RAM或者ROM中启动,没有直接skyeye -e u-boot则表示虚拟地址启动
# skyeye config file for S3C2410X
arch:arm
cpu: arm920t
mach: s3c2410x #physical memory #从rom启动 mem_bank: mem=M, type=R, addr=0x00000000, size=0x04000000, file=./u-boot.bin, boot=yes
#从ram启动 mem_bank: map=M, type=RW, addr=0x30000000, size=0x04000000, file=./u-boot.bin, boot=yes #从虚拟地址启动
mem_bank: map=M, type=RW, addr=0x30000000, size=0x04000000
# all peripherals I/O mapping area
mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000 # dbct:state=on<br>
(十一) U-boot源代码调试
进入skyeye文件夹,用-d命令启动skyeye
终端输入命令:sudo skyeye –c skyeye.conf –d
skyeye 将进入debug模式在TCP:12345端口等待gdb连接,u-boot程序运行到第一条指令0x33f8000处暂停
配置arm-linux-insight
按如下图所示:
打开文件:File-》Open

File-》Target Settings

如上图在0x33f80000 处设置断点(红色)
然后连接目标
Run-》Connect to target
如上图显示程序运行到0x33f80000 处(绿色)
按下Ctrl+R 将显示寄存器窗口,可以观察当前各Register的值,如下图

按下N程序将跳到reset 处如下图

我们在board.c start_armboot 入口处设置断点然后按下C键程序将在start_armboot入口处暂停

如上图所示我们可以对u-boot进行断点,单步跟踪调试。
此篇文章是我在上海出差期间,闲暇之余做的总结,因为涉及的方面比较多,很多地方介绍不详细,可能会有很多错误,仅做为有兴趣用Skyeye搭建仿真开发环境的朋友提供参考。我觉得这一平台很适合那些想学习嵌入式开发的同学,在没有硬件的情况下不妨以此为出发点。既然现在可以调试u-boot,那我想应该也可以调试操作系统吧,比如可以从ucosii开始。
关于如何解决错误,在试验过程中在所难免出现这样那样的错误,我碰到了许多问题,有编译器版本问题,有缺少库文件的问题,以及一些源码有错误的地方。出现问题最好的方法不是马上发帖去问,应该把终端输出的错误信息中最重要的部分copy下来到百度里去搜索下,很有可能你遇到的问题已经有人遇到过且已经有解决方法。我觉得大部分问题是都可以找到答案的。
最后一点,虽然本文也借鉴了许多人的帖子,但毕竟也是辛苦总结出来的,希望转载的朋友注明出处,也算是对别人辛苦成果的一种肯定吧。
VMware+Ubuntu8.10+Skyeye+gdb实现u-boot源码调试的更多相关文章
- # 曹工说Spring Boot源码(10)-- Spring解析xml文件,到底从中得到了什么(context:annotation-config 解析)
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
- 曹工说Spring Boot源码系列开讲了(1)-- Bean Definition到底是什么,附spring思维导图分享
写在前面的话&&About me 网上写spring的文章多如牛毛,为什么还要写呢,因为,很简单,那是人家写的:网上都鼓励你不要造轮子,为什么你还要造呢,因为,那不是你造的. 我不是要 ...
- 曹工说Spring Boot源码(2)-- Bean Definition到底是什么,咱们对着接口,逐个方法讲解
写在前面的话 相关背景及资源: 曹工说Spring Boot源码系列开讲了(1)-- Bean Definition到底是什么,附spring思维导图分享 工程代码地址 思维导图地址 工程结构图: 正 ...
- Spring Boot源码中模块详解
Spring Boot源码中模块详解 一.源码 spring boot2.1版本源码地址:https://github.com/spring-projects/spring-boot/tree/2.1 ...
- 曹工说Spring Boot源码(11)-- context:component-scan,你真的会用吗(这次来说说它的奇技淫巧)
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
- 曹工说Spring Boot源码(12)-- Spring解析xml文件,到底从中得到了什么(context:component-scan完整解析)
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
- 曹工说Spring Boot源码(13)-- AspectJ的运行时织入(Load-Time-Weaving),基本内容是讲清楚了(附源码)
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
- 曹工说Spring Boot源码(14)-- AspectJ的Load-Time-Weaving的两种实现方式细细讲解,以及怎么和Spring Instrumentation集成
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
- 曹工说Spring Boot源码(15)-- Spring从xml文件里到底得到了什么(context:load-time-weaver 完整解析)
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
随机推荐
- bootstrap学习以及其插件
Bootstrap中文网地址,里面有bootstrap组件的下载与使用说明,现在使用bootstrap3: http://www.bootcss.com/ W3CSchool.CC里面有学习boots ...
- Vagrant入门[转]
Vagrant是一个简单易用的部署工具,用英文说应该是orchestration tool.它能帮助开发人员迅速的构建一个开发环境,帮助测试人员构建测试环境. Vagrant的基本工作原理大致如下: ...
- NoSQL 数据库的使用场景
摘要:对比传统关系型数据库,NoSQL有着更为复杂的分类——键值.面向文档.列存储.图数据库.这里就带你一览NoSQL各种类型的适用场景及一些知名公司的方案选择. 在过去几年,关系型数据库一直是数据持 ...
- (转)web.config详解之在文件中配置网站默认页面
在<configuration></configuration>中添加下面的配置 <system.webServer> <defaultDocu ...
- sealed 修饰符
当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承. 在下面的示例中,类 B 从类 A 继承,但是任何类都不能从类 B 继承. class A {} sealed class B ...
- 对arm指令集的疑惑,静态库运行,编译报错等问题
转载自http://www.jianshu.com/p/4a70aa03a4ea?utm_campaign=hugo&utm_medium=reader_share&utm_conte ...
- mercurial(Hg) Server 搭建 过程记录
mercurial(Hg) Server 搭建 过程记录 1. 环境说明 只是测试搭建,环境为本机开发环境:win 8.1 + IIS8.5 软件准备: 2. 软件安装 先安装Python2.7, ...
- hdu 验证角谷猜想 1279
Problem Description 数论中有许多猜想尚未解决,其中有一个被称为"角谷猜想"的问题,该问题在五.六十年代的美国多个著名高校中曾风行一时,这个问题是这样描述的:任何 ...
- Linux下运行C++程序出现"段错误(核心已转储)"的原因
今天写程序出现了“段错误(核心已转储)"的问题,查了一下资料,加上自己的实践,总结了以下几个方面的原因. 1.内存访问出错 这类问题的典型代表就是数组越界. 2.非法内存访问 出现这类问题 ...
- React/React Native的 ES5 ES6 写法对照
ES5 ES6 模块 var React = require("react-native); var { Image, Text, View } = React; import Re ...