gdb如何在Linux上访问另一个进程虚拟内存?全部通过/ proc完成吗?
gdb如何在Linux上访问另一个进程虚拟内存?全部通过/ proc完成吗?
在Linux上读取内存 :
1)如字节数来读取比更少3 * sizeof (long)
或文件系统/proc
不可用或从读取/proc/PID/mem
不成功则ptrace
使用具有PTRACE_PEEKTEXT
读取数据。
这些是函数中的这些条件linux_proc_xfer_partial()
:
/* Don't bother for one word. */
if (len < 3 * sizeof (long))
return 0;
/* We could keep this file open and cache it - possibly one per
thread. That requires some juggling, but is even faster. */
xsnprintf (filename, sizeof filename, "/proc/%d/mem",
ptid_get_pid (inferior_ptid));
fd = gdb_open_cloexec (filename, O_RDONLY | O_LARGEFILE, 0);
if (fd == -1)
return 0;
2)如果要读取的字节数大于或等于3 * sizeof(long)并且/proc
可用,则使用pread64
或(lseek()
和read()
使用:
static LONGEST
linux_proc_xfer_partial (struct target_ops *ops, enum target_object object,
const char *annex, gdb_byte *readbuf,
const gdb_byte *writebuf,
ULONGEST offset, LONGEST len)
{
.....
/* If pread64 is available, use it. It's faster if the kernel
supports it (only one syscall), and it's 64-bit safe even on
32-bit platforms (for instance, SPARC debugging a SPARC64
application). */
#ifdef HAVE_PREAD64
if (pread64 (fd, readbuf, len, offset) != len)
#else
if (lseek (fd, offset, SEEK_SET) == -1 || read (fd, readbuf, len) != len)
#endif
ret = 0;
else
ret = len;
close (fd);
return ret;
}
在Linux上写内存 :
1)ptrace
与PTRACE_POKETEXT
或一起PTRACE_POKEDATA
使用。
至于第二个问题:
在哪里可以找到有关…设置硬件观察点的信息
gdb,内部观察点:s
http://sourceware.org/gdb/wiki/Internals%20Watchpoints
参考:
我们都知道,直接从内存读写数据要比从硬盘读写数据快得多,因此更希望所有数据的读取和写入都在内存中完成,然而内存是有限的,这样就引出了物理内存与虚拟内存的概念。 物理内存就是系统硬件提供的内存大小,是真正的内存。相对于物理内存,在 Linux 下还有一个虚拟内存的概念,虚拟内存是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存。用作虚拟内存的磁盘空间被称为 交换空间(又称
问题内容: 我想要一个小的“应用程序加载器”程序,该程序可以通过TCP从外部服务器接收其他二进制应用程序文件并运行它们。 我可以通过将传输的文件保存到硬盘上并使用system()调用来运行它来完成此操作。但是,我想知道是否有可能从内存中启动新应用程序而不接触硬盘驱动器。 加载新应用程序后,加载程序应用程序的状态无关紧要。我更喜欢使用C,但是也欢迎使用C ++解决方案。我还要坚持使用标准Linux
主要内容:虚拟内存如何工作?,按需分页,虚拟内存管理系统的快照虚拟内存是一种存储方案,为用户提供了一个拥有非常大的主内存的幻觉。 这是通过将辅助存储器的一部分作为主存储器来完成的。 在这种方案中,用户可以加载比可用主存更大的进程,因为存在内存可用于加载进程的错觉。 操作系统不是在主内存中加载一个大进程,而是在主内存中加载多个进程的不同部分。 通过这样做,多程序的程度将会增加,因此CPU利用率也会增加。 虚拟内存如何工作? 在现代语言中,虚拟内存近来变得非常普
编辑: > 继Ingo Leonhardt之后,我在以root用户身份而不是以标准用户身份登录后尝试了。这样做解决了root的问题(然后程序可以在以root身份登录时分配所有物理内存)。但这只适用于root用户,不适用于其他用户。但是,至少这意味着原则上内核可以很好地处理这一点,而且只有一个配置问题。 关于:我尝试显式地添加 null > 这是我自己的愚蠢造成的。在我的用户设置中有一个(早已被遗忘
处理器的虚拟内存子系统为每个进程实现了虚拟地址空间。这让每个进程认为它在系统中是独立的。虚拟内存的优点列表别的地方描述的非常详细,所以这里就不重复了。本节集中在虚拟内存的实际的实现细节,和相关的成本。 虚拟地址空间是由CPU的内存管理单元(MMU)实现的。OS必须填充页表数据结构,但大多数CPU自己做了剩下的工作。这事实上是一个相当复杂的机制;最好的理解它的方法是引入数据结构来描述虚拟地址空间。
问题内容: 我正在尝试直接为嵌入式Linux项目访问物理内存,但是我不确定如何最好地指定使用的内存。 如果我定期引导设备并访问/ dev / mem,则可以轻松地对其几乎任何位置进行读写。但是,在这种情况下,我正在访问可以轻松分配给任何进程的内存。我不想做 我的/ dev / mem代码是(删除了所有错误,等等。): 这可行。但是,我想使用没有其他人会碰到的内存。我尝试通过使用mem = XXXm