bor*_*ree 25 linux memory-management linux-kernel
我无法理解linux中的内存映射页面和匿名页面.有人可以用一个例子解释一下吗?与它们相关的内核数据结构是什么?
typ*_*eaf 56
正确的术语是内存映射文件和匿名映射.当提到内存映射时,通常是指mmap(2).使用mmap有两个类别.一个类别是SHARED与PRIVATE映射.另一类是FILE vs ANONYMOUS映射.混合在一起,您将获得以下4种组合:
文件映射指定磁盘上的文件,该文件将N个字节映射到内存中.函数mmap(2)将要映射到内存的文件的文件描述符作为其第4个参数.第五个参数是要读入的字节数,作为偏移量.使用mmap创建内存映射文件的典型过程如下
将文件作为PRIVATE映射时,所做的更改不会提交到基础文件.它是文件的PRIVATE内存副本.当文件映射为SHARED时,内核会自动将更改提交给基础文件.以共享方式映射的文件可用于所谓的内存映射I/O和IPC.如果需要文件的持久性,可以使用IPC的内存映射文件而不是共享内存段
如果使用strace(1)来监视进程初始化,您会注意到使用mmap(2)将文件的不同部分映射为私有文件映射.系统库也是如此.
strace(1)的输出示例,其中mmap(2)用于将库映射到流程.
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=42238, ...}) = 0
mmap(NULL, 42238, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff7ca71e000
close(3) = 0
open("/lib64/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\356\341n8\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1926760, ...}) = 0
mmap(0x386ee00000, 3750152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x386ee00000
Run Code Online (Sandbox Code Playgroud)
匿名映射不受文件支持.具体而言,当MAP_ANONYMOUS标志用作mmap(2)的第3个参数时,甚至不使用mmap(2)的第4个(文件描述符)和第5个(偏移量)参数.使用MAP_ANONYMOUS标志的另一种方法是使用/ dev/zero作为文件.
对我来说,"匿名"一词是一个糟糕的选择,因为它听起来好像文件是匿名映射的.相反,它是匿名的文件,即.没有指定文件.
用户土地编程中用于私有匿名映射的用途很少.您可以使用共享匿名映射,以便应用程序可以共享内存区域,但我不知道您不会使用SYSV或POSIX共享内存的原因.
由于使用匿名映射映射的内存保证为零填充,因此对于某些期望/要求零填充内存区域的应用程序以这种方式使用mmap(2)而不是malloc(2)+ memset(2)可能很有用)组合.
据我所知,匿名页面是这样命名的,因为它们没有命名的文件系统源,而映射的页面是具体文件的映射.例如,您可以在任何用户空间进程中使用简单的malloc操作获取anonymos页面...
关于内核结构:显然它是结构页面,但是在anonymos页面的情况下,你将在页面 - >映射中使用struct anon_vma,并且在映射页面的情况下 - struct address_space,它与具体的inode连接.
| 归档时间: |
|
| 查看次数: |
26023 次 |
| 最近记录: |