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

news2024/11/15 11:01:44

《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 中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1284995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【滑动窗口】LeetCode2953:统计完全子字符串

作者推荐 [二分查找]LeetCode2040:两个有序数组的第 K 小乘积 本题其它解法 【离散差分】LeetCode2953:统计完全子字符串 题目 给你一个字符串 word 和一个整数 k 。 如果 word 的一个子字符串 s 满足以下条件&#xff0c;我们称它是 完全字符串&#xff1a; s 中每个字符…

014 OpenCV canny边缘检测

一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、canny原理 OpenCV中的Canny边缘检测算法是一种基于图像处理的计算机视觉技术&#xff0c;主要用于检测图像中的边缘。Canny边缘检测算法的原理是通过计算图像中像素点之间的梯度值来…

导入JDBC元数据到Apache Atlas

前言 前期实现了导入MySQL元数据到Apache Atlas, 由于是初步版本&#xff0c;且功能参照Atlas Hive Hook&#xff0c;实现的不够完美 本期对功能进行改进&#xff0c;实现了导入多种关系型数据库元数据到Apache Atlas 数据库schema与catalog 按照SQL标准的解释&#xff0c;…

【Latex笔记】标题页

整体结构 模板结构如下&#xff1a; \documentclass{book} % 导言区&#xff0c;加载宏包和各项设置&#xff0c;包括参考文献、索引等 \usepackage{makeidx} % 调用makeidx 宏包&#xff0c;用来处理索引 \makeindex % 开启索引的收集 \bibliographystyle{plain} % 指定参考…

OpenCV-Python:图像卷积操作

目录 1.图像卷积定义 2.图像卷积实现步骤 3.卷积函数 4.卷积知识考点 5.代码操作及演示 1.图像卷积定义 图像卷积是图像处理中的一种常用操作&#xff0c;主要用于图像的平滑、锐化、边缘检测等任务。它可以通过滑动一个卷积核&#xff08;也称为滤波器&#xff09;在图像…

【C/PTA —— 14.结构体1(课内实践)】

C/PTA —— 14.结构体1&#xff08;课内实践&#xff09; 6-1 计算两个复数之积6-2 结构体数组中查找指定编号人员6-3 综合成绩6-4 结构体数组按总分排序 6-1 计算两个复数之积 struct complex multiply(struct complex x, struct complex y) {struct complex product;product.…

Shopify二次开发之三:liquid语法学习(Tags)

目录 Tags 变量声明 assign capture decrement increment 条件语句 if else unless case HTML form表单生成 style Iteration (遍历) for else break continue cycle paginate Theme &#xff08;主题&#xff09; render渲染一个snippet&#xff0c;可…

用友NC word.docx接口存在任意文件读取漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、产品介绍 用友 NC Cloud&#xff0c;大型企业数字化平台&#xff…

MySQL笔记-第04章_运算符

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第04章_运算符1. 算术运算符2. 比较运算符3. 逻辑运算符4. 位运算符5. 运算符的优先级拓展&#xff1a;使用正则表达式查询 第04章_运算符 …

轻量封装WebGPU渲染系统示例<43>- PBR材质与阴影实(源码)

原理简介: 1. 基于rendering pass graph实现。 2. WGSL Shader 基于文件系统和宏机制动态组装。 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/PBRShadowTest.ts 当前示例运行效果: 此示例基于此渲染系统实现&a…

【Windows】使用SeaFile搭建本地私有云盘并结合内网穿透实现远程访问

1. 前言 现在我们身边的只能设备越来越多&#xff0c;各种智能手机、平板、智能手表和数码相机充斥身边&#xff0c;需要存储的数据也越来越大&#xff0c;一张手机拍摄的照片都可能有十多M&#xff0c;电影和视频更是按G计算。而智能设备的存储空间也用的捉襟见肘。能存储大量…

探索CSS:从入门到精通Web开发(二)

前言 当我们谈论网页设计和开发时&#xff0c;CSS&#xff08;层叠样式表&#xff09;无疑是其中的重要一环。作为HTML的伴侣&#xff0c;CSS赋予网页以丰富的样式和布局&#xff0c;使得网站看起来更加吸引人并且具备更好的可读性。本书将通过一系列深入浅出的方式&#xff0…

Java多线程 - 黑马教程

文章目录 Java 多线程一、多线程概述二、 多线程创建方式1、继承 Thread 类创建线程2、实现 Runnable 接口3、实现 Callable 接口三、Thread 常用的方法四、线程安全什么是线程安全问题?线程安全问题出现的原因程序模拟线程安全五、线程同步线程同步方式1:同步代码块线程同步…

GPIO的使用--时钟使能含义--代码封装

目录 一、时钟使能的含义 1.为什么要时钟使能&#xff1f; 2.什么是时钟使能&#xff1f; 3.GPIO的使能信号&#xff1f; 二、代码封装 1.封装前完整代码 2.封装结构 封装后代码 led.c led.h key.c key.h main.c 一、时钟使能的含义 1.为什么要时钟使能&#xff1f…

关于如何解决问题?代码习惯。

警钟长鸣 从师哥身上学到的东西&#xff1a; 关于如何解决问题&#xff1f; 1、沟通&#xff1a;有效的沟通&#xff0c;将问题描述清楚&#xff0c;让老师和师哥明白你出了什么问题&#xff0c;给出建议&#xff0c;很多时候一句良言胜过自己摸索很久 2、出现问题由浅入深地…

国标GB28181安防监控平台EasyCVR录像时间轴优化步骤

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

Linux系统上RabbitMQ安装教程

一、安装前环境准备 Linux&#xff1a;CentOS 7.9 RabbitMQ Erlang 1、系统内须有C等基本工具 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel tk tc xz socat2、下载安装包 1&#xff09;首先&a…

Harmony Ble蓝牙App(三)特性和属性

Ble蓝牙App&#xff08;三&#xff09;特性使用 前言正文一、获取属性列表二、属性提供者三、获取特性名称四、特性提供者五、加载特性六、源码 前言 在上一篇中我们完成了连接和发现服务两个动作&#xff0c;那么再发现服务之后要做什么呢&#xff1f;发现服务只是让你知道设备…

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

《Linux操作系统原理分析之linux存储管理&#xff08;5&#xff09;》&#xff08;21&#xff09; 6 Linux存储管理6.6 Linux 物理空间管理6.6.1 Linux 物理内存空间6.6.2 物理页面的管理6.6.3 空闲页面管理——buddy 算法 6.7 内存的分配与释放6.7.1 物理内存分配的数据结构 6…