您的位置:首页 > 运维架构 > Linux

linux内核移植-内核调试工具KGBD、DDD、GDB移植笔记

2017-02-20 20:35 471 查看
一、开发环境1、内核:Linux 2.6.22.6;2、JZ24403、ubuntu9.104、kgdb-2_linux2_6_22_uprev.tar.bz25、gdb-6.7.tar.bz2二、内核调试工具KGBD移植1、解压到当前目录。 $ tar xjf kgdb-2_linux2_6_22_uprev.tar.bz22、把解压的文件改名为patchs,并复制到内核根目录下。执行命令: $ quilt push -a 有可能提示没有quilt命令,则按照提示安装quilt,命令: $ sudo apt-get install quilt3、修改补丁笔误。目录:include/asm--arm/system.h。 将380行的 pref = *p 改为 prev = *p4、编写s3c2440的串口函数。这版本的KGDB不支持s3c2440的串口,需要自己编写相关函数:初始化函数、发送单字符函数、接受单字符函数。分别如下:static int kgdb_serial_init(void)
{
struct clk *clock_p;
u32 pclk;
u32 ubrdiv;
u32 val;
u32 index = CONFIG_KGDB_PORT_NUM;

clock_p = clk_get(NULL, "pclk");
pclk = clk_get_rate(clock_p);

ubrdiv = (pclk / (UART_BAUDRATE * 16)) - 1;

/* 设置GPIO用作串口, 并且禁止内部上拉
* GPH2,GPH3用作TXD0,RXD0
* GPH4,GPH5用作TXD1,RXD1
* GPH6,GPH7用作TXD2,RXD2
*/
if (index < MAX_PORT)
{
index = 2 + index * 2;

val = inl(S3C2410_GPHUP) | (0x3 << index);
outl(val, S3C2410_GPHUP);

index *= 2;
val = (inl(S3C2410_GPHCON) & (~(0xF << index))) | \
(0xA << index);
outl(val, S3C2410_GPHCON);
}
else
{
return -1;
}

// 8N1(8个数据位,无较验,1个停止位)
wr_regl(CONFIG_KGDB_PORT_NUM, S3C2410_ULCON, 0x03);

// 中断/查询方式,UART时钟源为PCLK
wr_regl(CONFIG_KGDB_PORT_NUM, S3C2410_UCON, 0x3c5);

// 使用FIFO
wr_regl(CONFIG_KGDB_PORT_NUM, S3C2410_UFCON, 0x51);

// 不使用流控
wr_regl(CONFIG_KGDB_PORT_NUM, S3C2410_UMCON, 0x00);

// 设置波特率
wr_regl(CONFIG_KGDB_PORT_NUM, S3C2410_UBRDIV, ubrdiv);

return 0;
}
static void kgdb_serial_putchar(u8 c)
{
/* 等待,直到发送缓冲区中的数据已经全部发送出去 */
while (!(rd_regb(CONFIG_KGDB_PORT_NUM, S3C2410_UTRSTAT) & S3C2410_UTRSTAT_TXE));

/* 向UTXH寄存器中写入数据,UART即自动将它发送出去 */
wr_regb(CONFIG_KGDB_PORT_NUM, S3C2410_UTXH, c);
}

static int kgdb_serial_getchar(void)
{
/* 等待,直到接收缓冲区中的有数据 */
while (!(rd_regb(CONFIG_KGDB_PORT_NUM, S3C2410_UTRSTAT) & S3C2410_UTRSTAT_RXDR));

/* 直接读取URXH寄存器,即可获得接收到的数据 */
return rd_regb(CONFIG_KGDB_PORT_NUM, S3C2410_URXH);
}
5、构建kgdb_io_ops结构。
struct kgdb_io kgdb_io_ops = {
.init = kgdb_serial_init,
.read_char = kgdb_serial_getchar,
.write_char = kgdb_serial_putchar,
};

6、修改内核配置文件、makefile。

(1)修改linux-2.6.22.6/arch/arm/mach-s3c2410/Makefile,添加如下语句,将kgdb-serial.c文件编译进内核。

 obj-$(CONFIG_KGDB_S3C24XX_SERIAL) += kgdb-serial.o

(2)修改lib/Kconfig.kgdb,支持 CONFIG_KGDB_S3C24XX_SERIAL。

 增加 default CONFIG_KGDB_S3C24XX_SERIAL if ARCH_S3C2410

40 choice
41prompt "Method for KGDB communication"
42depends on KGDB
43default CONFIG_KGDB_S3C24XX_SERIAL if ARCH_S3C2410

 增加下面一段,用来支持 CONFIG_KGDB_S3C24XX_SERIAL
62 config CONFIG_KGDB_S3C24XX_SERIAL

63 bool "KGDB: On the S3C24XX serial port"

64 depends on ARCH_S3C2410

65 help

66  Enable the KGDB serial driver for s3c24xx.

 在 config KGDB_BAUDRATE 中增加 KGDB_S3C24XX_SERIAL

 config KGDB_BAUDRATE

int "Debug serial port baud rate"
depends on (KGDB_8250 && KGDB_SIMPLE_SERIAL) || \
KGDB_MPSC || KGDB_CPM_UART || \
KGDB_TXX9 || KGDB_PXA_SERIAL || KGDB_AMBA_PL011 ||KGDB_S3C24XX_SERIAL
default "115200"

 在 config KGDB_PORT_NUM 中增加 KGDB_S3C24XX_SERIAL,并把default改为0
 config KGDB_PORT_NUM

  int "Serial port number for KGDB"
range 0 1 if KGDB_MPSC
range 0 3
depends on (KGDB_8250 && KGDB_SIMPLE_SERIAL) || KGDB_MPSC || KGDB_TXX9 ||KGDB_S3C24XX_SERIAL
default "0"default

7、配置内核,使能KGBD功能。

 Kernel hacking -->选择下面两项。



9、make uImage。即可制作支持KGDB调试的uImage。下载到单板。

三、DDD安装。图形化调试工具。

 使用命令:sudo apt-get install ddd。

四、安装GDB。使用安装包gdb-6.7.tar.bz2。依次执行命令:

$ tar xjf gdb-6.7.tar.bz2 

$ ./configure --target=arm-linux

$ make

出现错误

cc1: warnings being treated as errors

elf32-arm.c: In function 'find_thumb_glue':

elf32-arm.c:2524: error: ignoring return value of 'asprintf', declared with attribute warn_unused_result

elf32-arm.c: In function 'find_arm_glue':

elf32-arm.c:2557: error: ignoring return value of 'asprintf', declared with attribute warn_unused_result

make[4]: *** [elf32-arm.lo] Error 1

make[4]: Leaving directory `/home/book/workspace/gdb-6.7/bfd'

make[3]: *** [all-recursive] Error 1

make[3]: Leaving directory `/home/book/workspace/gdb-6.7/bfd'

make[2]: *** [all] Error 2

make[2]: Leaving directory `/home/book/workspace/gdb-6.7/bfd'

make[1]: *** [all-bfd] Error 2

make[1]: Leaving directory `/home/book/workspace/gdb-6.7'

make: *** [all] Error 2

这是由于返回值没有被接收导致,找到错误出现的目录,去掉Makefile中WERROR_CFLAGS的-Werror选项,编译通过。会不会产生其他问题暂时还不知道。

gdb-6.7/bfd/Makefile:202:WARN_CFLAGS = -W -Wall
-Wstrict-prototypes -Wmissing-prototypes -Werror

gdb-6.7/gdb/Makefile:139:WERROR_CFLAGS = -Werror

这时就会在/gdb目录下生产调试工具gdb,把它拷到计算机/usr/bin/目录下使用。

$
sudo cp gdb/gdb /usr/bin/arm-linux-gdb

五、使用

(1)启动支持KGDB的单板linux内核。这需要增加两个命令参数。

 OpenJTAG> set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=kgdb kgdbwait

 OpenJTAG> saves

然后启动单板。内核会停留在如下图界面,等待计算机arm-linux-gdb连接。



(2)启动计算机arm-linux-gdb调试工具(注意设置虚拟机,增加物理串口)

 进入内核目录,使用命令:$ sudo arm-linux-gdb ./vmlinux,就可以启动arm-linux-gdb,如下图



这样就可以使用各种调试命令了。设置一下串口和波特率,命令

(gdb) set remotebaud 115200

(gdb) target remote /dev/ttyS0

(3)也可以使用DDD调用arm-linux-gdb来调试内核。

进入内核目录,使用命令: $ sudo ddd --debugger arm-linux-gdb ./vmlinux

就可以启动DDD,界面如下,这样就不用每次都输命令,使用arm-linux-gdb来调试单板上的内核了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: