0

实际上,我正在研究 QNX。在内核空间中的某个时刻,当一个进程想要向另一个进程发送消息并且这两个进程都被阻塞时,我可以获得每个进程的堆栈指针和帧指针的值。

接下来,我想访问每个进程的堆栈,但我的问题是这些值(sp 和 fp)是在用户进程中有效的虚拟地址。我如何从内核空间中的这些用户地址读取单词?

4

1 回答 1

1

除非您是 QNX 雇用的内核开发人员,否则您的代码永远不会在“内核空间”中运行。只有内核和进程 1(QNX 称之为“proc”,pidin 显示为 procnto 或 procnto-instr)在“内核空间”中运行,您无法修改它们。

如果要调试进程,则可以使用 gdb 连接到它们并检查它们的内存内容。您可以在不知道虚拟 sp 指向的内存的物理地址的情况下执行此操作。

如果你想从另一个程序中读取内存,那么你可以这样做:

fd = open("/proc/PID/as", O_RDONLY);
lseek(fd, virtual_address_to_read, SEEK_SET);
read(fd, buffer, cnt_bytes_to_read);

QNX 在以下位置记录了这一点: http ://www.qnx.com/developers/docs/6.5.0_sp1/index.jsp?topic=%2Fcom.qnx.doc.neutrino_prog%2Fprocess.html&cp=13_7_3_4_1&anchor=Address_space

于 2013-12-03T06:48:08.983 回答