memory - 如何判断内存页是否被标记为只读?

标签 memory copy-on-write

当使用写时复制语义在进程之间共享内存时,如何测试内存页是否可写或是否标记为只读?这可以通过调用特定的汇编代码、读取内存中的某个位置或通过操作系统的 API 来完成吗?

最佳答案

在 Linux 上,您可以检查/proc/pid/maps:

$ cat /proc/self/maps

002b3000-002cc000 r-xp 00000000 68:01 143009   /lib/ld-2.5.so
002cc000-002cd000 r-xp 00018000 68:01 143009   /lib/ld-2.5.so
002cd000-002ce000 rwxp 00019000 68:01 143009   /lib/ld-2.5.so
002d0000-00407000 r-xp 00000000 68:01 143010   /lib/libc-2.5.so
00407000-00409000 r-xp 00137000 68:01 143010   /lib/libc-2.5.so
00409000-0040a000 rwxp 00139000 68:01 143010   /lib/libc-2.5.so
0040a000-0040d000 rwxp 0040a000 00:00 0
00c6f000-00c70000 r-xp 00c6f000 00:00 0        [vdso]
08048000-0804d000 r-xp 00000000 68:01 379298   /bin/cat
0804d000-0804e000 rw-p 00004000 68:01 379298   /bin/cat
08326000-08347000 rw-p 08326000 00:00 0
b7d1b000-b7f1b000 r--p 00000000 68:01 226705   /usr/lib/locale/locale-archive
b7f1b000-b7f1c000 rw-p b7f1b000 00:00 0
b7f28000-b7f29000 rw-p b7f28000 00:00 0
bfe37000-bfe4d000 rw-p bfe37000 00:00 0        [stack]

第一列是虚拟内存地址范围,第二列包含权限(读、写、执行和私有(private)),第 3-6 列包含偏移量、主要和次要设备号、inode 和名称内存映射文件。

关于memory - 如何判断内存页是否被标记为只读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/256387/

相关文章:

Python身份: Multiple personality disorder,需要代码收缩

c# - System.OutOfMemoryException 因为大字典

变量重新分配中的 C++11 内存释放

c++ - 一个关于内存使用的简单C++问题

objective-c - 由于 CoreAnimation 和 CG 图像的脏内存

c++ - 更有效地使用 fork() 和写时复制内存共享

函数 slice 参数与全局变量的性能?

ruby - Ruby 2.2 中的垃圾收集器引发意想不到的 CoW

linux - 如何知道写时复制页面是否是实际副本?

python - Python 是否对列表的副本使用写时复制?