gpt4 book ai didi

gdb - 使用 GDB 检查映射地址

转载 作者:行者123 更新时间:2023-12-03 20:12:54 24 4
gpt4 key购买 nike

我正在使用我在 Direct Memory Access in Linux 上发布的驱动程序将一些物理内存映射到用户空间地址。但是,我不能使用 GDB 查看任何地址;即,x 0x12345678(其中 0x12345678 是 mmap 的返回值)失败并显示错误“无法访问地址 0x12345678 处的内存”。

有没有办法告诉GDB这个内存可以查看?或者,我可以在 mmap 中做些什么不同的事情(调用或 foo_mmap 那里的实现)来允许它访问这个内存?

请注意,我不是在询问/dev/mem(如第一个片段中那样),而是询问通过 ioremap()、virt_to_phys() 和 remap_pfn_range() 获取的内存的 mmap

最佳答案

我相信 Linux 不会通过 ptrace() 访问 I/O 内存。您可以编写一个简单地读取 mmap 的地址并让 gdb 调用它的函数。这是您的 foo-user.c 程序的略微修改版本以及 gdb session 的输出。

#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>

char *mptr;

char peek(int offset)
{
return mptr[offset];
}

int main(void)
{
int fd;
fd = open("/dev/foo", O_RDWR | O_SYNC);
if (fd == -1) {
printf("open error...\n");
return 1;
}
mptr = mmap(0, 1 * 1024 * 1024, PROT_READ | PROT_WRITE,
MAP_FILE | MAP_SHARED, fd, 4096);
printf("On start, mptr points to 0x%lX.\n", (unsigned long) mptr);
printf("mptr points to 0x%lX. *mptr = 0x%X\n", (unsigned long) mptr,
*mptr);
mptr[0] = 'a';
mptr[1] = 'b';
printf("mptr points to 0x%lX. *mptr = 0x%X\n", (unsigned long) mptr,
*mptr);
close(fd);
return 0;
}



$ make foo-user CFLAGS=-g
$ gdb -q foo-user
(gdb) break 27
Breakpoint 1 at 0x804855f: file foo-user.c, line 27.
(gdb) run
Starting program: /home/me/foo/foo-user
On start, mptr points to 0xB7E1E000.
mptr points to 0xB7E1E000. *mptr = 0x61

Breakpoint 1, main () at foo-user.c:27
27 mptr[0] = 'a';
(gdb) n
28 mptr[1] = 'b';
(gdb) print peek(0)
$1 = 97 'a'
(gdb) print peek(1)
$2 = 98 'b'

关于gdb - 使用 GDB 检查映射地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/654393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com