如何从内核空间读取用户进程地址?

时间:2013-10-21 15:39:56

标签: c unix operating-system kernel qnx

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

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

1 个答案:

答案 0 :(得分: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