<Linux>(极简关键、省时省力)《Linux操作系统原理分析之linux存储管理(3)》(19)

本文主要是介绍<Linux>(极简关键、省时省力)《Linux操作系统原理分析之linux存储管理(3)》(19),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Linux操作系统原理分析之linux存储管理(3)》(19)

  • 6 Linux存储管理
    • 6.4 Linux 的分段和分页结构
      • 6.4.1Linux 的分段结构
      • 6.4.2 Linux 的三级分页结构
      • 6.4.3 内核页表和进程页表

6 Linux存储管理

6.4 Linux 的分段和分页结构

本节主要内容 Linux 运行在 80x86 上时,其内核如何利用硬件机制实现对存储空间的分段分页管理。

6.4.1Linux 的分段结构

  1. 用户区和内核区
    80x86 的分段机制把 64T 的虚拟地址空间分为最大长度为 4G 的线性地址空间。Linux 把每个线性地址空间提供给一个进程使用,所以每个线性地址空间就是用户的虚拟内存空间。在一个进程的线性地址空间中包含若干全局段和局部段。

👉内核代码段和内核数据段:由于对一个进程而言,只有它的虚拟存储空间是可见的。因此为了操作系统功能,系统内核必须包括在进程的虚拟地址空间中。Linux 把内核的代码和数据映射到线性地址空间的全局段中,它们就形成了内核代码段和内核数据段。
👉用户代码段和用户数据段:进程本身的代码和数据映射到进程线性地址空间的局部段,形成用户代码段和用户数据段。

为了保护内核,linux 把虚拟内存分成两部分:

👉内核区:包括内核代码段和内核数据段、内核使用的堆栈、全局数据结构。
👉用户区:包括用户代码段和用户数据段、进程堆栈、进程数据结构等

在 80x86 上 linux 进程虚拟空间中:

👉用户区:地址从 0x00000000~0xbfffffff,其大小为 3G;
👉内核区:地址从 0xc0000000~0xffffffff,其大小为 1G;

说明: 由于对每个进程而言,只有它的虚拟存储空间是可见的,而且每个进程的虚拟存储空间都是从 0 开始的相对地址空间,所以从系统角度看,每个进程在虚拟空间中的内核区和用户区的分布是相同的。

在这里插入图片描述
2. GDT
由于大部分进程都只有一个代码段和一个数据段,为了提高地址映射速度,从 linux2.2 开始,把进程的一个代码段和一个数据段的描述符放到了 GDT 中,这样就可以直接从 GDT 中取得描述符,而不必再通过 GDT 访问 LDT。只有进程需要建立更多段时,才把它们的描述符放到 LDT 中。在 linux 内核 2.2 的 arch/i386/kernel/head.s 文件中定义了 GDT 的内容。
在这里插入图片描述

6.4.2 Linux 的三级分页结构

  1. Linux 的三级分页结构
    Linux 在 80x86 机器平台运行时,因为 80x86 是 32 位的,所以 采用两级分页结构就可以有效地节省内存空间。但是如果 Linux 运行在 64 位机器平台时,如 Alpha 等,地址总线 64 位,寻址更大空间,此时二级页表将出现页表目录过大的问题。为此,64 位机器的分页机制提供的是三级分页结构。Linux 运行在 64 位机器平台时也采用三级分页结构。
页目录:PGD(page directory)
页中间目录:PMD(page Middle directory)
页表:PTE(page table)

地址结构,以 alpha 机器为例:
在这里插入图片描述
在这里插入图片描述
2. linux 与硬件无关的分页机构
linux 提供了与硬件无关的分页机构。所谓与硬件无关是指这种分页结构仅是一种存储管理模型。当linux 运行在某种机器时,通过对存储管理模型有关参数的设置来适应机器的硬件。Linux 内核提供的与硬件无关的分页机构是三级分页存储管理模型。
Linux 内核把三级分页存储管理模型转换为两级分页结构的具体做法是:把三级分页存储管理模型的页中间目录域长度定义为 0。同时定义中间目录表只有一个表项。在 linux 源代码文件的/include/asmi386/pgtable.h 中有如下定义:

#define PTRS_PER_PTE 1024
#define PTRS_PER_PMD 1
#define PTRS_PER_PGD 1024
  1. Linux 页面大小
    Linux 中页面的尺寸由宏定义的符号常量 PAGE_SIZE 指定,在 80x86 机器中页面长度为 4KB,定义在 include/asm-i386/page.h 中:
#define PAGE_SHIFT 12
#define PAGE_SIZE (1UL<< PAGE_SHIFT) /*把 1 左移 12 位,即 4K*/
在 alpha 等 64 位机中,页面大小为 8K,定义在相应的 page.h 中:
#define PAGE_SHIFT 13
#define PAGE_SIZE (1UL<< PAGE_SHIFT) /*把 1 左移 13 位,即 8K*/

6.4.3 内核页表和进程页表

  1. CR3 控制寄存器
    进程切换时,linux 要重新设置 CR3 控制寄存器,使它指向新进程的页目录表。该任务由内核的汇编语言函数 startup_32()完成。

  2. 页目录表
    linux 内核为了配合硬件分页机制设置了相应的数据结构,其中页目录表定义为一个具有 1024 个元素
    的数组:

Pgd_t swapper_pg_dir[1024] /*每个元素指向一个页表*/
  1. 内核页表和进程页表 内核页表和进程页表
    内核区和用户区的分界地址由符号常量 PAGE_OFFSET 确定,如 80x86 中 PAGE_OFFSET 的值是0xc0000000(3G)。所以此时页目录表的钱 768 个表项对应用户区,后 256 项对应内核区(所有进程的内核 表项 完 全 相 同 ) 。 在 linux 内 核 中 使 用 paging_init() 函 数 对 页 目 录 表 进 行 初 始 化 , 它 定 义 在arch/i386/mm/init.c 中。

这篇关于<Linux>(极简关键、省时省力)《Linux操作系统原理分析之linux存储管理(3)》(19)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/453312

相关文章

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin