展开

关键词

内核必须懂(七): Linux(x64)

目录 前言Intel四实操寻址获取cr3获取PGD获取PUD获取PMD获取PTE获取内容最后----前言 Linux的作用主要就是地址映射, 将逻辑地址映射到物理地址. ----Intel 四 其实很多设计的根源或者说原因都来自于CPU的设计, OS很多时候都是辅助CPU. Linux的四就是依据CPU的四来设计的. 这里主要说的就是Intel x64面大小为4KB的情况, 如图所示: ? 当然, 你可以用指令确认下: getconf PAGE_SIZE ? 在Linux当中, 第一称为PGD, 当然是有历史原因的, 可以自行google. 所以Linux的四分别是PGD -> PUD -> PMD -> PTE. ? 也就是76755067, 然后后面的12-bits是面属性.

3.7K40

Linux-3.14.12内存管理笔记【建立内核3

前面已经分析了内核的准备工作以及内核低端内存的建立,接着回到init_mem_mapping()中,低端内存建立后紧随着还有一个函数early_ioremap_page_table_range_init ,则把其pte的内容拷贝到page_table_range_init()申请的空间中,并将newpte新的地址设置到pmd中(32bit系统实际上就是全局目录),然后调用__flush_tlb_all 为了避免前期可能对固定映射区已经分配了项,基于临时内核映射区间要求连续性的保证,所以在此重新申请连续的空间将原内容拷贝至此。 值得注意的是,与低端内存的初始化不同的是,这里的只是被分配,相应的PTE项并未初始化,这个工作将会交由以后各个固定映射区部分的相关代码调用set_fixmap()来将相关的固定映射区与物理内存关联 至此,内核建立完毕。

37210
  • 广告
    关闭

    云产品限时秒杀

    云服务器1核2G首年38元,还有多款热门云产品满足您的上云需求

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    的好处

    ,如果只使用了一个,一个项的大小为4byte,32位系统有4GB的物理空间(一个进程看到是4GB大小的虚拟空间),每一个项对应着物理空间的第xxx(4KB大小的),那么应该有4GB4KB=1MB 如果是二,规则就会改变,让二对应到物理内存上的4KB大小的,一此时变成映射为物理地址的4MB(这样子是无法定位到具体的(4KB)的,所以二再去找),这样先找到一,一再和二进行结合 ,二相当于一4MB分成了1024个(1KB个)4KB,找完后二充当了offset的角色,此时定位到具体的4KB的面,再用一的offset一结合定位到具体物理地址。 这样一个进程浪费掉的空间是一占用的:(4GB4MB)*4byte=4KB,二浪费掉的是1kb(1个一占用这么多)*1kb(此时有1kb(4GB4MB)个一)=4MB,加起来是4MB +4KB,比光用一要多4KB,但是2是可以不存在的,比如此时程序只用了%20的,那么4MB就需要乘以%20,这样一下子就比只有一时少了。

    9030

    Linux 初始化检查列3

    29060.498313 sec# date Tue Mar 29 16:07:13 CST 2016# chkconfig --list | grep ntp ntpd 0:off 1:off 2:off 3: off 4:off 5:off 6:offntpdate 0:off 1:off 2:off 3:off 4:off 5:off 6:off# chkconfig ntpd on # etcinit.dntpd startStarting ntpd: # chkconfig --list | grep ntp ntpd 0:off 1:off 2:on 3:on 4:on 5:on 6:offntpdate 0:off 1:off 2:off 3:off 4:off 5:off 6:off# ----安全更改root口令云主机服务商提供了初始登录密码,但显然不是一个安全的密码,需要进行修改# passwdChanging ACCEPT all -- lo * 0.0.0.00 0.0.0.00 2 120 ACCEPT tcp -- * * 0.0.0.00 0.0.0.00 state NEW tcp dpt:22 3

    7730

    Linux机制之概述--Linux内存管理(六)

    3,在代码管理上肯定不方便。 巧妙的是,Linux采取了一种抽象方法:所有架构全部使用3: 即PGD -> PMD -> PTE。那只使用2(如非PAE的X86)怎么办? 3.4 Linux的四硬件在发展,3很快又捉襟见肘了,原因是64位CPU出现了, 比如X86_64, 它的硬件是实实在在支持4的。它支持48位的虚拟地址空间1。 Linux内核针为使用原来的3(PGD->PMD->PTE),做了折衷。 对于仍使用3目录的架构来说,它们依然拥有一个虚拟的PML4,相关的代码会在编译时被优化掉。 这样,就把Linux内核的3扩充为4

    2.8K20

    Python 高特性(3)- 列生成式

    应该非常熟悉了,它可以生成一个迭代对象,然后可以使用 list() 将它转成一个 list# 判断是不是迭代对象print(isinstance(range(0, 10), Iterable)) # 生成列lists 当你不会列生成式前就是用循环res = 但很明显繁琐了很多列生成式针对上面的问题,列生成式一句代码即可完成res = print(res) # 输出结果列生成式:带 if# 筛选偶数res = print(res) # 输出结果等价写法res = print(res) # 输出结果等价写法d = {x: A, y: B, z: C}res = res = print(res) # 输出结果列生成式 for 后面的 if 是一个筛选条件,不能带 else错误写法二res = print(res) # 报错信息res = ^SyntaxError: invalid syntaxfor 前面是一个达式 ,它需要有个达式计算结果,只有 if 是不完整的,需要有 else正确写法res = print(res) # 输出结果将 if ... else 放在前面写

    12720

    80386的分段机制、分机制和物理地址的形成

    DPL(Descriptor Privilege Level),就是描述符特权,它占两位,其值为0~3,用来确定这个段的特权即保护等。0为内核别,3为用户别。  index=4,TI=0,RPL=3#define __USER_DS   0x2B 用户数据段, index=5,TI=0,RPL=3从定义看出,没有定义堆栈段,实际上,Linux 内核不区分数据段和堆栈段 看来,Linux 巧妙地把段机制给绕过去了,它只把段分为两种:用户态(RPL=3)的段和内核态(RPL=0)的段,而完全利用了分机制。 当特权3 的进程要想访问面时,需要通过保护检查,而特权为0 的进程就可以绕过保护,如图2.23 所示。 Linux 采用三模式而不是两。如图2.28 所示为三模式,为此,Linux定义了3 种类型的

    53650

    80386的分段机制、分机制和物理地址的形成

    DPL(Descriptor Privilege Level),就是描述符特权,它占两位,其值为0~3,用来确定这个段的特权即保护等。0为内核别,3为用户别。  index=4,TI=0,RPL=3#define __USER_DS   0x2B 用户数据段, index=5,TI=0,RPL=3从定义看出,没有定义堆栈段,实际上,Linux 内核不区分数据段和堆栈段 看来,Linux 巧妙地把段机制给绕过去了,它只把段分为两种:用户态(RPL=3)的段和内核态(RPL=0)的段,而完全利用了分机制。 当特权3 的进程要想访问面时,需要通过保护检查,而特权为0 的进程就可以绕过保护,如图2.23 所示。 Linux 采用三模式而不是两。如图2.28 所示为三模式,为此,Linux定义了3 种类型的

    35130

    Linux内核管理-那些鲜为人知的秘密

    Linux内核为何使用多? 2)使用多结构优劣:优势:1.节省内存2.可以按需分配各3.可以离散存储劣势:需要遍历多,需要多次访问内存,实现复杂度高点3Linux内核综合考虑:典型的以时间换空间,可以将各放到物理内存的任何地方 12.遍历过程下面以arm64处理器架构多遍历作为结束(使用4大小为4K):Linux内核中 可以将扩展到5,分别是全局目录(Page Global Directory, PGD ,直接(Page Table, PT),而支持arm64的linux使用4结构分别是 pgd, pud, pmd, pt ,arm64手册中将他们分别叫做L0,L1,L2,L3转换,所以一下使用 3.找到L1转换,然后从虚拟地址中获得L1索引,通过L1索引找到相应的项(arm64中称为L1描述符,内核中叫做PUD项),从项中获得L2转换基地址。

    10720

    ARM32 映射

    在32bit中的Linux内核中一般采用3层映射模型,第1层是面目录(PGD),第2层是面中间目录(PMD),第3层才是面映射(PTE)。 将这个12bit的物理地址和虚拟地址的低20bit拼凑在一起,就得到32bit的物理地址;如果使用面映射的方式,段映射就变成了一映射(First Level table,在linux内核中成为PGD ),其项提供的不再是物理段地址,而是二的基地址。 32bit虚拟地址的高12bit(bit)作为访问一的索引值,找到相应的项,每个项指向一个二。 以虚拟地址的次8bit(bit)作为访问二目录的索引值,得到相应的项,从这个项找到20位的物理面地址。

    62730

    Linux操作系统基础知识学习

    Q3.为什么对32位线性地址空间要采用两? A: 是把线性地址映射到物理地址的一种数据结构,4GB的线性空间可以被划分为1M个4KB大小的,每个项占4字节,则1M个项的就需要占用4MB空间,而且还要求是连续的,于是采用两来实现 ;两就是对再进行分,第一称为目录,其中存放关于的信息;4MB的再次分,可以分为1K个4KB大小的。 Q4.面高速缓存的作用是什么?Linux为什么主要采用分机制来实现虚拟存储管理?它为什么采用三模式而不是两? 64位结构;Linux定义了三种类型的目录(PGD)、中间目录(PMD)和(PT)。

    3.3K110

    学习ARM64转换流程

    而在Linux中存储虚拟地址到物理地址转化的关系的称为。目前最新的linux内核已经支持了5。下图是一个4的转化关系图。? LINUX目前是支持5,当然也可以通过config(CONFIG_PAGE_LEVELS)去配置的,目前手上的模拟板使用的是三,如果使用三的话,PUD等于PMD。 前期条件是目前配置的是3。 目前此地址是线性地址,转化关系比较简单。 4K(CONFIG_ARM64_PAGE_SHIFT=12、CONFIG_ARM64_4K_PAGES=y),转化是3(CONFIG_PAGE_LEVELS=3),所以我们需要详细描述出39位是如何划分的 ==> 目录索引的偏移PAGE_SHIFT ==> 内的偏移当前模拟板是只有三,则就没有P4D和PUD,这样的话PGD=PMD了。

    88321

    3个顶开源JavaScript图库【Programming(JavaScript)】

    和其他可视化文件使从数据中传达信息变得更加容易。 image.png图对于数据的可视化和网站的吸引力非常重要。可视化演示使得分析大块数据和传达信息变得更加容易。 图库使您能够以一种令人惊叹的、易于理解的和交互式的方式可视化数据,并改进您的网站设计。在本文中,您将可以了解三个顶的开源JavaScript图库。1. Chart.jsChart.js是一个开放源代码的JavaScript库,可让您在应用程序上创建动画,精美和交互式的图。它可以在 MIT 许可下使用。 使用Chart.js,您可以创建各种令人印象深刻的图和图形,包括条形图,折线图,面积图,线性比例尺和散点图。 它可以在各种设备上完全响应,并利用HTML5 Canvas元素进行渲染。

    17800

    Linux内存管理--基本概念

    Linux物理内存三架构?对于内存管理,Linux采用了与具体体系架构不相关的设计模型,实现了良好的可伸缩性。它主要由内存节点node、内存区域zone和物理框page三架构组成。 又如,由于Linux内核采用 • 物理框page2. Linux虚拟内存三 Linux虚拟内存三管理由以下三组成: • PGD: Page Global Directory (目录) • PMD: Page Middle Directory ( 目录) • PTE: Page Table Entry (项) 每一有以下三个关键描述宏: • SHIFT • SIZE • MASK 如的对应描述为:? 2.3 如何通过3访问物理内存 为了通过PGD、PMD和PTE访问物理内存,其相关宏在asmpgtable.h中定义。

    85890

    Linux中PGD、PUD、PMD等概念介绍

    1、PGD: Page Global DirectoryLinux系统中每个进程对应用户空间的pgd是不一样的,但是linux内核 的pgd是一样的。 当创建一个新的进程时,都要为新进程创建一个新的面目录PGD,并从内核的面目录swapper_pg_dir中复制内核区间面目录项至新建进程面目录PGD的相应位置,具体过程如下:do_fork() 可以看出Linux系统中每个进程的面目录的第二部分是相同的,所以从进程的角度来看,每个进程有4G字节的虚拟空间,较低的3G字节是自己的用户空间,最高的1G字节则为与所有进程以及内核共享的系统空间。 关键字:PTE: 项(page table entry)PGD(Page Global Directory)PUD(Page Upper Directory)PMD(Page Middle Directory 每一个项指向一个框,框就是真正的物理内存

    86930

    Linux从头学16:操作系统-如何把【目录和】当做普通物理进行操作的?

    如果你看过 Linux 内核相关书籍,一定对下面这张图又熟悉、又恐惧:这是 Linux 系统中,处理单元的多查询方式。 其中黄色背景部分:目录索引 和 中间目录索引,是 Linux 系统自己扩展的,在原本的 x86 处理器中是不存在的,这也是导致 Linux 中相关部分代码更加复杂的原因。 对目录进行操作 重新梳理一下思路:如果对一个普通物理(下文简称为:普通)里的一个地址处的数据进行操作,需要经过3次查操作:从的某个项中,找到的那个物理地址,就是最后要操作的普通物理。 我们就来构造一个线性地址 addr,让它经过3次查操作之后,能够指向目录的物理地址。一:构造线性地址的前 10 位,来确定的物理地址一:查找的对象是目录。 例如本文开头的第一张图中,Linux 使用了4格来查找,并且中间的两个格还可以省略不用。如何跨过中间的这两个格,Linux 内核代码中的代码更复杂一些,但是策略都是一样的。

    8820

    操作系统的几种地址详解

    按中的解释,二模式空间的节约是从两个方面实现的: A、如果一中的一个条目为空,那么那所指的二就根本不会存在。 虚拟存储器系统可以在需要时创建,并面调入或调出二,这就减少了主存的压力。只有最经常使用的二才需要缓存在主存中。 ——不过Linux并没有完全享受这种福利,它的目录和与已分配面相关的都是常驻内存的。 前面说了i386的二管理架构,不过有些CPU,还有三,甚至四架构,Linux为了在更高层次提供抽像,为每个CPU提供统一的界面。 这四分别为: 全局目录PGD(对应刚才的目录) 目录PUD(新引进的) 中间目录PMD(也就新引进的) PT(对应刚才的)。

    95310

    3 篇:实现博客首文章列 API

    在基于模板引擎的开发方式中,博客首文章列的视图函数可能是这样的:from django.shortcuts import renderfrom .models import Post def index 201:示资源创建成功。400:示客户端请求错误。 = created or datetime.now() comment = Comment(email=leila@example.com, content=foo bar)根据 Comment 类 3 原因在于,对于 django 中的模型(Model),已经有了定义其数据类型的模型字段,因此 django 单可以根据关联的模型,自动推测需要使用的单字段,在背后帮我们完成单字段的选择,简化了单的定义 接下来,让我们使用 django-rest-framework 提供的通用类视图,将首 API 的视图函数改为类视图。

    14120

    一文读懂 HugePages(大内存)的原理

    把 图1 中的 分为 4 全局目录、目录、中间目录 和 目的是为了减少内存消耗(思考下为什么可以减少内存消耗)。 注意:全局目录、目录、中间目录 和 都占用一个 4KB 大小的物理内存,由于 64 位内存地址占用 8 个字节,所以一个 4KB 大小的物理内存可以容纳 512 个 64 位内存地址 以虚拟内存地址的 30 ~ 38 位作为索引,从 目录 中读取到 中间目录 的物理内存地址。以虚拟内存地址的 21 ~ 29 位作为索引,从 中间目录 中读取到 的物理内存地址。 要映射更大的内存,只需要增加偏移量部分,如 图3 所示:? 如 图3 所示,现在把偏移量部分扩展到 21 位(部分被覆盖了,21 位能够示的大小范围为 0 ~ 2MB),所以 中间目录 直接指向映射的 物理内存地址。

    38020

    linux服务器搭建之路3-升内核

    由于个人强迫症,什么软件都想用最新的,装完centos之后,第一件事就是升内核。 升内核过程启用 ELRepo 仓库:rpm --import https:www.elrepo.orgRPM-GPG-KEY-elrepo.orgrpm -Uvh http:www.elrepo.orgelrepo-release 3. 安装内核yum --enablerepo=elrepo-kernel install kernel-lt最后的lt就是安装长期服务版,如果是想安装主线版本则可以改为ml,等待一会就安装完成了。 3. 删除以前的内核 查看内核:rpm -qa | grep kernel ?

    56430

    扫码关注云+社区

    领取腾讯云代金券