注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

创思通信官网:www.csgsm.com

创思通信-引领物联网新时代 520ic.taobao.com

 
 
 

日志

 
 
 
 

linux内核调试指南--安装交叉编译工具  

2010-09-16 23:11:46|  分类: cross-compile |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 http://blog.csdn.net/willand1981/archive/2010/03/03/5339746.aspx
安装交叉编译工具
交叉编译工具下载网址
下面是几个交叉编译工具下载网址,需要手动安装时,对比一下编译器的名称可以找到合适的下载地址。debian维护有自己的已经打包成.deb形式安装包,在debian软件库中。

http://www.codesourcery.com/gnu_toolchains/arm/download.html
(据说是arm公司推荐的)

Download Sourcery G++ Lite Edition for ARM

Target OS  Download
EABI          Sourcery G++ Lite 2008q1-126
                All versions...
uClinux  Sourcery G++ Lite 2008q1-152
                All versions...
GNU/Linux  Sourcery G++ Lite 2008q1-126
                All versions...
SymbianOS  Sourcery G++ Lite 2008q1-126
                All versions...

到底是选EABI还是GNU/LINUX呢?应该是后者....

点GNU/LINUX的连接进去,可看到

Download                  MD5 Checksum
IA32 GNU/Linux Installer  93eee13a08dd739811cd9b9b3e2b3212
IA32 Windows Installer         fac5b0cee1d9639c9f15e018e6d272ad

Documentation

Title                    Format
Assembler (PDF)     PDF
Binary Utilities (PDF)   PDF
C Library (GLIBC) (PDF)  PDF
Compiler (PDF)    PDF
Debugger (PDF)    PDF
Getting Started Guide (PDF)  PDF
Linker (PDF)    PDF
Preprocessor (PDF)   PDF
Profiler (PDF)    PDF

Advanced Packages

Expert users may prefer packages in these formats.

Download   MD5 Checksum
IA32 GNU/Linux TAR  4f11b0fa881864f220ab1bd84666108b
IA32 Windows TAR  ed6d25fd68301e728a1fba4cd5cb913f
Source TAR   2db28fb2aa80134e7d34d42b7039d866

   名字标识不是很明显,进去看才知道。比如,IA32 GNU/Linux Installer对应的安装包
名字叫arm-2008q1-126-arm-none-linux-gnueabi.bin
   为什么有个none?迷茫中..
---------------------------------
http://ftp.snapgear.org:9981/pub/snapgear/tools/arm-linux/
[DIR] Parent Directory                30-Sep-2003 15:44      -
[   ] arm-linux-tools-20031127.tar.gz 26-Nov-2007 16:56   141M
[   ] arm-linux-tools-20051123.tar.gz 24-Nov-2005 00:50   228M
[   ] arm-linux-tools-20061213.tar.gz 13-Dec-2006 13:31   230M
[   ] arm-linux-tools-20070808.tar.gz 30-Nov-2007 03:21   271M
[   ] binutils-2.16.tar.gz            16-Nov-2005 15:44  15.6M
[   ] binutils-2.17.tar.gz            06-Dec-2007 10:24  17.4M
[   ] build-arm-linux-3.4.4           02-Aug-2006 14:32     6k
[   ] build-arm-linux-4.2.1           30-Jul-2008 10:13     7k
[   ] elf2flt-20060707.tar.gz         17-Jan-2008 22:23   101k
[   ] elf2flt-20060708.tar.gz         30-Jul-2008 10:14   110k
[   ] gcc-3.4.4.tar.bz2               16-Nov-2005 15:39  26.3M
[   ] gcc-4.2.1.tar.bz2               06-Dec-2007 10:11  42.0M
[   ] genext2fs-1.3.tar.gz            03-Sep-2003 10:23    19k
[   ] glibc-2.3.3.tar.gz              16-Nov-2005 15:49  16.7M
[   ] glibc-2.3.6.tar.gz              06-Dec-2007 10:39  17.9M
[   ] glibc-linuxthreads-2.3.3.tar.gz 16-Nov-2005 15:49   303k
[   ] glibc-linuxthreads-2.3.6.tar.gz 06-Dec-2007 10:39   320k
--------------------------
http://www.handhelds.org/download/projects/toolchain/
[DIR] Parent Directory                                                   -  
[   ] README                                        28-Jul-2004 17:37  788  
[DIR] archive/                                      28-Jul-2004 17:34    -  
[   ] arm-linux-gcc-3.3.2.tar.bz2                   03-Nov-2003 10:23   71M
[   ] arm-linux-gcc-3.4.1.tar.bz2                   29-Jul-2004 14:01   41M
[DIR] beta/                                         28-Jul-2004 17:36    -  
[   ] crosstool-0.27-gcc3.4.1.tar.gz                28-Jul-2004 17:21  2.0M
[   ] gcc-build-cross-3.3                           31-Oct-2003 15:43  5.1K
[DIR] jacques/                                      24-Jul-2001 18:45    -  
[   ] kernel-headers-sa-2.4.19-rmk6-pxa1-hh5.tar.gz 12-Mar-2003 17:42  4.7M
[DIR] monmotha/                                     13-Aug-2002 17:54    -  
[DIR] osx/                                          14-Dec-2003 11:45    -  
[DIR] pb/                                           22-Nov-2002 20:10    -  
[DIR] source/                                       18-Mar-2004 16:12    -  
------------------------------------
http://ftp.arm.linux.org.uk/pub/armlinux/toolchain/
[DIR] Parent Directory                                     -  
[   ] Oerlikon-DevKit-XScalev2.tar.gz 07-Feb-2003 22:30  3.7K
[   ] cross-2.95.3.tar.bz2            20-Jul-2001 21:12   35M
[   ] cross-3.0.tar.bz2               20-Jul-2001 22:27   39M
[   ] cross-3.2.tar.bz2               23-Aug-2002 11:04   81M
[   ] cross-3.2.tar.gz                23-Aug-2002 10:01   93M
[DIR] src-2.95.3/                     14-Jan-2002 17:52    -  
[DIR] src-3.2/                        23-Aug-2002 10:53    -  
--------------------------------------------
http://linux.omap.com/pub/toolchain/
[DIR] Parent Directory                             -  
[   ] obsolete-gcc-3.3.2.t..> 15-May-2004 12:18   76M
---------------------------
http://www.uclinux.org/pub/uClinux/arm-elf-tools/
To install the Linux binaries, login as root and run "sh ./XXX-elf-tools-20030314.sh".

m68k-elf-20030314/arm-elf-20030314
    Get the m68k binaries or the ARM binaries. The source is here.

m68k-elf-20020410/arm-elf-20011219
    Get the m68k binaries or the ARM binaries. The source is here.

m68k-elf-20020218/arm-elf-20011219
    Get the m68k binaries or the ARM binaries. The source is here.

m68k/arm-elf-20011219
    Get the m68k binaries or the ARM binaries. The source is here.

    You can also get Bernhard Kuhn's RPMs here.

m68k-elf-20010716
    Get the binaries here and the source from here.

m68k-elf-20010712
    Get the binaries here and the source from here.

m68k-elf-20010610
    Get the binaries here and the source from here.

m68k-elf-20010228
    The binaries are in two files, the compilers and the g++ headers. The source is here.
安装arm-linux-gnueabi-XXX 工具集
debian有自己维护的一套交叉编译工具集

[参考]http://www.emdebian.org/tools/crosstools.html

工具库: http://www.emdebian.org/debian/pool/main/

步骤:

1. 往/etc/apt/sources.list文件加入下面软件源

deb http://buildd.emdebian.org/debian/ unstable main
deb-src http://buildd.emdebian.org/debian/ unstable main
deb http://buildd.emdebian.org/debian/ testing main
deb-src http://buildd.emdebian.org/debian/ testing main
然后:

安装 emdebian-archive-keyring package
$ sudo apt-get install emdebian-archive-keyring
更新
$ sudo apt-get update
2. 安装交叉编译器

$ sudo apt-get install libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi gcc-4.3-arm-linux-gnueabi g++-4.3-arm-linux-gnueabi
注意,在ubuntu8.04下,只能安装4.2版。把上面文字中的4.3全部换为4.2即可。

3. 安装交叉调试器

$sudo apt-get install gdb-arm-linux-gnueabi
注意:

a. 安装时使用名称:gdb-arm-linux-gnueabi,调用时使用命令名是:arm-linux-gnueabi-gdb

b. ubuntu下,arm-linux-gnueabi-gdb和gdb有冲突。

解决方法:

需 要使用arm-linux-gnueabi-gdb时先卸载gdb,记下卸载gdb时与gdb一起被卸载的软件名,然后安装arm-linux- gnueabi-gdb。 想换回gdb时,在反操作。apt-install remove arm-linux-gnueabi-gdb 然后 apt-get install gdb以及之前和gdb一起被卸载包。可以写个脚本自动完成这些操作。本人环境下的脚本是:

脚本1. install-armgdb.sh

#! /bin/sh
sudo apt-get remove gdb
sudo apt-get install gdb-arm-linux-gnueabi
脚本2. install-gdb.sh

#! /bin/sh
sudo apt-get remove gdb-arm-linux-gnueabi
sudo apt-get install apport apport-gtk apport-qt bug-buddy cgdb gdb python-apport xxgdb
什么是EABI
答: 来自AAPCS

ABI: Application Binary Interface:

1). The specifications to which an executable must conform in order to execute in a specific execution environment. For example, the Linux ABI for the ARM Architecture.

2). A particular aspect of the specifications to which independently produced relocatable files must conform in order to be statically linkable and executable. For example, the C++ ABI for the ARM Architecture, the Run-time ABI for the ARM Architecture, the C Library ABI for the ARM Architecture.

ARM-based … based on the ARM architecture …

EABI: An ABI suited to the needs of embedded (sometimes called free standing) applications.

参考:

ABI/EABI/OABI http://blog.csdn.net/hongjiujing/archive/2008/07/21/2686556.aspx

Re: 关于kernel ARM_EABI http://zh-kernel.org/pipermail/linux-kernel/2008-January/002793.html

Why ARM’s EABI matters http://www.linuxdevices.com/articles/AT5920399313.html

Why switch to EABI? http://www.applieddata.net/forums/topic.asp?TOPIC_ID=2305

ArmEabiPort http://wiki.debian.org/ArmEabiPort

安装arm-elf-XXX 工具集
注:arm-elf-XXX 工具集是用于uclinux的

1. 依据要求搜索下载相应的arm-elf-tools安装包。比如arm-elf-tools-20030315.sh

2. 安装: $ ./arm-elf-tools-20030315.sh

3. 如果,该安装包年代过老,比如arm-elf-tools-20030315.sh,会出现下面的错误提示 “tail: 无法打开“ 43” 读取数据: 没有那个文件或目录。”。 这时需要修改安装包源码。方法:vi arm-elf-tools-20030315.sh, 搜索tail,在它后面加 -n .比如 把tail ${SKIP} ${SCRIPT} | gunzip | tar xvf -改成如下:tail -n ${SKIP} ${SCRIPT} | gunzip | tar xvf -

4.如何卸载已安装的arm-elf-tools? 答,重新安装一次,注意看终端提示。或直接vi arm-elf-tools-20030315.sh,看脚本的内容,

bin工具集的使用
[该怎么称呼这类工具?待详述]

arm-elf-addr2line   arm-elf-elf2flt     arm-elf-gdb         arm-elf-objdump     arm-elf-size
arm-elf-ar          arm-elf-flthdr      arm-elf-ld          arm-elf-protoize    arm-elf-strings
arm-elf-as          arm-elf-g++         arm-elf-ld.real     arm-elf-ranlib      arm-elf-strip
arm-elf-c++         arm-elf-gasp        arm-elf-nm          arm-elf-readelf     arm-elf-unprotoize
arm-elf-c++filt     arm-elf-gcc         arm-elf-objcopy     arm-elf-run

arm-linux-gnueabi-addr2line  arm-linux-gnueabi-g++        arm-linux-gnueabi-gprof      arm-linux-gnueabi-readelf
arm-linux-gnueabi-ar         arm-linux-gnueabi-g++-4.2    arm-linux-gnueabi-ld         arm-linux-gnueabi-size
arm-linux-gnueabi-as         arm-linux-gnueabi-gcc        arm-linux-gnueabi-nm         arm-linux-gnueabi-strings
arm-linux-gnueabi-c++filt    arm-linux-gnueabi-gcc-4.2    arm-linux-gnueabi-objcopy    arm-linux-gnueabi-strip
arm-linux-gnueabi-cpp        arm-linux-gnueabi-gdb        arm-linux-gnueabi-objdump   
arm-linux-gnueabi-cpp-4.2    arm-linux-gnueabi-gdbtui     arm-linux-gnueabi-ranlib     
如何获取这些工具的命令选项? 看章节“知识从哪里来” 一般是用命 xxxxxx –help就能得到简单的命令选项列表

下载arm-linux-gnueabi- 手册地址 http://www.codesourcery.com/gnu_toolchains/arm/portal/release324

然后搜索”arm”,便能找到处理器相关的特殊命令选项

arm-linux-gnueabi-gcc
查看arm处理器相关的编译选项

$ vi arch/arm/Makefile

阅 读Makefile文件,并联系源码根目录下的.config文件,便能知道arm-linux-gnueabi-gcc用了哪些编译选项。再到手册中查 找,便能知道这些选项是干什么用的,但手册中说的不是很详细。另外查找有用解释的方法的是,利用make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig,找到与命令选项有关联的CONFIG_XXX的菜单项,看它的帮助说明.比如

$ vi arch/arm/Makefile
....
ifeq ($(CONFIG_AEABI),y)
CFLAGS_ABI      :=-mabi=aapcs-linux -mno-thumb-interwork
else
CFLAGS_ABI      :=$(call cc-option,-mapcs-32,-mabi=apcs-gnu) $(call cc-option,-mno-thumb-interwork,)
endif
..
再 查看CONFIG_AEABI的帮助文档 $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig 找到CONFIG_AEABI相关的菜单,看它的帮助文档,便能知道选项-mabi=aapcs-linux -mno-thumb-interwork的整体效果怎样的。

  ┌───────────────────── Use the ARM EABI to compile the kernel ──────────────────────┐
  │ CONFIG_AEABI:                                                                     │
  │                                                                                   │
  │ This option allows for the kernel to be compiled using the latest                 │
  │ ARM ABI (aka EABI).  This is only useful if you are using a user                  │
  │ space environment that is also compiled with EABI.                                │
  │                                                                                   │
  │ Since there are major incompatibilities between the legacy ABI and                │
  │ EABI, especially with regard to structure member alignment, this                  │
  │ option also changes the kernel syscall calling convention to                      │
  │ disambiguate both ABIs and allow for backward compatibility support               │
  │ (selected with CONFIG_OABI_COMPAT).                                               │
  │                                                                                   │
  │ To use this you need GCC version 4.0.0 or later.                                  │
  │                                                                                   │
  │ Symbol: AEABI [=n]                                                                │
  │ Prompt: Use the ARM EABI to compile the kernel                                    │
  │   Defined at arch/arm/Kconfig:554                                                 │
  │   Location:                                                                       │
  │     -> Kernel Features     

arm- linux-gnueabi-gcc的主要编译选项有如下几个。但是在编译内核时,这些选项是不需要手工去写的,而是通过make menuconfig生成包含了编译选项配置信息的.config文件。在make编译内核时,再利用Makefile文件中的规则结合.config文 件提取出那些选项。

太多了,手册吧
arm-linux-gnueabi-gdb
注意它的默认选项设置

$ arm-linux-gnueabi-gdb
(gdb) show arm
abi:  The current ARM ABI is "auto" (currently "APCS").
apcs32:  Usage of ARM 32-bit mode is on.
disassembler:  The disassembly style is "std".
fpu:  The current ARM floating point model is "auto" (currently "fpa").
(gdb)
但是,如果如果在命令后有参数vmlinux的话,它会自动识别出内核的abi,从而自动设置了gdb的abi。比如,在编译内核时,如果选了CONFIG_AEABI,则gdb的提示如下

$ arm-linux-gnueabi-gdb vmlinux
...
(gdb) show arm
abi:  The current ARM ABI is "auto" (currently "AAPCS").  <--注意
apcs32:  Usage of ARM 32-bit mode is on.
disassembler:  The disassembly style is "std".
fpu:  The current ARM floating point model is "auto" (currently "softvfp").
qemu的使用
参考手册

http://bellard.org/qemu/user-doc.html

http://wiki.debian.org.tw/index.php/QEMU

http://www.h7.dion.ne.jp/~qemu-win/

http://bellard.org/qemu/

邮件列表

http://lists.gnu.org/archive/html/qemu-devel/

参考文章

“QEMU安装使用全攻略” http://forum.ubuntu.org.cn/viewtopic.php?p=248267&sid=f4e95025bdaf6a24a218315d03ad9933

[补充命令]引用自http://bbs.chinaunix.net/viewthread.php?tid=779540

安装过程中,要求换盘:
在qemu中按ctrl+alt+2切换到qemu monitor模式 输入?或help可以查看可用命令及使用说明。
(在其他版本的qemu中,运行qemu加载OS后,这个shell就会自动变成qemu monitor模式)
change device filename -- change a removable media
看来它就是用来换盘的了 : change cdrom /rhel4/EL_disc2.iso

切换回安装界面ctrl+alt+1

monitor下还有几个常用的命令:
savevm filename 将整个虚拟机当前状态保存起来
loadvm filename 恢复 (最初我没用change换盘时,就是先savevm->重新运行qemu->loadvm )
sendkey keys 向VM中发送按键,例如你想在虚拟机里切换到另一个终端,按下了ctrl-alt-F2
不幸的是,切换的却是你的主系统,所以就需要用 sendkey了 sendkey ctrl-alt-f2
还有其他几个命令,自己看看啦。

经过N久终于装好了,现在可以启动试试:
[root@LFS distro]#qemu redhat.img -enable-audio -user-net -m 64
-user-net 相当于VMware的nat,主系统可以上,虚拟机就可以
-m 64     使用64M内存,缺省下使用128M

ctrl-alt-f 全屏
ctrl-alt   主机/虚拟机鼠标切换
qemu还有一些其他参数,输入qemu可以查看其相关说明
initrd.img的原理与制作
[扩展,原理,相关命令。下面的skyeye可能需要这部分知识]

“Linux2.6 内核的 Initrd 机制解析” http://www.ibm.com/developerworks/cn/linux/l-k26initrd/

“Introducing initramfs, a new model for initial RAM disks” http://www.linuxdevices.com/articles/AT4017834659.html

””深入理解 Linux 2.6 的 initramfs 機制 (上)“ http://blog.linux.org.tw/~jserv/archives/001954.html

MKINITRAMFS http://www.manpage.org/cgi-bin/man/man2html?8+mkinitramfs

安装与使用
$ sudo apt-get install initramfs-tools
$ mkinitramfs /lib/modules/2.6.26/ -o initrd.img-2.6.26
x86虚拟调试环境的建立
参考

“debugging-linux-kernel-without-kgdb” http://memyselfandtaco.blogspot.com/2008/06/debugging-linux-kernel-without-kgdb.html

“使用 KGDB 调试 Linux 内核” http://blog.chinaunix.net/u/8057/showart_1087126.html

“透過虛擬化技術體驗 kgdb (1)” http://blog.linux.org.tw/~jserv/archives/002045.html

基于qemu和内核内置kgdb
缺点:相对于下节的“基于qemu和qemu内置gdbstub”,这个方法配置麻烦。

优点:真机远程调试时只能使用内置kgdb这个方法。

[等待扩展,,,,]

终极参考

“Using kgdb and the kgdb Internals” http://www.kernel.org/pub/linux/kernel/people/jwessel/kgdb/index.html

参考文章

“使用 KGDB 调试 Linux 内核” http://blog.chinaunix.net/u/8057/showart_1087126.html

基于qemu和qemu内置gdbstub
参考文章
“Debugging Linux Kernel Without KGDB Patch (Qemu + GDB)” http://memyselfandtaco.blogspot.com/2008/06/debugging-linux-kernel-without-kgdb.html

优缺点
优点:相对上节,优点是操作简单,几乎不需要什么配置

缺点:真机的远程调试,就只能利用内核的内置kgdb了

说明:

如 果长时间调试固定版本的内核,采取下面的把调试用内核安装的虚拟机内部就可以了。但是如果是要频繁地更换新内核或修改被调试内核,就需要采取把内核挂在虚 拟机外部的形式。也就是用 -kernel 在虚拟机外面挂个内核, 再利用-append 传递起内核启动参数等。[待研究]

[太概过了,待扩展...]

调试用内核的安装过程:
1. 利用qemu安装一个系统.

2. 在真机中配置并编译一个用于安装到虚拟系统中的新内核,注意配置时的选择

* 配置和启动
1. 内核选项
同时,为了能在系统运行时中断系统并出发远程 gdb,必须打开内核 Magic Sys-Rq 键选项 :[后记,没实验去掉会怎样,估计没影响]
CONFIG_MAGIC_SYSRQ=y
打开内核符号调试:
CONFIG_DEBUG_INFO=y
3. 在真机下编译好虚拟机新内核的源码

4. 结束qemu,用以下命令在真机上挂载虚拟硬盘。然后把编译好的整个源码目录都拷贝到挂载好的虚拟硬盘上(真机上保留一份源码)。

$ sudo mount -o loop,offset=32256 debian.img /mnt
拷贝完后,在真机上卸载虚拟硬盘

$ sudo umount /mnt
5.启动虚拟机,进入旧系统,在新内核源码根目录下用以下命令给qemu的虚拟系统安装一个新的内核

拷贝模块
$ make modules_install
安装内核

$ make install
制作initrd.img
$ cd /boot
$ mkinitramfs /lib/modules/2.6.26/ -o initrd.img-2.6.26
检查/boot/grub/menu.lst 文件内容是否妥当
6.用以下命令重启虚拟系统,并选择进入新系统,确认新系统是否安装成功。

$ shutdown -r now
调试:
1. 在真机新内核源码目录下建立一个文件 .gdbinit 内容是

target remote localhost:1234
b start_kernel
#c
注意我把c注释掉是因为ddd和gdb有切换的需要。见”gdb技巧”

2. 用以下命令启动虚拟机

qemu -hda debian.img -cdrom ../debian-testing-i386-CD-1.iso -m 500 -S -s
3. 在真机新内核源码目录下运行

gdb ./vmlinux
[实验记录]

实验过了,.config中不选择kgdb,利用qemu照样能调试。也不能调试start_kernel以前的代码。比如head_32.S中的代码。

CONFIG_HAVE_ARCH_KGDB=y
# CONFIG_KGDB is not set
但是不知CONFIG_HAVE_ARCH_KGDB是在menuconfig菜单的哪里。想试试把这项去了qemu还能不能调试。

经测试,取消CONFIG_HAVE_ARCH_KGDB后,qemu也能进行调试。情况不变。看来qemu能完全脱离内核中的kgdb就能调试内核。

调试截图
步骤2:
XXX@ubuntu:/new/myqemu/debian-x86$ qemu -hda debian.img -cdrom ../debian-testing-i386-CD-1.iso -m 500 -S -s

步骤3:
由下图我们注意到:“基于qemu和qemu内置gdbstub”这个方法的调试,最早只能从函数 start_kernel () 开始进行。
内核在start_kernel ()之前的初始化过程就无法观察了。这就是这个方法的最大缺点。但下节利用skyeye调试arm-linux的
方法就可以从第一个机器指令开始进行。

XXX@ubuntu:/storage/myqemu/new/linux-2.6.26$ gdb ./vmlinux
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
0x0000fff0 in ?? ()
Breakpoint 1 at 0xc037f5ca: file init/main.c, line 535.
(gdb) c
Continuing.

Breakpoint 1, start_kernel () at init/main.c:535
535 {
(gdb)

调试示意图:
给sys_read下断点
(gdb) b sys_read
Breakpoint 2 at 0xc017585e: file fs/read_write.c, line 360.
(gdb)

用快捷键 ctrl+x+2 打开tui,并按c继续运行,而后拦截到sys_read
   ┌──fs/read_write.c────────────────────────────────────────────────────────────────────────────────────────────────────────┐
   │354     {                                                                                                                │
   │355             struct file *file;                                                                                       │
   │356             ssize_t ret = -EBADF;                                                                                    │
   │357             int fput_needed;                                                                                         │
   │358                                                                                                                      │
   │359             file = fget_light(fd, &fput_needed);                                                                     │
B+>│360             if (file) {                                                                                              │
   │361                     loff_t pos = file_pos_read(file);                                                                │
   │362                     ret = vfs_read(file, buf, count, &pos);                                                          │
   │363                     file_pos_write(file, pos);                                                                       │
   │364                     fput_light(file, fput_needed);                                                                   │
   │365             }                                                                                                        │
   │366                                                                                                                      │
   │367             return ret;                                                                                              │
   ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
   │0xc017585a <sys_read>           push   %ebp                                                                              │
   │0xc017585b <sys_read+1>         mov    %esp,%ebp                                                                         │
   │0xc017585d <sys_read+3>         push   %esi                                                                              │
B+>│0xc017585e <sys_read+4>         mov    $0xfffffff7,%esi                                                                  │
   │0xc0175863 <sys_read+9>         push   %ebx                                                                              │
   │0xc0175864 <sys_read+10>        sub    $0xc,%esp                                                                         │
   │0xc0175867 <sys_read+13>        mov    0x8(%ebp),%eax                                                                    │
   │0xc017586a <sys_read+16>        lea    -0xc(%ebp),%edx                                                                   │
   │0xc017586d <sys_read+19>        call   0xc0175f65 <fget_light>                                                           │
   │0xc0175872 <sys_read+24>        test   %eax,%eax                                                                         │
   │0xc0175874 <sys_read+26>        mov    %eax,%ebx                                                                         │
   │0xc0175876 <sys_read+28>        je     0xc01758b1 <sys_read+87>                                                          │
   │0xc0175878 <sys_read+30>        mov    0x24(%ebx),%edx                                                                   │
   │0xc017587b <sys_read+33>        mov    0x20(%eax),%eax                                                                   │
   └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
remote Thread 42000 In: sys_read                                                                    Line: 360  PC: 0xc017585e
(gdb) c
Continuing.

Breakpoint 2, sys_read (fd=3, buf=0xbfc781a4 "", count=512) at fs/read_write.c:360
(gdb)
arm虚拟调试环境的建立
利用qemu
利用qemu安装debian linux
目标:

本 节在qemu虚拟机上安装一个基于arm的“桌面“系统,可以有X桌面,该虚拟系统能利用apt-get从debian的软件库下载数不完的用交叉编译已 经编译好的arm下的程序和工具。除了虚拟处理器是arm外,简直就是PC机。可以进行应用程序的本机(在虚拟机内进行)调试。但是,本人装的时候,如果 选了安装桌面环境,内核就启动失败,好像是提示文件系统出错。[成功的麻烦把过程贴出来]

过程是:

Debian on an emulated ARM machine http://www.aurel32.net/info/debian_arm_qemu.php

下面是过程的提炼步骤,方便查看。

1.创建虚拟硬盘

$ qemu-img create -f qcow hda.img 40G

2.下载必要文件

$ wget http://people.debian.org/~aurel32/arm-versatile/vmlinuz-2.6.18-6-versatile
$ wget http://people.debian.org/~aurel32/arm-versatile/initrd.img-2.6.18-6-versatile
$ wget http://ftp.de.debian.org/debian/dists/etch/main/installer-arm/current/images/rpc/netboot/initrd.gz
2.安装系统

qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.18-6-versatile -initrd initrd.gz -hda hda.img -append "root=/dev/ram"
在安装过程中,为了节省时间,在这步choose a mirror of the debian archive
选http 回车 ;
debian archive mirror country 选taiwan 回车;
debian archive mirror 选ftp.tw.debian.org

安装好基本系统后,不要选择安装Desktop environment

安装完成后,它提示你把光盘拿掉并重启系统时,终止掉qemu。并用下一步的命令启动qemu.不要回车,否则又重新安装。
3. 第一次启动系统

$ qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.18-6-versatile -initrd initrd.img-2.6.18-6-versatile -hda hda.img -append "root=/dev/sda1"
4. 把旧的内核,intrd.img制作工具安装到虚拟机的系统内(操作在虚拟机内)

$ apt-get install initramfs-tools
$ wget http://people.debian.org/~aurel32/arm-versatile/linux-image-2.6.18-6-versatile_2.6.18.dfsg.1-18etch1+versatile_arm.deb
$ su -c "dpkg -i linux-image-2.6.18-6-versatile_2.6.18.dfsg.1-18etch1+versatile_arm.deb"
5.其他更多的玩法请看原文http://www.aurel32.net/info/debian_arm_qemu.php

参考:

Debian ARM Linux on Qemu

http://909ers.apl.washington.edu/~dushaw/ARM/#SYSTEM

Running Linux for ARM processors under QEMU

http://iomem.com/index.php?archives/2-Running-Linux-for-ARM-processors-under-QEMU.html&serendipity[entrypage]=2

Debian on an emulated ARM machine

http://www.aurel32.net/info/debian_arm_qemu.php

利用qemu安装能进行内核调试的系统
[暂时没法子,期待扩展。下面这个例子可以,但没尝试。估计这个方法与下节的利用skyeye的方法相比,没有优势。因为这个方法可能也是不能进行全程调试。但是下面网站的资料还是有一定参考价值的。]

使用qemu-jk2410做為學習環境:

http://wiki.jk2410.org/wiki/%E4%BD%BF%E7%94%A8qemu-jk2410%E5%81%9A%E7%82%BA%E5%AD%B8%E7%BF%92%E7%92%B0%E5%A2%83

另外:看看下面这个站点,

Firmware Linux: http://landley.net/code/firmware/

利用skyeye
skyeye虚拟机的内核调试
相对于利用qemu的方式,用skyeye虚拟机调试内核有个很重要的

优点是:

调试可以从第一条机器指令开始。这对研究系统启动过程提供了极大的便利。

skyeye的安装与使用
该文非常好,好像没啥要扩充的

SkyEye硬件模拟平台,第二部分: 安装与使用

http://www.ibm.com/developerworks/cn/linux/l-skyeye/part2/

SkyEye User Manual http://www.skyeye.org/wiki/UserManual

http://skyeye.wiki.sourceforge.net/

参考文档:

Linux-2.6.20 on XXX platform

http://skyeye.wiki.sourceforge.net/Linux

uClinux-dist-20070130 on XXX platform

http://skyeye.wiki.sourceforge.net/uClinux

http://www.linuxfans.org/bbs/thread-182101-1-1.html

安装:

1. 安装主程序

在ubuntu系统能进行在线安装,但版本是v1.2,不是最新的

$sudo apt-get install skyeye
2. 测试套件

测试套件下载后解压开即可

地址:http://sourceforge.net/project/showfiles.php?group_id=85554

快速试玩
目的:

尽可能快的成功运行一个arm linux虚拟机。如果您化了很长时间也无法编译出一个能运行的内核,或写不出一个恰当的skyeye.conf时,在你的热情受到打击之前,我想这节是你急需的。

操作步骤:

1.依照上节说明安装好主程序,下载并解压好测试套件

2.进入测试套件的目录 skyeye-testsuite-1.2.5/linux/s3c2410/s3c2410x-2.6.14

可以看到有三个文件initrd.img skyeye.conf vmlinux

3.运行虚拟机

$skyeye -e vmlinux

注意下面的提示,说明平时要注意在启动命令前加上sudo

NOTICE: you should be root at first !!!
NOTICE: you should inmod linux kernel net driver tun.o!!!
NOTICE: if you don't make device node, you should do commands:
NOTICE:    mkdir /dev/net; mknod /dev/net/tun c 10 200
NOTICE: now the net simulation function can not support!!!
NOTICE: Please read SkyEye.README and try again!!!
4.可以看到,一个2.6.14 版本的linux跑起来了,还带有一个lcd.

快速配置能调试的环境
参考:

http://skyeye.wiki.sourceforge.net/linux_2_6_17_lubbock

环境条件:

1. ubuntu hardy 8.04

2. 安装了debian提供的交叉编译工具套件 arm-linux-gnueabi- (4.2版本)

目标:

这 小节能得到基于pxa平台(类似s3c2410,也基于arm核心)的linux2.6.20内核的虚拟系统,具备调试功能。相比“基于qemu 和qemu内置gdbstub”该节,利用skyeye的调试有那节所没有的优点:调试时可以从内核运行的第一条指令开始[这就是模拟硬件调试?]。

参考手册:

XScale PXA250开发手册 http://soft.laogu.com/download/intelpxa250.pdf

ARMv5 体系结构参考手册 http://www.arm.com/community/university/eulaarmarm.html

操作步骤:

1. 下载linux-2.6.20 (由于交叉编译器太新,如果利用linux-2.6.17则编译不过)

2. 修改文件include/asm-arm/arch-pxa/memory.h 第18行

#define PHYS_OFFSET UL(0xa0000000)

#define PHYS_OFFSET UL(0xc0000000)
3. 下载内核配置选项,放置于linux-2.6.20源码的根目录下 http://skyeye.wiki.sourceforge.net/space/showimage/skyeye_2.6.17_lubbock.config

这个下载好的配置文件已经帮我们做了的两件事

首先,在block device菜单下配置了ramdisk和initrd的支持

其次,把内核原来的启动参数改为

root=/dev/ram0 console=ttyS0 initrd=0xc0800000,0x00800000 rw mem=64M
4. 把下载到的skyeye_2.6.17_lubbock.config更名为.config

5. 编译内核

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
6. 创建文件 skyeye.conf,内容如下:

cpu: pxa25x
mach: pxa_lubbock
mem_bank: map=I, type=RW, addr=0x40000000, size=0x0c000000
mem_bank: map=M, type=RW, addr=0xc0000000, size=0x00800000
mem_bank: map=M, type=RW, addr=0xc0800000, size=0x00800000, file=./initrd.img
mem_bank: map=M, type=RW, addr=0xc1000000, size=0x00800000
mem_bank: map=M, type=RW, addr=0xc1800000, size=0x02800000
7. 从skyeye的测试套件中拷贝initrd.img到linux-2.6.20源码根目录下。该initrd.img的路径是:

skyeye-testsuite-1.2.5/linux/pxa/2.6.x/
8. 运行内核看看,在linux-2.6.20源码根目录下运行下面的命令。可以看到,内核成功运行

sudo skyeye -e vmlinux
调试:

1. 在linux-2.6.20源码根目录下运行命令:

sudo skyeye -d -e vmlinux
2. 在源码根目录下新开一个终端,并运行:

arm-linux-gnueabi-gdb ./vmlinux
gdb界面出来后

(gdb) target remote:12345
之后可以看到,下断点,查看汇编等一切调试功能和x86下都一样。

3. ddd下如何调用arm-linux-gnueabi-gdb ? 答

$ ddd --debugger arm-linux-gnueabi-gdb ./vmlinux
为s3c2410配置2.6.26内核
[启动过程中有若干错误提示,但内核能启动成功并运行。有待研究]

目标:

得到一个基于s3c2410cpu的2.6.26最新稳定内核的虚拟系统,能进行全程的内核调试,即调试能从第一条机器指令开始进行。

参考:

http://skyeye.wiki.sourceforge.net/Linux

http://www.linuxfans.org/bbs/thread-182101-1-1.html

环境条件:

1. ubuntu hardy 8.04

2. 安装了debian提供的交叉编译工具套件 arm-linux-gnueabi- (4.2版本)

操作步骤:
  评论这张
 
阅读(4136)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018