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

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

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

相关文章

微服务实战系列之Redis

前言 云淡天高&#xff0c;落木萧萧&#xff0c;一阵西北风掠过&#xff0c;似寒刀。冬天渐渐变得更名副其实了&#xff0c;“暖冬”的说法有点言过其实了。——碎碎念 微服务实战系列之Cache微服务实战系列之Nginx&#xff08;技巧篇&#xff09;微服务实战系列之Nginx微服务实…

28.BeanDefinition的加载过程

BeanDefinition的加载过程 BeanDefinition的加载过程就是将 概念态的Bean注册为定义态的Bean 不同的Spring上下文会有不同的注册过程,但是会用共同的api步骤: 通过BeanDefinitionReader 将配置类(AnnotatedBeanDefinitionReader)(xml文件:XmlBeanDefinitionReader) 注 册为…

多屏模式输入法可以正确切换屏幕展示原理剖析

背景 hi&#xff0c;粉丝朋友们&#xff1a; 近期有个学员问到了一个输入法相关问题。刚好梳理了一下输入法相关的在多屏模式的一个展示流程&#xff0c;这里做个记录&#xff0c;也相当于深入理解窗口相关的一篇干货blog。 如上面两幅图展示&#xff0c;输入法可以自由自在显…

(C++20) constinit常量初始化

文章目录 由来constinit 常量初始化常量初始化 ! 初始化常量初始化声明静态存储对象非初始化声明thread_local END 由来 在C多文件编译中会出现一个常见的问题&#xff0c;叫做静态初始化顺序问题。Static Initialization Order Fiasco。 比如现在有两个文件&#xff0c;其中…

[C++] new和delete

使用new时调用构造函数使用delete时调用析构函数 构造函数 使用new动态分配内存时&#xff0c;如果分配的是基本类型的内存&#xff0c;则不会调用构造函数。如果分配的是自定义类型的内存&#xff0c;则会调用构造函数进行对象的初始化。 例如&#xff1a; int* pInt new…

谁登榜? 2023数据安全平台神兽企业

在数字经济的浪潮中&#xff0c;数据安全已成为企业发展的关键支撑。2023年8月&#xff0c;CSA大中华区启动数据安全平台神兽企业调研&#xff0c;得到了众多网络安全综合厂商、数据安全专业厂商、云服务提供商、用户单位的广泛关注和积极参与。 历时4个月&#xff0c;CSA大中…

Java 线程池到底是如何复用线程的

原理概述 其实 Java 线程池的实现原理很简单&#xff0c;说白了就是一个线程集合 workerSet 和一个阻塞队列 workQueue。 当用户向线程池提交一个任务时&#xff0c;线程池会先将任务放入 workQueue 中。workerSet 中的线程会不断的从 workQueue 中获取线程然后执行。当 work…

macos安装metal 加速版 pytorch

categories: [Python] tags: Python MacOS 写在前面 试试 m3 的 metal 加速效果如何 Mac computers with Apple silicon or AMD GPUsmacOS 12.3 or laterPython 3.7 or laterXcode command-line tools: xcode-select --install 安装 Python: conda-forge brew install minif…

多人聊天Java

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{ public static ServerSocket server_socket; public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []ar…

GO设计模式——1、简单工厂模式(创建型)

目录 简单工厂模式&#xff08;Simple Factory Pattern&#xff09; 简单工厂模式的核心角色 优缺点 代码实现 简单工厂模式&#xff08;Simple Factory Pattern&#xff09; 简单工厂模式又称为静态工厂方法(Static Factory Method)模式。在简单工厂模式中&#xff0c;可以…

性能调优入门

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、性能定律和数理基础 1.三个定律法则 (1)帕累托法则 我它也被称为 80/20 法则、关键少数法则&#xff0c;或者八二法则。人们在生活中发现很多…

Ubuntur编译ROS报错:error PCL requires C++14 or above

ubuntu20.04 编译ROS包 报错&#xff1a; error&#xff1a; PCL requires C14 or above&#xff1a; 修改Cmakelists.txt文件&#xff1a; set&#xff08;CMAKE_CXX_STANDARD 14&#xff09; 再次编译成功.

用 Bytebase 做数据库 schema 迁移

数据库 schema 迁移指修改管理数据库结构的变更&#xff0c;包括为数据库添加视图或表、更改字段类型或定义新约束。Bytebase 提供了可视化 GUI 方便迁移数据库 schema&#xff0c;本教程将展示如何使用 Bytebase 为 schema 迁移配上 SQL 审核&#xff0c;自定义审批流&#xf…

Linux: sudo: unable to execute /opt/sbin/adm: No such file or directory

sudo: unable to execute /opt/sbin/adm: No such file or directory 这个错误有可能的原因是,sudo的设置里权限配置不对。 比如其他用户不应该有可执行权限,但是这个命令有,就不让执行。 但是这个错误提示有点让人迷惑,可能也是故意的。 另一个原因是:https://mzhan017…

HashMap和Hashtable的区别

一、简介 HashMap: 1、HashMap是非线程安全的&#xff0c;只是用于单线程环境下&#xff0c;多线程环境下可以采用concurrent并发包下的concurrentHashMap。 2、HashMap 实现了Serializable接口&#xff0c;因此它支持序列化&#xff0c;实现了Cloneable接口&#xff0c;能被…

改造python3中的http.server为简单的文件上传下载服务

改造 修改python3中的http.server.SimpleHTTPRequestHandler&#xff0c;实现简单的文件上传下载服务 simple_http_file_server.py&#xff1a; # !/usr/bin/env python3import datetime import email import html import http.server import io import mimetypes import os …

UDP协议实现群聊

服务端 package ydd;import java.io.*; import java.net.*; import java.util.ArrayList; public class A2{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []a…

【C++】如何优雅地把二维数组初始化为0

2023年12月7日&#xff0c;周四上午 目录 为什么要初始化二维数组不优雅的初始化方式&#xff1a;使用两个for循环优雅的初始化方式一&#xff1a;使用初始化列表优雅的初始化方式二&#xff1a;使用memset函数 为什么要初始化二维数组 如果不初始化二维数组&#xff0c;那么…

点评项目——短信登陆模块

2023.12.6 短信登陆如果基于session来实现&#xff0c;会存在session共享问题&#xff1a;多台Tomcat不能共享session存储空间&#xff0c;这会导致当请求切换到不同服务器时出现数据丢失的问题。 早期的解决办法是让session提供一个数据拷贝的功能&#xff0c;即让各个Tomcat的…

【Python】流畅!一个非常好用的网络数据采集工具!

文章目录 前言一、注册二、初窥三 数据集四 自定义网站网络爬虫总结 前言 你是否曾为获取重要数据而感到困扰&#xff1f;是否因为数据封锁而无法获取所需信息&#xff1f;是否因为数据格式混乱而头疼&#xff1f;现在&#xff0c;所有这些问题都可以迎刃而解。让我为大家介绍…