操作系统——段页式内存管理、Linux内存管理

前言

紧跟着上一篇文章,讲完段式和页式内存管理后,本文来说明段页式内存管理和Linux下内存管理。
上篇文章:【点此查看】

段页式内存管理

内存分段和内存分页并不是对立的,它们是可以组合起来在同一个系统中使用的,那么组合起来后,通常称为段页式内存管理

段页式内存管理实现的方式:

  1. 先将程序划分为多个有逻辑意义的段,也就是前面提到的分段机制;
  2. 接着再把每个段划分为多个页,也就是对分段划分出来的连续空间,再划分固定大小的页;

用于段页式地址变换的数据结构是每一个程序一张段表,每个段又建立一张页表,段表中的地址是页表的起始地址,而页表中的地址则为某页的物理页号,如图所示:

在这里插入图片描述

段页式地址变换中要得到物理地址须经过三次内存访问:

  1. 访问段表,得到页表起始地址;
  2. 访问页表,得到物理页号;
  3. 将物理页号与页内位移组合,得到物理地址。

可用软、硬件相结合的方法实现段页式地址变换,这样虽然增加了硬件成本和系统开销,但提高了内存的利用率。

Linux内存管理

Linux 内存主要采用的是页式内存管理,但同时也不可避免地涉及了段机制。

Linux 系统中的每个段都是从 0 地址开始的整个 4GB 虚拟空间(32 位环境下),也就是所有的段的起始地址都是一样的。这意味着,Linux 系统中的代码,包括操作系统本身的代码和应用程序代码,所面对的地址空间都是线性地址空间(虚拟地址),这种做法相当于屏蔽了处理器中的逻辑地址概念,段只被用于访问控制和内存保护。

内存分布简图

在Linux操作系统中,虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同位数的系统,地址空间的范围也不同。

在这里插入图片描述

内核空间与用户空间的区别

  1. 进程在用户态时,只能访问用户空间内存;
  2. 只有进入内核态后,才可以访问内核空间的内存;

虽然每个进程都各自有独立的虚拟内存,但是每个虚拟内存中的内核地址,其实关联的都是相同的物理内存。这样,进程切换到内核态后,就可以很方便地访问内核空间内存。

在这里插入图片描述

虚拟空间划分情况

以32位系统为例:

在这里插入图片描述

  1. 程序文件段(.text),包括二进制可执行代码;
  2. 已初始化数据段(.data),包括静态常量;
  3. 未初始化数据段(.bss),包括未初始化的静态变量;
  4. 堆段,包括动态分配的内存,从低地址开始向上增长;
  5. 文件映射段,包括动态库、共享内存等,从低地址开始向上增长(跟硬件和内核版本有关 (opens new window));
  6. 栈段,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 10MB。当然系统也提供了参数,以便我们自定义大小;

虚拟内存的内核数据结构图示

Linux将虚拟内存组织成一些区域(叫做段)的集合。一个区域(area)就是已经存在着的(已分配的)虚拟内存的连续篇片(chunk),这些页是以某种方式相关联的。

内核为系统中每一个进程维护一个单独的任务结构(源代码中的task_struct)。任务结构中的元素包含或者指向内核运行该进程所需要的所有信息(PID、指向用户栈的指针、可执行目标文件的名字,以及程序计数器)。

图示:

在这里插入图片描述

任务结构中的一个条目指向mm_struct,它描述了虚拟内存的当前状态。

其中pgd指向第一级页表(页全局目录)的基址,而mmap指向一个vm_area_structs(区域结构)的链表,其中每个vm_area_structs都描述了当前虚拟地址空间的一个区域。当内核运行这个进程时,就将pgd存放在CR3控制寄存器内。

一个区域的区域结构包含以下字段:

  1. vm_start:指向这个区域的起始处。
  2. vm_end:指向这个区域的结束处。
  3. vm_prot:描述这个区域内包含的所有页的读写许可权限。
  4. vm_flags:描述这个区域内的页面是与其他进程共享的,还是这个进程私有的(还是描述了一些其他信息)。
  5. vm_next:指向链表中的下一个区域结构。

待续。。。

参考自

《深入理解计算机系统》
《小林coding》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_索伦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值