首页 > 系统相关 >Linux 虚拟内存系统

Linux 虚拟内存系统

时间:2023-06-18 15:22:42浏览次数:49  
标签:struct area 系统 vm 虚拟地址 内核 Linux 虚拟内存

Linux 虚拟内存系统

首先,对 Linux 的虚拟内存系统做一个概述,以了解一个实际的操作系统是如何组织虚拟内存,以及如何处理缺页(page fault)的。

Linux 位为每个进程维护了一个单独的虚拟地址空间,形式如下:

wX5QUzPJ9ldhGbj

可以看到,虚拟地址空间可以分为内核虚拟内存空间和用户虚拟内存空间两部分,实际上,$64$ 位系统的虚拟空间划分是这样的:

s4AYm5iEWwjGIHP

我们可以看到,在用户内存空间和内核内存空间之间还有一大片的“未定义”的区域,这是为什么呢?(注意,后续图片将有灵魂画手出没!)。

之前我们提到,AMD 制定的 $64$ 位 CPU 架构时,虽然是 $64$ 位的,即总的虚拟地址空间是 $64$ 位的,但实际上,用到的虚拟地址其实只有其中的低 $48$ 位。

当我们把 addr_val 解释为一个虚拟地址时,我们使用的真正的虚拟地址,其实只有它的低 $48$ 位,(由 AMD 设计 CPU 架构的时候规定,其实 $48$ 位也完全够用了),后 $16$ 位的值会与 addr_val 的第 $47$ 位保持一致(全 $0$ 或者全 $1$),全 $0$ 表示该虚拟地址处于当前虚拟地址空间的用户态部分,全 $1$ 表示处于内核态部分。

换言之,虚拟地址的高 $16$ 位是由 CPU 在生成要访问的虚拟地址时,先生成低 $48$ 位的虚拟地址,再根据第 $47$ 位的值是 $0$ 还是 $1$,判断地址属于内核虚拟地址空间还是用户虚拟地址空间(或者说进程虚拟地址空间),再生成虚拟地址的高 $16$ 位。

如下图所示:

ryE1jABVRiF2UXh

Linux 虚拟内存区域(area)

Linux organizes the virtual memory as a collection of areas (also called segments). An area is a contiguous chunk of existing (allocated) virtual memory whose pages are related in some way. For example, the code segment, data segment, heap, shared library segment, and user stack are all distinct areas.

已分配的虚拟页必然存在于某个 area 中,换言之,不存在于任一 area 的虚拟页是不存在的,对应的虚拟地址是非法的!Heap 中可能存在有多个 area,这些 area 对应的 VP 都是堆上动态创建的数据的虚拟地址对应的 VP。

area 的存在,说明 Linux 系统允许虚拟地址空间有间隙,不存在的虚拟页不会占用内存、磁盘或者内核的任何额外资源。

下图是一个内核用来记录进程的虚拟内存区域的数据结构,这个数据结构存在于内核虚拟内存空间中。

meYvPuhAEjgsTKk

内核为系统中的每一个进程维护一个单独的 task_structtask_struct 中的元素包含或者指向(即为指针)内核运行该进程所需要的所有信息(例如 PID、指向用户栈的指针、可执行目标文件的名字以及程序计数器 PC 等)。

task_struct 中的一个条目指向 mm_structmm_struct 描述了该进程的当前虚拟内存的状态,mm_struct 包含 pgdmmap 两个字段,pgd 指向 PGD 的基地址,而 mmap 指向一个 vm_area_structs 的链表,该链表的每个 vm_area_struct 都描述了当前虚拟地址空间中的一个区域,一个 vm_area_struct 包含以下字段:

  • vm_start:指向该区域的起始地址(应该是虚拟地址);
  • vm_end:指向该区域的结束处的地址;
  • vm_prot:描述该区域包含的所有 VP 的读写许可权限;
  • vm_flags:描述这个区域内的页面是与其他进程共享的,还是这个进程私有的(还描述了一些其他的信息);
  • vm_next:指向链表中下一个区域结构;

到这里,我们其实可以大致猜想进程的上下文切换时会发生什么,假设单核 CPU,从进程 $1$ 切换到进程 $2$,那么内核就会将 task_struct2 的 pgd 存放在当前 CPU 的 CR3 中,同时将 CPU 的 rip 寄存器更新为 task_struct2 中的 PC。

Linux 缺页异常处理

假设 MMU 要翻译某个 vaddr,触发了一个 page fault。这个异常会导致控制转移到内核的缺页处理程序,处理程序随后会执行以下步骤:

  1. vaddr 是否合法,即 vaddr 对应的 VP 是否存在于该进程的某个 area 中?因此缺页处理程序需要搜索 vm_areas_structs 链表,把 vaddr 和每个 vm_area_structvm_startvm_end 进行比较,如果 $vm$$start \leq vaddr < vm$$end$

参考

CSAPP

yangminz: bcst_csapp

标签:struct,area,系统,vm,虚拟地址,内核,Linux,虚拟内存
From: https://www.cnblogs.com/zwyyy456/p/17489169.html

相关文章

  • linux shell 编程比较详解
    shell编程字符串比较shell中整数比较和字符串比较方法,如等于,不等于,大于,大于等于,小于,小于等于等。1、整数比较-eq等于,如if["$a"-eq"$b"]-ne不等于,如if["$a"-ne"$b"]-gt大于,如if["$a"-gt"$b"]-ge大于等于,如if["$a"-ge"......
  • 【简介】一个捕捉Linux系统事件工具:systemtap
    SystemTap于2005年出初版,已经历尽了5年多的发展,是一个相对成熟的工具。它可以用来捕捉Linux系统事件,例如:系统调用,jiffies的搏动,对proc文件系统的读写事件,对ext3的读写事件等等。 用户使用systemtap特有的脚本语言编写事件处理函数,systemtap将这些脚本进行编译转化成内核模块并插......
  • 联想ThinkPad E580 设置U盘启动教程,重装系统
    肖慧联想E580电脑无法使用启动盘启动参考:https://www.chongzhuangxitong.com/20181025/1278.html......
  • 系统架构设计师笔记第18期:NoSQL数据库
    NoSQL数据库通常指非关系型数据库,是一种基于数据键值对存储、高度分布式、支持动态查询的数据管理系统。NoSQL数据库的设计目的是为了解决传统关系型数据库无法处理的大型应用程序的数据存储和管理问题。它们通常具有以下特点:灵活性:NoSQL数据库没有固定的表结构和查询语言,允许在......
  • 记一次 .NET 某药材管理系统 卡死分析
    一:背景1.讲故事前段时间有位朋友找到我,说他们在查询报表的时候发现程序的稳定性会受到影响,但服务器的内存,CPU都是正常的,让我帮忙看下怎么回事,问了下程序的稳定性指的是什么?指的是卡死,那既然是卡死,就抓一个卡死的dump吧。二:Windbg分析1.当前是什么程序不同的程序类型分析卡死的思......
  • 选课系统项目工程
    选课系统项目工程git:选课系统:用面向对象方法写的一个选课系统1.0版本,仍有很多bug待调教!(gitee.com)【一】项目需求-角色:-学校-学员-课程-讲师-功能需求-创建学校地点---->北京/上海-管理员功能创建学校......
  • archLinux grub 双系统引导
    1安装grub、efibootmgr和os-prober##安装grub,efibootmgr,os-probersudopacman-Sgrubefibootmgros-prober##安装grub到boot文件夹中。uefi启动grub-install--target=x86_64-efi--efi-directory=/boot--bootloader-id=GRUB##非uefi启动grub-install--target=i......
  • Target: arm-none-linux-gnueabi
    [root@localhostsoftware]#whicharm-linux-gcc/usr/local/arm/4.3.2/bin/arm-linux-gcc[root@localhostsoftware]#arm-linux-gcc-Varm-none-linux-gnueabi-gcc:'-V'mustcomeatthestartofthecommandline[root@localhostsoftware]#......
  • 操作系统(5.2.1)--请求分页的硬件支持
    内存、外存、页表机制、缺页中断机构、地址变换机构1.页表机制在请求分页系统中所需要的主要数据结构是页表。为支持请求分页,须在页表中再增加若干项,供程序(数据)在换进、换出时参考。在请求分页系统中的每个页表项如下所示:现对其中各字段说明如下:(1)状态位P:用于指示该页是否已......
  • Linux的文件系统及文件缓存
    文件系统的特点文件系统要有严格的组织形式,使得文件能够以块为单位进行存储。文件系统中也要有索引区,用来方便查找一个文件分成的多个块都存放在了什么位置。如果文件系统中有的文件是热点文件,近期经常被读取和写入,文件系统应该有缓存层。文件应该用文件夹的形式组织起来,方便管理和......