当前位置:首页 > 内存 > 正文

linux内核访问用户态内存

  • 内存
  • 2024-05-11 09:30:33
  • 2192

一、Linux-用户态内存映射和内核态内存映射

操作系统的内存管理主要分为三个方面。
首先,物理内存的管理相当于会议室管理员管理会议室。
其次是虚拟地址的管理,即从项目组的角度来看,会议室的虚拟地址应该如何组织。
第三,虚拟地址和物理地址如何映射,即会议室管理员如何管理映射表。

那么虚拟地址和物理地址是如何映射的呢?

每个进程都有一个列表vm_area_struct,它指向虚拟地址空间中不同的内存块。该变量的名称是mmap。

实际上,内存映射不仅仅是物理内存和虚拟内存之间的映射,还包括将文件内容映射到虚拟内存空间。此时访问内存空间就可以访问文件中的数据了。仅物理内存和虚拟内存的映射是一种特殊情况。

如果我们要申请一个小的内存块,就使用brk。Brk函数之前已经分析过,这里不再述。如果申请大内存,必须使用mmap。对于堆应用程序,mmap将内存空间映射到物理内存。

另外,如果一个进程想要将一个文件映射到自己的虚拟内存空间,还必须调用mmap系统。此时,mmap将内存空间映射到物理内存,再映射到文件。可以看出mmapsyscall是核心,现在我们来看看mmapsyscall。

用户态的内存分配机制包括以下几个部分。

物理内存根据NUMA架构划分为节点。每个节点都分为多个区域。每个区域都分为多个页面。

物理页面是通过好友系统分配的。分配的物理页必须变成虚拟地​​址,以便上层可以访问它,并且kswapd可以根据物理页的使用情况将页面换入换出。

内存分配需求可以来自内核态或用户态。

对于内核态,当kmalloc分配大内存时,以及vmalloc分配不连续物理页时,直接伙伴系统使用内核页映射。

对于kmem_cache和kmalloc分配小内存,使用slub分配器将伙伴系统分配的大内存切割成小块进行分配。

kmem_cache和kmalloc部分不会被替换,因为这两个函数分配的内存大部分用于维护内核中的关键数据结构。内核态vmalloc分配的部分会被换出,所以打开的时候,如果发现没有,就会调用do_page_fault。

对于用户态的内存分配,可以直接调用mmap系统调用allocate,也可以调用malloc。当调用malloc时,如果分配的内存量较小,如果分配的内存量较大,则使用sys_brk系统调用。正常情况下,用户态内存是可交换的,所以当检测到内存中不存在时,就会调用do_page_fault。