展开

关键词

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

目录 前言 Intel四 实操寻址 获取cr3 获取PGD 获取PUD 获取PMD 获取PTE 获取内容 最后 ---- 前言 Linux的作用主要就是地址映射, 将逻辑地址映射到物理地址 很多时候, 有些地方想不明白就可以查看实际物理地址进行分析. ---- Intel 四 其实很多设计的根源或者说原因都来自于CPU的设计, OS很多时候都是辅助CPU. Linux的四就是依据CPU的四来设计的. 这里主要说的就是Intel x64面大小为4KB的情况, 如图所示: ? 这些都是可以帮助快速获取地址的, 上篇文章说的kgdb工具也是可以的, 就是麻烦点, 你懂的. 在Linux当中, 第称为PGD, 当然是有历史原因的, 可以自行google. 所以Linux的四分别是PGD -> PUD -> PMD -> PTE. ?

4.1K40

的好处

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

20830
  • 广告
    关闭

    腾讯云+社区系列公开课上线啦!

    Vite学习指南,基于腾讯云Webify部署项目。

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

    的划分和由来

    8610

    张千万别数据的想做分,如何优化?

    介绍 当进行分时,MySQL 并不是跳过 offset 行,而是取 offset+N 行,然后放弃前 offset 行,返回 N 行。例如 limit 10000, 20。 这样每次查询的时候,会先从name索引列上找到id值,然后回,查询到所有的数据。可以看到有很多回其实是没有必要的。 完全可以先从name索引上找到id(注意只查询id是不会回的,因为非聚集索引上包含的值为索引列值和主键值,相当于从索引上能拿到所有的列值,就没必要再回了),然后再关联,获取所有的数据 因此可以改为 FROM film JOIN (SELECT id from film ORDER BY name LIMIT 100,5) temp ON film.id = temp.id 倒序查询 假如查询倒数最后 ,offset可能回非常大 SELECT id, name, description FROM film ORDER BY name LIMIT 100000, 10; 改成倒序分,效率是不是快多了?

    55120

    WeChat 文章列面(

    授权许可 我们在 WeChat 从个简单的“Welcome”面来开始小程序之旅吧 中,已经完成了 welcome 面的构建,接下来我们将完成文章面部分,主要分为轮播图和文章列两个部分 ? welcome 面 0. 准备工作 通过在 app.json 的 pages 数组里加入 post 面路径,快速创建新建阅读面所需要的四个文件 post.wxml、post.wxss、post.js、post.json 目录结构 这里需要主要的是,小程序会默认将 pages 数组下的第项元素,作为启动时要显示的第面,使用 command + S 快捷键进行保存,小程序就会自动保存编译,如果快捷键没有效果,则需要手动点击 构建文章列的骨架和样式 post.wxml 代码 <view class="post-container"> <view class="post-author-date"> <

    20640

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

    1、PGD: Page Global Directory Linux系统中每个进程对应用户空间的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 每项指向框,框就是真正的物理内存

    1.1K30

    宋宝华: ARM64 Linux内核的块映射

    我们看看这种情况下的,我们既可以用最终的【20:12】对应的PTE映射项,以4K为单位,进行虚拟地址到物理地址的映射;又可以以【29:21】对应的PMD映射项,以2M为单位,进行虚拟地址到物理地址的映射 当然,如果用户态的虚实映射是这样的,用户实际得到了个1GB的巨。但是对于内核的线性映射区域而言,即便我们进行了1GB的PUD映射,这1G内部就可以进步切割为4KB或者2MB的巨。 我们把它们全部选中,这样我们可以得到个debugfs接口: /sys/kernel/debug/kernel_page_tables 来获知内核态的情况。 如果我把这个kernel启动选项去掉,我得到的内核是完全不样,线性映射区也全部是PTE映射: ? 牧春童鞋在“Linux阅码场”这里还有些精彩的文章: 宋牧春:Linux设备树文件结构与解析深度分析(1) 宋牧春:Linux设备树文件结构与解析深度分析(2) 宋牧春:多图详解Linux内存分配器

    86510

    个简单的白网

    然后Ctrl+F搜索数字9,就可以给Ta个惊喜喽

    60230

    如何判断个网是列还是详情

    比如来了个博客网站,我能首先识别出来这是个列还是文章(详情),然后提取列的每篇文章的链接,然后跳转到每篇文章(详情)再提取文章相关信息。 那么这里面可能就有四个关键部分: •判断当前所在的面是列还是文章(详情)•识别出列的链接•识别出列所有列链接•识别出文章(详情)的文章内容和其他信息 如果我们能把这四步都用算法实现出来 那么这篇文章我们就来简单说下第步,如何判断当前所在的面的列还是文章(详情)。 注:后文中文章称之为详情。 数据标注 既然要做分类模型,那么最重要的当然就是数据标注了,我们分两组就好了,组是列组是详情,我们先用手工配合爬虫找些列和详情的 HTML 代码,然后将其保存下来。 •列簇的数目:般来说,列通常会包含多个具有公共父节点的条目,多个条目构成个列簇,虽然说详情侧栏也会包含些列,但至少这个数量也可以成为个特征来判别。

    82850

    百亿数据分后怎么分查询?

    而分库分之后些常规的查询可能都会产生问题,最常见的就是比如分查询的问题。 般我们把分的字段称作shardingkey,比如订单按照用户ID作为shardingkey,那么如果查询条件中不带用户ID查询怎么做分? 那么以日订单100万半年的数量来看,不分的话我们订单量将达到100万X180=1.8亿,以这个数据量部分的话肯定单是扛不住的,就算你能扛RT的时间你也根本无法接受吧。 如果不用这个方案,又要不带shardingkey的分查询,兄弟,这就只能扫全查询聚合数据,然后手动做分了,但是这样查出来的结果是有限制的。 分库分首先是基于现有的业务量和未来的增量做出判断,比如拼多多这种日单量5000万的,半年数据得有百亿别了,那都得分到4096张了对吧,但是实际的操作是样的,对于你们的业务分4096那就没有必要了

    44530

    百万Limit翻越往后越慢咋办?

    ,还拖累服务器性能,因而分必不可少 问题 mysql 的 limit 给分带来了极大的方便,但数据偏移量大,limit 的性能就急剧下降。 select * from table_name limit 10000,10 select * from table_name limit 0,10 所以不能简单的使用 limit 语句实现数据分。 这需要了解 limit 操作是如何运作的,以下面这句查询为例: select * from table_name limit 10000,10 这句 SQL 的执行逻辑是 1.从数据中读取第N条数据添加到数据集中 首先,数据库的数据存储并不是像我们想象中那样,按按顺序存储数据,方面是因为计算机存储本身就是随机读写,另方面是因为数据的操作有很大的随机性,即使开始数据的存储是有序的,经过系列的增删查改之后也会变得凌乱不堪 由于普通搜索是全搜索,适当的添加 WHERE 条件就能把搜索从全搜索转化为范围搜索,大大缩小搜索的范围,从而提高搜索效率。

    41830

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

    因此linux内核堆进行了分. 前面我们提到过, 对于32位系统中, 两已经足够了. 但是64位需要更多数量的分别. 3.2 Linux最初的二 Linux最初是在台i386机器上开发的,这种机器是典型的32位X86架构,支持两 个32位虚拟地址如上图划分。 巧妙的是,Linux采取了种抽象方法:所有架构全部使用3: 即PGD -> PMD -> PTE。那只使用2(如非PAE的X86)怎么办? 这种抽象保持了代码结构的统。 3.4 Linux的四 硬件在发展,3很快又捉襟见肘了,原因是64位CPU出现了, 比如X86_64, 它的硬件是实实在在支持4的。 对于仍使用3目录的架构来说,它们依然拥有个虚拟的PML4,相关的代码会在编译时被优化掉。 这样,就把Linux内核的3扩充为4

    3.2K20

    Linux内存寻址之分段机制及分机制【转】

    每个进程都会被分配目录,但是只有被实际使用才会被分配到内存里面。需要次分配所有空间,两则可以在需要的时候再分配空间。 两结构 两结构的第称为目录,存储在个4K字节的面中。目录共有1K个项,每个项为4个字节,并指向第二。 两结构的第二称为,也刚好存储在个4K字节的面中,包含1K个字节的项,每个项包含的物理基地址。 Linux全局目录对应80×86 的目录指针(PDPT),取消了目录,中间目录对应80×86的目录,Linux对应80×86的。 例如说:Linux在32位CPU上,它的四结构就会兼容到硬件的两结构。可见,Linux在软件层面上做了层抽象,用四的方式兼容32位和64位CPU内存寻址的不同硬件实现。

    1.8K50

    不同架构的分机制

    对于不同的体系结构,Linux采用的四目录的大小有所不同:对于i386而言,仅采用二,即上层目录和中层目录长度为0;对于启用PAE的i386,采用了三,即上层目录长度为0;对于 64位体系结构,可以采用三或四,具体选择由硬件决定。 对于没有启用物理地址扩展的32位系统,两已经足够了。从本质上说Linux通过使“目录”位和“中间目录”位全为0,彻底取消了目录和中间目录字段。 内核为目录和中间目录保留了个位置,这是通过把它们的目录项数设置为1,并把这两个目录项映射到全局目录的个合适的目录项而实现的。 启用了物理地址扩展的32 位系统使用了三Linux全局目录对应80x86 的目录指针(PDPT),取消了目录,中间目录对应80x86的目录,Linux对应80x86的

    6130

    ARM32 映射

    将这个12bit的物理地址和虚拟地址的低20bit拼凑在起,就得到32bit的物理地址; 如果使用面映射的方式,段映射就变成了映射(First Level table,在linux内核中成为 32bit虚拟地址的高12bit(bit[31:20])作为访问的索引值,找到相应的项,每个项指向个二。 因为Linux内核默认的PGD从21位开始,也就是bit[31:21],共2048个项;而ARM32硬件结构上,PGD是从20bit开始的,项为4096个,比Linux内核多倍,那么代码实现上取巧了 512个是给ARM硬件MMU使用的; 次映射两个相邻的项,也就是对应的两个相邻的二都存放在个page中; 然后把这个PTE的基地址通过__pmd_populate( 512个项的地址作为基地址,再加上些标志位信息prot作为项内容,写入上项PMD中。

    71230

    TLB缓存是个神马鬼,如何查看TLB miss?

    管理有两个关键点,分别是面大小和数 1.面大小 在Linux下,我们通过如下命令可以查看到当前操作系统的大小 # getconf PAGE_SIZE 4096 可以看到当前我的Linux 2.数 1)如果数越少,虚拟地址到物理地址的映射会很快,但是需要管理的项会很多,能支持的地址空间也有限。 2 Linux虚拟内存实现 1.32位系统的虚拟内存实现:二 为了帮助大家回忆这段知识,我举个例子。 项假如4字节,那么个进程就需要(1048576*4=)4M的内存来存项。 如果是采用2,如图1,则创建进程时只需要有目录就可以了,占用(1024*4)=4KB的内存。 也必须和32位系统样,进步提高数。

    8020

    情人节撸

    趁此单身汪伤心之日,作为名前端程序猿的我也按捺不住了,撸个面送给广大想白的人儿。话不多说,先看效果(网地址): ? 功能 个网输入名称,生成带参数的网址。 浏览器输入该网址,即可打开带有该名字的网,图片轮播,还带有音乐哟 (简单实现,本文不是技术软文,而是小工具推荐啊啊哈哈) (ps: 已经做了移动端适配,手机打开效果更加哦) 代码 // name.html

    4.7K10

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

    ,而管理是在虚拟内存管理中尤为重要,本文主要以回答几个管理中关键性问题来解析Linux内核管理,看管理中那些鲜为人知的秘密。 Linux内核为何使用多? ,可以将各放到物理内存的任何地方,无论是硬件遍历还是内核遍历,比更复杂,但是为了节省内存,内核选择多结构。 12.遍历过程 下面以arm64处理器架构多遍历作为结束(使用4大小为4K): Linux内核中 可以将扩展到5,分别是全局目录(Page Global Directory, ,所以下使用L0-L3示各

    15920

    扫码关注云+社区

    领取腾讯云代金券