首页 > 系统相关 >linux之页表详解(千字详解)

linux之页表详解(千字详解)

时间:2024-01-12 10:31:32浏览次数:35  
标签:虚拟地址 物理地址 地址 详解 页表 linux 进程 权限 千字

linux之页表详解

页表的详解

在进程地址空间与物理内存之间,就是通过页表来进行映射关联的!

==而页表的功能也不仅仅是简简单单的映射!如下图!==

image-20230808201147808

例如:是否命中,进程关于这个内存的读写权限,是用户的还是内核的!等等

这样子我们就能理解

char * str = "hello world";
*str = 'H';

这个代码会在==运行的时候==就会报错!——在知道页表之前我们一般都会解释说是因为这个字符串常量放在了常量区所以不能修改!

==但是现在有了页表我们就能解释了!凭什么在常量区,就不能写入修改呢?==

因为当我们进行解引用的时候其实就是要去找到它的起始地址,然后进行修改!

而要修改就要有虚拟地址和物理地址的转换!当转换的时候,会去查页表,然后去查看其RWX权限,然后发现只有R权限!但是我们是要进行写操作的!所以此时地址转换单元(MMU)就会将当前的访问行为终止——通过向硬件报错的方式,然后操作系统就会通过发送信号的方式,发送给进程!进程收到喜欢之后就要在而合适的时候去捕抓信号,因为信号的默认行为一般是终止,所以进程就被终止了!

页表还分为内核级页表和用户级页表!——通过U/K权限来进行区分!U权限就是用户级(User)页表,K权限就是内核级(Kernel)页表

==我们该如何的去看待资源和页表呢?==

地址空间是进程能看到的资源窗口——诸如:栈区,堆区,内核区,初始化,未初始化数据都是在进程地址空间看到的!所以才说是一个资源窗口!

页表决定,进程真正拥有资源的情况!——因为进程自己认为自己拥有的是整个操作系统的所有资源!但是其实不是!

合理的对地址空间和页表进行资源划分,我们就可以一个进程所有的资源进行分类

==页表是如何将虚拟地址转化为物理地址的呢?==

页表是通过将虚拟地址和物理地址映射,然后查表来完成的!那么它是如何进行查表的呢

image-20230809101157191

首先我们要明白一一页表到底有多大!

虚似地址空间(32位下)一共有2^32个地址!

如果真的是有2^32^个地址!一那么虚拟地址空间也应该有 2^32^个条目!因为我们的每一个地址都要有个条目来映射而且每一个条目都要有很多的属性

我们假设每一个条目有6字节(物理地址+WRX权限+U/K权限+是否命中)

这样的话光是页表就有24GB的空间!——==这是不太可能的!==

==所以我们必须意识到页表不止有一张!==

image-20230809102417610

红色的1—4就是虚拟地址转化为物理地址的全部流程!

通过前10个地址去页目录里面找对应的页表!然后通过第二个10位的地址,找页表里面存的页框的真实的物理地址的起始地址!!

最后通过虚拟地址的最后12位作为偏移量!——找到了这个物理地址!

我们将地址拆分成10,10,12位单位后!有可能我们一个进程运行的时 候,只使用了一个页目录和几个页表!剩下的不使用就不用加载到内存里面!只有需要的时候才要进行创建,而且哪怕把全部的地址加载进来,也不会很大!因为我们页表只索引到了页框的起始地址!整个页表的条目个数也就是4GB/4KB = 2^20^个目录,后面的12位只是作为偏移量没有创建映射关系,这样子总共就是2^20个(这样子计算下来按照一个地址一个字节来计算,总的也就1m的大小!加上各种属性,也就几mb!)

==这样子大大的减少页表占用过大的内存空间,导致了内存空间不足的问题了!==

标签:虚拟地址,物理地址,地址,详解,页表,linux,进程,权限,千字
From: https://blog.51cto.com/u_15835985/9211594

相关文章

  • linux修改rocketmq的日志文件位置
    ......
  • Ansible - 配置文件详解
      主配置文件ansible.cfg修改sudo相关配置,在实际工作中,可能使用ansible时,所使用的用户并不是root用户,而是管理员给的一个普通用户,所以需要考虑ansible相关配置文件需要怎么写才能支持日常工作。[defaults]inventory=~/ansible/hostsremote_user=alice#以什......
  • Linux系统中grep如何使用?
    在Linux中,grep是一个非常常见和重要的工具,是每一个专业运维工程师必须掌握的命令,因为通过它可以快速地查找和过滤文件中的内容,那么Linux系统中grep如何使用?下面是常见用法介绍,一起来看看吧。1、基本用法grep命令的基本用法是在文件中查找包含指定模式的行。例如,要在文......
  • Day48 构造器详解
    构造器详解类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下俩个特点:1.必须和类的名字相同2.必须没有返回类型,也不能写void构造器必须要掌握1.Person.class文件与Person.java文件进行对比在idea的out文件夹下面打开同名的class文......
  • linux安装jdk 并配置环境变量
    1、先到jdk官网中下载指定版本的jdk。2、将JDK的压缩包上传至linux3、通过命令解压JDK压缩包#先解压tar-zxvfjdk-8u181-linux-x64.tar.gz-C/usr/local#然后重命名,这个看自己cd/usr/localmv./jdk1.8.0_181/./jdk1.84、配置环境变......
  • Linux网卡名称命名
    CentOS7服务器,默认网卡名为ifcfg-eno16777736,如果我们想改成ifcfg-eth0,使用如下步骤即可:(1)编辑/etc/sysconfig/grub文件,命令为vi/etc/sysconfig/grub,在倒数第二行quiet后加入如下代码,并如图所示:(2)执行命令grub2-mkconfig-o/boot/grub2/grub.cfg,生成新的grub.cfg文件,如图所示......
  • Jenkins简介及安装配置详解:开启持续集成之旅
    Jenkins简介及安装配置详解:开启持续集成之旅一、Jenkins介绍Jenkins是一个开源的、用Java编写的持续集成和持续交付(CI/CD)工具。它提供了一种简单易用的方式来自动化构建、测试和部署软件。Jenkins的主要目标是帮助开发团队加快软件开发过程,提高软件质量,并通过自动化流程减......
  • vmware扩容/新增linux磁盘后,不重启识别
    根据别的[root@localhostscsi_disk]#ls博主做一下方法记录1、vmware扩展/扩容磁盘后,不想重启识别,可以用下面方法:1.1echo1>/sys/class/scsi_device/device/rescan[root@localhost~]#cd/sys/class/scsi_disk/[root@localhostscsi_disk]#ls0:0:0:0[root@localhosts......
  • linux和window下用资源管理器打开文件所在文件夹并选中文件
    1.应用场景软件中需要定位到软件打开的文件,例如视频或者图片。用户可以方便的去通过软件去找到系统的文件; 2.解决方法window系统如果文件夹已经被打开,而且是最大化状态,文件夹中文件特别多时无法选中文件,window系统会记住用户最大化文件夹的状态,导致无法定位到文件夹,这好像是......
  • 全网最详细的线程池 ThreadPoolExecutor 详解,建议收藏!
    一、ThreadPoolExecutor类讲解1、线程池状态:五种状态:线程池的shutdown()方法,将线程池由RUNNING(运行状态)转换为SHUTDOWN状态线程池的shutdownNow()方法,将线程池由RUNNING或SHUTDOWN状态转换为STOP状态。注:SHUTDOWN状态和STOP状态先会转变为TIDYING状态,最终......