Var*_*Zon 0 c linux virtual-memory
我有简单的程序:
#include <stdio.h>
int a = 5;
int
main(void)
{
while(1)
{
int i;
sleep(1);
printf("%p %i\n", &a, a);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出(Ubuntu x64):
0x601048 5
0x601048 5
0x601048 5
0x601048 5
Run Code Online (Sandbox Code Playgroud)
我正在学习C中的指针,我已经知道你可以用来memcpy在过程的虚拟内存中的任何地方(几乎)编写数据.但是,是否可以通过使用另一个应用程序(当然使用自己的虚拟内存)来修改int a放置在0x601048地址的值?这该怎么做?我只对C的解决方案感兴趣
它不容易实现(在Linux上的两个不同进程之间共享虚拟内存).作为第一个近似值,如果不可能编码.
即使你确实共享了这样的内存,你也会遇到同步问题.
你真的应该阅读像高级Linux编程这样的书.他们在这个问题上有几章(这很复杂).
通常,如果您真的想共享内存,则不会在调用堆栈上共享一些内存,但是您将"保留"一些内存区域以便以后共享.
你可以阅读更多关于
pthread -s(例如读这个pthread tutprial)
共享内存段设置与MMAP(2)使用MAP_SHARED
特别是使用ptrace(2)的低级调试工具PTRACE_PEEKDATA
Posix共享内存(参见shm_overview(7) ...)使用shm_open(2)
/proc/文件系统proc(5)例如/proc/$PID/mem; 我强烈建议file:///proc/self/maps您先在浏览器中查看并阅读更多信息,直到您了解这些内容为止.(你可以做mmap一些其他的过程/proc/$PID/mem....)
/dev/mem(物理RAM)见mem(4)
加载内核模块做疯狂的技巧.
我强烈建议不要为初学者玩这种肮脏的记忆技巧.如果您坚持,请准备好打破您的系统并经常备份它.在Linux新手时不要玩这样的技巧.
通常你需要root特权.查看功能(7)