当前位置: 首页 > news >正文

虚拟地址空间

1.内存布局

在语言层面的内存划分是下面这样,从系统角度理解,每个进程都是下面这样的内存分布

结合Linux内核代码

vm_area_struct组成单链表和红黑树,单链表以其地址进行排序,只有next指针,没有prev指针,如果要插入新的vm_area_struct,Linux 2.6.18/include/linux/mm.h中
代码struct vm_area_struct *prev, unsigned long addr, unsigned long end,表示通过红黑树获得要插入位置的前一个节点位置也就是prev,接着是插入的vm_area_struct开始和结束位置

函数除了堆和栈,其它区域是固定的(这个固定是相对来说的,固定是指编译时定死,而增长是指运行时动态增长),由于递归深度不同等原因导致栈运行时动态增长,malloc和free导致堆动态增长,但是栈的动态增长是连续的,而堆的动态增长是不连续的,free导致不连续,用户态的“堆”,在内核里其实不止一个VMA,而是好多个独立的vm_area_struct;glibc malloc有个规则,

  • 小内存:在主堆VMA([heap])里分配
  • 大内存(默认>128KB):不用主堆,直接mmap新开一个匿名VMA

举例,下面①②③每一块按vm_start从小到大,插进全局VMA单向链表;mmap匿名VMA是随着malloc和free动态增长和减少的,但主堆是一直存在的

下面举一个进程的例子

2.虚拟地址空间

2.1 是什么

2.2 虚拟地址空间的区域分布

2.3 页表

VA和PA的桥梁

站在系统的角度来理解一些问题

那么进程地址空间存在的意义是什么呢?
在之前,进程都是直接访问物理内存的,

  1. 现在,进程访问的都是虚拟内存,通过页表进行地址转换,而页表不仅仅是虚拟地址到物理地址的转换,包括标志位(权限),如果要写入权限为r的数据,拦截进程的非法行为,从而控制进程行为,保护物理内存
  2. 有了虚拟地址空间和页表,原则上,将进程的内存空间布局,无序(物理内存地址)变有序(虚拟地址空间),方便管理
  3. 让进程管理和内存管理,解耦合!

写时拷贝
fork创建子进程之前,系统会把父进程页表的数据属性由读写改为只读,子进程会拷贝父进程的页表(浅拷贝),接着父子进程任一方要进行写入,发现数据是只读,发生缺页中断引起内存二次申请,之后写哪一页的数据,就拷贝哪一页,并且修改该进程的页表,由只读->读写,物理内存映射关系也要变,这样内存管理和进程管理就解耦合。

  1. 在CPU和物理内存之间进行地址转换时,( )将地址从虚拟(逻辑)地址空间映射到物理地址空间
    A.TCB
    B.MMU
    C.CACHE
    D.DMA

B

  1. p和"hello,world"存储在内存哪个区域?
intmain(){char*p="hello,world";return0;}

A.栈,堆
B.栈,栈
C.堆,只读存储区
D.栈,只读存储区

D

3.一个分页存储管理系统中,地址长度为 32 位,其中页号占 8 位,则页表长度是__。
A.2的8次方
B.2的16次方
C.2的24次方
D.2的32次方

A
页表长度也就是一共有多少页

http://www.cnnetsun.cn/news/2192678.html

相关文章:

  • Switch大气层整合包终极指南:3步轻松安装+5大实用技巧
  • 从数据清洗到模型上线:一份给新手的机器学习项目避坑指南(基于真实数据集)
  • 用Gemini高效办公的5个场景:国内直接访问操作指南
  • 当ECU报故障时,系统如何“优雅降级”?深入解读AutoSar FiM的故障响应机制
  • AI驱动Excel自动化:基于COM接口的RPA技能开发与实战
  • 深入浅出:如何加快三极管开关速度(减少发热)
  • VISIONCOACH框架:视觉提示引导的强化学习视频推理
  • 告别轮询!在Linux上用select实现高效串口中断接收(附i.MX6ULL实测代码)
  • Java 函数式编程 + 循环底层彻底打通:Lambda/方法引用/迭代器/寻址方式一次吃透
  • 3步构建企业级微信自动化框架完整指南
  • 3分钟图形化教程:用TegraRcmGUI轻松解锁Switch隐藏功能
  • Refined Now Playing:5个核心功能彻底改造网易云音乐播放界面
  • 使用 OpenClaw 框架时快速接入 Taotoken 聚合 API 的步骤详解
  • MinIO视频播放报错206?别只盯着证书,可能是Nginx的‘缓冲区’在捣鬼(避坑指南)
  • 神经网络实战:ResNet 医学影像分类全流程解析
  • 使用Python和Taotoken实现一个简单的多模型自动降级调用策略
  • AutoResearch:基于LLM的自动化研究流水线架构与实战指南
  • 多模态大模型在文档智能处理中的技术实践
  • Nginx SSL证书加载失败?除了.pem,你还需要检查证书格式和权限
  • SQL视图查询结果正确性校验_对比物理表数据与视图
  • 抖音内容下载难题怎么破?douyin-downloader 批量下载神器完全指南
  • 终极指南:如何在S905L2-B电视盒上快速部署Armbian系统
  • 无监督图像编辑:基于GAN与特征解耦的创新方法
  • Y语言-Y++全中文可视化编程语言
  • 大语言模型在数学奥赛解题中的应用与实践
  • 3分钟完成B站视频转文字:bili2text完整指南
  • YimMenu终极指南:如何在GTA5在线模式中建立你的数字堡垒
  • CyberEngineTweaks架构解析:赛博朋克2077性能调优与脚本框架深度优化
  • 别再混淆了!一文讲透scATAC-seq、Bulk ATAC-seq和scRNA-seq的应用场景与选择逻辑
  • 利用 Taotoken 模型广场为 AIGC 内容生成项目挑选合适的大模型