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

标签 c unix operating-system kernel qnx

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

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

最佳答案

除非您是 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

关于c - 如何从内核空间读取用户进程地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19498908/

相关文章:

bash - Unix:从 .dat 文件中提取数据并插入 SQL 数据库?

c - 使用命名管道的进程间通信

C 编程帮助 - 将值相加

c - 多线程输出困惑

c - 逐行读取文件 - 为什么我只得到第一行?

c - C 字符串中的空格?

html - 如何在远程 unix 服务器上查看 html 文件?

linux - Unix 命令删除第一列后的所有内容

process - 地址空间(进程的)和进程控制 block (PCB)在操作系统中如何相关?

python - 如何按名称更改目录的用户和组权限?