如何在安卓系统上使用arm-linux-gdb调试内核

如何在安卓系统上使用arm-linux-gdb调试内核,第1张

1,先下载最新版本的gdb源代码包,我使用的是gdb-7.6.tar.gz,使用tar命令进行解包(tar -xvzf gdb-7.6.tar.gz),cd进gdb-7.6/gdb目录,使用vi找到remote.c中的如下代码:

if(buf_len >2 * rsa->sizeof_g_packet)

error(_("Remote 'g' packet reply is too long: %s"),rs->buf)

将上面两行注释掉,添加如下代码

if(buf_len >2 * rsa->sizeof_g_packet)

{

rsa->sizeof_g_packet = buf_len

for(i = 0i <gdbarch_num_regs(gdbarch)i++)

{

if(rsa->regs[i].pnum == -1)

continue

if(rsa->regs[i].offset >= rsa->sizeof_g_packet)

rsa->regs[i].in_g_packet = 0

else

rsa->regs[i].in_g_packet = 1

}

}

使用如下命令对代码进行配置、编译和安装

./configure --target=arm-linux --prefix=/usr/local/arm-gdb -v

make

make install

2,gdbserver使用android4.2模拟器中自带的版本(v7.1)

3,将NDK编译好的C/C++可执行程序,上传到模拟器中/data/test目录下,假设可执行程序的名称为testHello。

4,使用命令:gdbserver :7000 /data/test/testHello 启动模拟器端的调试。

5,启动arm-linux-gdb之前,使用vi打开~/.bash_profile文件,在其中添加:

export PATH=$PATH:/usr/local/arm-gdb/bin,以便在程序的其他目录可以直接启动arm-linux-gdb程序

6,cd至ndk编译好的testHello文件所在目录

7,使用如下命令进行端口映射:adb forward tcp:7000 tcp:7000,将模拟器的7000端口和本机的7000端口进行映射

8,使用命令:arm-linux-gdb testHello启动gdb调试

9,使用target remote :7000 链接模拟器中gdbserver启动的服务。

10,自此,我们就可以使用gdb命令进行代码调试了。

一.Raspberry Pi入门向导。

可以在以下地址下载Raspberry向导

2.构建android framework

命令如下:

cd <your_android_path>

source build/envsetup.sh

lunch

显示lunch菜单如下:

You’re building on Linux

Lunch menu… pick a combo:

1. full-eng

2. full_x86-eng

3. simulator

4. full_rpi-eng

5. cyanogen_generic-eng

6. cyanogen_rpi-eng

选择第6个菜单。

然后进行编译

make -j8

等待编译成功,这可能需要几十分钟。

编译成功之后将”system”目录复制到root目录下,接下来我们可能会用到。

命令如下:

cd <your_android_path>

cp -r system out/target/product/rpi/root

ps:编译时如果jdk版本不对,可将其改成jdk1.6

五.如何在Raspberry Pi上跑android linux内核

1.准备一张存储空间2G以上的SD卡及相应读卡器。

2.下载arch linux镜像文件

用wget工具下载镜像文件:

wget http://files.velocix.com/c1410/images/archlinuxarm/archlinux-hf-2012-09-18/archlinux-hf-2012-09-18.zip

解压:

unzip archlinux-hf-2012-09-18.zip

成功之后,你会在当前目录下发现一个镜像文件。

3.烧linux镜像文件。

sudo dd bs=4M if=archlinux-hf-2012-09-18.img of=/dev/sdb

sudo sync

ps:/dev/sdb是SD卡在主机上的设备文件。不同的电脑可能不同。

4.用android linux内核代替这个内核。

做完上述步骤之后,当你把SD卡插在电脑上,你会发现有两个分区:一个是引导区,另一个是文件系统区。

用android linux内核代替引导区的kernel.img。

cp -uv <your_android_linux_path>/arch/arm/boot/zImage <your_sdcard_boot_partition>/kernel.img

5.用android linux文件系统代替这个linux文件系统

rm -rf <your_sdcard_file_system_partition>

cp -r <your_android_source_code_path>/out/target/product/rpi/root/* <your_sdcard_file_system_partition>

6.配置内核命令行cmdline.txt

Edit the <your_sdcard_boot_partition>/cmdling.txt, and replace “init=/…” with “init=/init”

7.做完这些之后就可以在Raspberry Pi上跑这个android linux内核。

六.如何为Android linux做一张可引导的SD卡

1.删除已有分区,如果没有就不用删了。

Command(m for help):p

Disk /dev/sdb: 15.7 GB, 15707668480 bytes

64 heads, 32 sectors/track, 14980 cylinders, total 30668085 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0×00000000

sudo fdisk/dev/sdb

Command(m for help):d

Partition number(1-4):1

Command(m for help):d

Selected partition 2

Command (m for help): p

Disk /dev/sdb: 15.7 GB, 15707668480 bytes

64 heads, 32 sectors/track, 14980 cylinders, total 30679040 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0×00000000

Device Boot      Start         End      Blocks   Id  System

Command(m for help):w

ps:确定删除之后,卸掉SD卡,然后再装上。

以bytes问单位记下SD卡的大小。后面的步骤会用到。

然后进入”Expert mode”。

Command(m for help):x

将这个SD卡设置为255个磁面,63个扇区和磁柱数量(不同的SD/mmc卡有着不同的此柱数量)

Expert command (m for help): h

Number of heads (1-256, default 64): 255

Expert command (m for help): s

Number of sectors (1-63, default 32): 63

ps:在下一步开始前,先要计算磁柱数量,计算过程如下:

B:SD卡以bytes为单位的大小(前面已经记住了即:15707668480)

C:磁柱的数量

C=B/255/63/512

例如:我的SD卡大小是16G(15707668480)

C=15707668480/255/63/512=1909.68191721,约等于1909.

Expert command (m for help): c

Number of cylinders (1-1048576, default 14980): 1909

Expert command (m for help): r

2.新建分区

如果你的SD卡已经分区,请按照上述步骤删除分区。接下来,我们将创建两个分区,一个是引导区,用来存放内核镜像等文件;另一个文件系统区存放android linux文件系统。

Command (m for help): n

Partition type:

p   primary (0 primary, 0 extended, 4 free)

e   extended

Select (default p): p

Partition number (1-4, default 1):

Using default value 1

First sector (2048-30679039, default 2048):

Using default value 2048

Last sector, +sectors or +size{K,M,G} (2048-30679039, default 30679039): +128M

Command (m for help): t

Selected partition 1

Hex code (type L to list codes): c

Changed system type of partition 1 to c (W95 FAT32 (LBA))

Command (m for help): a

Partition number (1-4): 1

Command (m for help): n

Partition type:

p   primary (1 primary, 0 extended, 3 free)

e   extended

Select (default p): p

Partition number (1-4, default 2):

Using default value 2

First sector (264192-30679039, default 264192):

Using default value 264192

Last sector, +sectors or +size{K,M,G} (264192-30679039, default 30679039):

Using default value 30679039

Command (m for help): w

The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: If you have created or modified any DOS 6.x

partitions, please see the fdisk manual page for additional

information.

Syncing disks.

ok,分区成功,现在我们有两个分区,接下我们对分区进行格式化。

3.格式化分区

对引导区进行格式化:

sudo mkfs.msdos -F 32 /dev/sdb1 -n BOOT

mkfs.msdos 3.0.12 (29 Oct 2011)

对文件系统区进行格式化:

sudo mkfs.ext3 /dev/sdb2 -L ROOTFS

mke2fs 1.42 (29-Nov-2011)

Filesystem label=ROOTFS

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

Stride=0 blocks, Stripe width=0 blocks

950976 inodes, 3801856 blocks

190092 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=3896508416

117 block groups

32768 blocks per group, 32768 fragments per group

8128 inodes per group

Superblock backups stored on blocks:

32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: done

Writing inode tables: done

Creating journal (32768 blocks): done

Writing superblocks and filesystem accounting information: done

4.设置引导区

引导区必须包含以下文件,你可以从官方镜像里获取(bootable/fat32 partition)也可以从书面步骤中复制过来:

bootcode.bin:第二阶段的引导程序,

loader.bin:第三阶段的引导程序,

start.elf:GPU二进制固件映像,

kernel.img *** 作系统的内核镜像文件,

cmdline.txt:传递给内核的参数.

5.设置root文件系统分区

ROOTFS分区包含android文件系统,是从<your_android_framework_path>/out/target/product/rpi/root复制过来的。

cp -r <your_android_framework_path>/out/target/product/rpi/root/* /media/ROOTFS/

6.完成上述步骤之后,将其放在Raspberry Pi上跑。

七.如何在Raspberry Pi使用adb?

1.查看网络

当android linux在Raspberry Pi运行时,切换到控制台,执行以下命令:

ifconfig eth0

记下ip地址。

如果不能找到ip,可以输入以下命令:/system/xbin/dhcp-eth0,来启动网络连接程序。

ps:如果屏幕没有显示控制台,只要按CTRL+ALT+F2即可切换到控制台。如果你想要切换到Android界面,只要按CTRL+ALT+F7即可。

2.远程连接adb服务器

在主机上执行以下命令即可与同一局域网的Raspberry Pi相连

adb connect ip

连接成功后,你就可以用adb工具输出日志,执行shell命令等。

3.也可以用数据线连接主机,直接在主机上调试。

进入调试的命令为:

screen /dev/ttyUSB0 115200

名词解释:

交叉编译(cross compile):交叉编译呢,简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓 平台,实际上包含两个概念:体系结构(Architecture)、 *** 作系统(Operating System)。同一个体系结构可以运行不同的 *** 作系统;同样,同一个 *** 作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86 *** 作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86 *** 作系统的简称。

本文用《Android深度探索(卷1):HAL与驱动开发》的随书源代码为例详细说明如何配置Android驱动开发和测试环境,并且如何使用源代码中的build.sh脚本文件在各种平台(Ubuntu Linux、Android模拟器和S3C6410开发板)上编译、安装和测试Linux驱动。建议读者使用Ubuntu Linux12.04或更高版本实验本文的方法。最好用root账号登录Linux。

一、安装交叉编译器

如果只是在Ubuntu Linux上测试Linux驱动就不需要安装交叉编译器了,但要在Android模拟器或S3C6410开发板上进行测试,就必须安装交叉编译器。

首先下载交叉编译器(分卷压缩)

下载后解压,会发现有两个tgz文件,可以将这两个文件放到/root/compilers目录中,在Linux终端进入该目录,执行如下命令安装交叉编译器。

[plain] view plain copy

# tar zxvf arm-linux-gcc-4.3.2.tgz-C/

# tar jxvf arm-none-linux-gnueabi-arm-2008q3-72-for-linux.tar.bz2 -C /

二、编译和测试Linux内核

这里的Linux内核有两个,一个是goldfish,也就是Android模拟器使用的Linux内核、另外一个是S3C6410开发板使用的Linux内核(Linux2.6.36)。读者首先要下载这两个Linux内核。

Android模拟器用的Linux内核源代码(分卷压缩)

用于S3C6410开发板的Linux内核源代码(分卷压缩)

分卷1

分卷2

由于随书代码中的word_count驱动已经在goldfish和linux2.6.36中分别建立了符号链接,以便在编译linux内核时同时也会编译word_count驱动,所以linux内核与源代码目录应与作者机器上的目录相同。也就是两个linux内核目录与源代码目录如下:

linux内核目录

/root/kernel/goldfish

/root/kernel/linux_kernel_2.6.36

源代码目录

/root/drivers

注意/root/drivers目录下就直接是每一章的源代码了,例如/root/drivers/ch06、/root/drivers/ch07

现在需要将/usr/local/arm/arm-none-linux-gnueabi/bin路径加到Linux的PATH环境变量中(不会加的上网查,这是Linux的基本功)

最后进入/root/compilers/goldfish目录,执行make命令编译linux内核,如果完全编译,大概20分钟左右。编译完成后,会在/root/kernel/goldfish/arch/arm/boot目录中生成一个zImage文件,代码1.7MB,这就是用于Android模拟器的Linux内核文件。

三、编译Linux驱动

现在来编译随书光盘的驱动程序,这里以word_count驱动为例。在Linux终端进入/root/drivers/ch06/word_count目录。先别忙着编译。首先要设置打开/root/drivers/common.sh文件,修改第一行UBUNTU_KERNEL_PATH变量值为自己机器上安装的Ubuntu Linux内核路径,只要执行“ls /usr/src”命令即可查看当前机器可用的linux内核。如可以设置下面的路径。

UBUNTU_KERNEL_PATH=/usr/src/linux-headers-3.2.0-23-generic

剩下的两个(S3C6410_KERNEL_PATH和/root/kernel/goldfish)只要按着前面的路径解压Linux内核源代码,就不用设置了。

在word_count目录中执行“source build.sh”命令,会允许选择在哪个平台上编译驱动,直接按回车会在Ubuntu Linux上编译。如果编译成功,会发现当前目录多一个word_count.ko文件(驱动文件)。

现在来编译S3C6410上运行的word_count驱动。先别忙,在编译之前,需要Android中的adb命令。因为build.sh足够只能,在编译完后,如果有多个Android设备连接到PC,会允许用户选择上传到哪个设备装载,这里需要选择S3C6410开发板,然后会直接上传到开发板上,如图1所示。

可以直接使用adb shell命令进入开发板,也可以使用/root/drivers/shell.sh脚本完成同样的工作,只是后者如果有多个android设备,会允许用选择,而不是输入相应的设备ID。使 *** 作更方便。在/root/drivers目录中提供了很多这样的脚本(shell.sh、push.sh、pull.sh等),这些脚本都会允许用户选择 *** 作的Android设备。

我们通常使用Android SDK中的adb命令,到官方网站下载装载linux版本的Android SDK,然后将<AndroidSDK根目录>/platform-tools加到PATH环境变量中。

现在再次执行“source build.sh”命令,选择第2项(S3C6410开发板),如果系统没找到开发板,需要将USB线拔下重插一下。然后就可以进入开发板的终端,输入lsmod命令查看驱动的安装情况了。

如果在模拟器上测试,选第3项。具体测试的方法请参见书中相应的章节。

四、测试Linux驱动

测试word_count驱动的方法很多,通过命令行测试的方法请参见书中相应的章节,在word_count目录中有一个test_word_count程序,通过执行如下的命令可以测试word_count驱动,编译test_word_count.c程序的方法书中已详细描述。

test_word_count “abc bb cc”

上面的命令会输出单词数为3。

如果要编译Android HAL,需要Android源代码。购买S3C6410开发板时商家通常会带一些光盘,里面有用于开发板的Android源代码,如果商家没给光盘,别忘了要哦!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8991134.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-23
下一篇 2023-04-23

发表评论

登录后才能评论

评论列表(0条)

保存