linux断点调试命令窗口读数据

linux断点调试命令窗口读数据,第1张

在Linux断点调试命令窗口中读取数据,可以使用以下命令:

1. x/nfu <addr>: 使用指定的格式和大小从指定地址读取数据。n表示要读取的数据数量,f表示数据格式,u表示数据大小。

2. info registers: 查看当前程序中各个寄存器的值。

3. disassemble: 查看当前程序指令的汇编代码。

4. print: 打印当前程序的变量的值。

5. stepi/si: 执行一条汇编指令。

6. nexti/ni: 执行一条汇编指令,但不进入函数体内部。

这一问题来自项目中一个实际的需求:

我需要在Linux启动之后,确认我指定的芯片寄存器是否与我在uboot的配置一致。

举个例子:

寄存器地址:0x20000010负责对DDR2的时序配置,该寄存器是在uboot中设置,现在我想在Linux运行后,读出改寄存器的值,再来检查该寄存器是否与uboot的配置一致。

Linux应用程序运行的是虚拟空间,有没有什么机制可以是完成我提到的这一需求。若行,还请附些测试代码。

谢谢!

这个需要用mmap()函数将寄存器物理地址映射为用户空间的虚拟地址,即将寄存器的那段内存映射到用户空间,函数介绍如下:

void*

mmap(void

*

addr,

size_t

len,

int

prot,

int

flags,

int

fd,

off_t

offset)

该函数映射文件描述符

fd

指定文件的

[offset,

offset

+

len]

物理内存区至调用进程的

[addr,

addr

+

len]

的用户空间虚拟内存区,通常用于内存共享或者用户空间程序控制硬件设备,函数的返回值为最后文件映射到用户空间的地址,进程可直接 *** 作该地址。下面是测试代码(仅供参考):

#define

DDR2_REG_BASE

(0x20000000)

#define

MAP_SIZE

4096UL

#define

MAP_MASK

(MAP_SIZE

-

1)

static

unsigned

int

pTestRegBase

static

int

dev_fd

dev_fd

=

open("/dev/mem",

O_RDWR

|

O_NDELAY)

if

(dev_fd

<</SPAN>

0)

{

LOGE("open(/dev/mem)

failed.")

return

}

pTestRegBase

=

(void

*)mmap(NULL,

MAP_SIZE,

PROT_READ

|

PROT_WRITE,

MAP_SHARED,

dev_fd,DDR2_REG_BASE

&

~MAP_MASK)

if

(MAP_FAILED

==

pTestRegBase)

{

printf("mmap

failed.

fd(%d),

addr(0x%x),

size(%d)\n",

dev_fd,

DDR2_REG_BASE,

MAP_SIZE)

}

else

{

unsigned

int

reg_value

=

*((volatile

unsigned

int

*)(pTestRegBase

+

10))

printf("reg_value

=

0xx\n",

reg_value)

munmap((void*)pTestRegBase,

MAP_SIZE)

}

pTestRegBase

=

0

if(dev_fd)

close(dev_fd)

这里将DDR2_REG_BASE开始大小为1个page的物理地址映射到了用户空间,然后就可以用pTestRegBase作为起始地址 *** 作寄存器了。


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

原文地址:https://54852.com/yw/8566845.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存