位置: IT常识 - 正文

Linux内核学习笔记——页表的那些事。(《linux内核分析》)

编辑:rootadmin
Linux内核学习笔记——页表的那些事。 目录页表什么时候创建内核页表变化什么时候更新到用户页表源码分析常见问题解答问题一:页表到底是保存在内核空间中还是用户空间中?问题2:页表访问,软件是不是会频繁陷入内核?问题3:内存申请,软件是不是会频繁陷入内核创建新页表条目问题4:那内核页表和普通的页表到底有什么区别?

推荐整理分享Linux内核学习笔记——页表的那些事。(《linux内核分析》),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:linux内核原理与实现,linux内核教程,linux内核分析及应用,深入了解linux内核,深入理解linux内核 知乎,深入了解linux内核,《linux内核分析》,深入理解linux内核 知乎,内容如对您有帮助,希望把文章链接给更多的朋友!

接上两文,本文补充一下内核页表和用户页表创建、更新时机说明。 Linux内核学习笔记——内核页表隔离KPTI机制 Linux内核学习笔记——内核页表隔离KPTI机制(源码分析)

KPTI中每个进程有两套页表——内核态页表与用户态页表(两个地址空间)。

内核态页表只能在内核态下访问,可以创建到内核和用户的映射(不过用户空间受SMAP和SMEP保护)。

内核页表:即书上说的主内核页表,在内核中其实就是一段内存,存放在主内核页全局目录init_mm.pgd(swapper_pg_dir)中,硬件并不直接使用。

进程页表:每个进程自己的页表,放在进程自身的页目录task_struct.pgd中。

在保护模式下,从硬件角度看,其运行的基本对象为“进程”(或线程),而寻址则依赖于“进程页表”,在进程调度而进行上下文切换时,会进行页表的切换:即将新进程的pgd(页目录)加载到CR3寄存器中。从这个角度看,其实是完全没有用到“内核页表”的,那么“内核页表”有什么用呢?跟“进程页表”有什么关系呢?

页表什么时候创建

内核页表中的内容为所有进程共享,每个进程都有自己的“进程页表”,“进程页表”中映射的线性地址包括两部分:

用户态内核态 其中,内核态地址对应的相关页表项,对于所有进程来说都是相同的(因为内核空间对所有进程来说都是共享的),而这部分页表内容其实就来源于“内核页表”,即每个进程的“进程页表”中内核态地址相关的页表项都是“内核页表”的一个拷贝(进程创建时候就产生了)。内核页表变化什么时候更新到用户页表

“内核页表”由内核自己维护并更新,在vmalloc区发生page fault时,将“内核页表”同步到“进程页表”中。以32位系统为例,内核页表主要包含两部分:

线性映射区vmalloc区Linux内核学习笔记——页表的那些事。(《linux内核分析》)

其中,线性映射区即通过TASK_SIZE偏移进行映射的区域,对32系统来说就是0-896M这部分区域,映射对应的虚拟地址区域为TASK_SIZE~TASK_SIZE+896M。这部分区域在内核初始化时就已经完成映射,并创建好相应的页表,即这部分虚拟内存区域不会发生page fault。

vmalloc区,为896M~896M+128M,这部分区域用于映射高端内存,有三种映射方式:vmalloc、固定、临时,这里就不详细展开了。

以vmalloc为例(最常使用),这部分区域对应的线性地址在内核使用vmalloc分配内存时,其实就已经分配了相应的物理内存,并做了相应的映射,建立了相应的页表项,但相关页表项仅写入了“内核页表”,并没有实时更新到“进程页表中”,内核在这里使用了“延迟更新”的策略,将“进程页表”真正更新推迟到第一次访问相关线性地址,发生page fault时,此时在page fault的处理流程中进行“进程页表”的更新。

源码分析/* * 缺页地址位于内核空间。并不代表异常发生于内核空间,有可能是用户 * 态访问了内核空间的地址。 */ if (unlikely(fault_in_kernel_space(address))) { if (!(error_code & (PF_RSVD | PF_USER | PF_PROT))) { //检查发生缺页的地址是否在vmalloc区,是则进行相应的处理 if (vmalloc_fault(address) >= 0) return;/* * 对于发生缺页异常的指针位于vmalloc区情况的处理,主要是将 * 主内核页表向当前进程的内核页表同步。 */static noinline __kprobes int vmalloc_fault(unsigned long address){ unsigned long pgd_paddr; pmd_t *pmd_k; pte_t *pte_k; /* Make sure we are in vmalloc area: */ /* 区域检查 */ if (!(address >= VMALLOC_START && address < VMALLOC_END)) return -1; WARN_ON_ONCE(in_nmi()); /* * Synchronize this task's top level page-table * with the 'reference' page table. * * Do _not_ use "current" here. We might be inside * an interrupt in the middle of a task switch.. */ /*获取pgd(最顶级页目录)地址,直接从CR3寄存器中读取。 *不要通过current获取,因为缺页异常可能在上下文切换的过程中发生, *此时如果通过current获取,则可能会出问题*/ pgd_paddr = read_cr3(); //从主内核页表中,同步vmalloc区发生缺页异常地址对应的页表 pmd_k = vmalloc_sync_one(__va(pgd_paddr), address); if (!pmd_k) return -1; //如果同步后,相应的PTE还不存在,则说明该地址有问题了 pte_k = pte_offset_kernel(pmd_k, address); if (!pte_present(*pte_k)) return -1; return 0;}常见问题解答问题一:页表到底是保存在内核空间中还是用户空间中?

创建和删除页表的确是在内核空间操作的。页表不能在用户空间进行操作一点都不奇怪,你要知道页表的作用不仅仅是虚拟地址到物理地址的映射,还有关键的权限访问控制和页面属性的记录。下图是armv8中level 1的页表格式,类似于x86中的PUD的结构: 可以看到该页表中只有"Outlook block address"是在表示下一级页表的地址,"Upper attributes"和"Lower attributes"是内核空间用到权限的控制位和页属性标志。

问题2:页表访问,软件是不是会频繁陷入内核?

这个需要结合场景分析。访问页表是否会陷入内核,这要看你是:

CPU地址翻译的过程中的页表访问;增加修改页表项。

如果是第一种,CPU地址翻译,那么这种访问是硬件完成的,整个过程不需要代码参与,没有任何性能上的损失。

如果是第二种,是会慢一些。这种慢是为了安全,如果页表在用户空间,那么用户就可能自己修改页表,映射任意的内存地址,访问任何内存,甚至是直接操作硬件,进程间、内核的隔离保护就失去了意义。

问题3:内存申请,软件是不是会频繁陷入内核创建新页表条目

你以为在用户进程中分配内存的时候,就马上通过系统调用陷入内核,然后进行页表操作吗?这个理解是不对的。

应用程序虽然可能频繁的malloc或者free,但在页表层面上,并不会频繁的创建、删除页表项,主要原因是,malloc/free操作的接口都是C库的接口,在C库里,还有另外一层次的封装,来保证不会频繁的提交页表的操作申请。

内核如今已经发展的很成熟了,当然不会这么傻。在你兴高采烈的分配好一块内存后,内核只是给你找了一块独一无二的虚拟内存空间,并没有映射到物理内存,所以根本没有页表的操作。只有你真正用到你的内存时,MMU发现无法进行虚拟内存到物理内存的转换,只好抛出page fault异常,然后进入内核进行物理内存的分配过程,接着就给你把页表创建好了,这个整个过程叫做惰性分配。

更重要的是,其实libc库在进程创建的时候,就已经把堆空间用内存池的方式管理起来,在进程分配小于128kb的内存时,根本不需要内核进行任何操作,因为堆这个段的虚拟内存早就映射好了物理内存。

问题4:那内核页表和普通的页表到底有什么区别?

对于所有进程来说它们页表中的内核空间页表部分都是一模一样的,它们都是从1号进程的init_mm结构中copy的,只有用户空间的页表不尽相同。用户空间的页表是用来进行不同进程地址空间隔离的,所以相同的虚拟地址可以映射到不同的物理地址,当然一般情况下这也是必须的,而内核只有一个。

本文链接地址:https://www.jiuchutong.com/zhishi/299210.html 转载请保留说明!

上一篇:vue2计算属性computed(vue2计算属性和vue3的计算属性的区别)

下一篇:微信小程序获取当前的位置(微信小程序获取地理位置)

  • php网页设计作业运营用户运营是指推动有效线索和交易转化的一系列动作

    php网页设计作业运营用户运营是指推动有效线索和交易转化的一系列动作

  • 微信不领红包怎么知道多少钱(微信不领红包怎么看发了多少钱)

    微信不领红包怎么知道多少钱(微信不领红包怎么看发了多少钱)

  • vivo NEX 3s的闪存规格是多少(vivoiqooneo3闪存)

    vivo NEX 3s的闪存规格是多少(vivoiqooneo3闪存)

  • 苹果11放大镜在哪里(苹果放大镜在哪里关)

    苹果11放大镜在哪里(苹果放大镜在哪里关)

  • 为什么nfc无法识别卡(为什么nfc无法识别身份证)

    为什么nfc无法识别卡(为什么nfc无法识别身份证)

  • 苹果11悬浮窗怎么打开(苹果11悬浮窗怎么设置出来)

    苹果11悬浮窗怎么打开(苹果11悬浮窗怎么设置出来)

  • qq邮箱邮件加载失败怎么办(qq邮箱加载失败是什么原因)

    qq邮箱邮件加载失败怎么办(qq邮箱加载失败是什么原因)

  • 手机有透视的功能吗(手机有透视的功能在哪里)

    手机有透视的功能吗(手机有透视的功能在哪里)

  • 比心注销了还能注册吗(比心注销账号后个人信息会泄露吗)

    比心注销了还能注册吗(比心注销账号后个人信息会泄露吗)

  • oppoa77什么时候上市(oppoa7什么时候上市的)

    oppoa77什么时候上市(oppoa7什么时候上市的)

  • 抖音如何隐藏自己在线(抖音如何隐藏自己浏览别人的记录)

    抖音如何隐藏自己在线(抖音如何隐藏自己浏览别人的记录)

  • soul注销期间能使用吗(soul注销期间能登陆吗)

    soul注销期间能使用吗(soul注销期间能登陆吗)

  • 华为emui10.1新功能(华为emui10.0)

    华为emui10.1新功能(华为emui10.0)

  • qq作业提交别人可以看见吗(qq作业提交别人可以看见提示吗)

    qq作业提交别人可以看见吗(qq作业提交别人可以看见提示吗)

  • 电脑开机出现americanmegatrends怎么办(电脑开机出现american megatrends)

    电脑开机出现americanmegatrends怎么办(电脑开机出现american megatrends)

  • 小米手机耗电太快什么原因(小米手机耗电超级快怎么办)

    小米手机耗电太快什么原因(小米手机耗电超级快怎么办)

  • 插网线会抢wifi网速吗(插网线会不会影响网速)

    插网线会抢wifi网速吗(插网线会不会影响网速)

  • 苹果2g运行内存相当于安卓多大(苹果2g运行内存带的动原神吗)

    苹果2g运行内存相当于安卓多大(苹果2g运行内存带的动原神吗)

  • i5 9400f是第几代(i59400f是第几代处理器)

    i5 9400f是第几代(i59400f是第几代处理器)

  • m2转sata性能损耗多少(m2转sata2)

    m2转sata性能损耗多少(m2转sata2)

  • iphonex所有导航用不了(iphonex导航键怎么打开)

    iphonex所有导航用不了(iphonex导航键怎么打开)

  • qq视频被录屏会有提示吗(qq视频录屏会被对方发现吗)

    qq视频被录屏会有提示吗(qq视频录屏会被对方发现吗)

  • 红米6a支持内存卡吗(红米6a内存多少)

    红米6a支持内存卡吗(红米6a内存多少)

  • 微信支持安卓最低版本是多少(微信支持安卓最低版本是多少?2022)

    微信支持安卓最低版本是多少(微信支持安卓最低版本是多少?2022)

  • 苹果6s怎么上下分屏(苹果6s上下键不能用,喇叭无声)

    苹果6s怎么上下分屏(苹果6s上下键不能用,喇叭无声)

  • wim文件怎么安装系统(wim文件怎么安装系统win10)

    wim文件怎么安装系统(wim文件怎么安装系统win10)

  • 数据库怎么安装(sql数据库安装)

    数据库怎么安装(sql数据库安装)

  • 相册管家怎么导出照片到新手机(相册管家怎么导出图片)

    相册管家怎么导出照片到新手机(相册管家怎么导出图片)

  • 进口增值税的税率
  • 减免增值税计入
  • 以前年度损益调整账务处理分录
  • 教育培训行业是干什么的
  • 产品未含税价格怎么算
  • 退所得税的分录
  • 公司开业前期费用处理
  • 公允价值变动损益会计处理
  • 收财务拨款的贷款合法吗
  • 一般纳税人的含税收入怎么算
  • 工人保险一个月多少钱
  • 应交税费明细科目有简易计税吗
  • 有收入零申报要紧吗
  • 应收账款怎么样转入以前年度损益调整
  • 预缴企业所得税分录
  • 报销差旅费必须要车票吗
  • 回迁房所得税处理
  • 增值税进项税额抵扣期限最新
  • 腾讯电脑管家中蓝牙在哪
  • 疫情期间企业贷款利率多少
  • rundll.exe是什么程序
  • linux命令top作用
  • 简易征收做账
  • win10商店如何改地区
  • php字符串函数有哪些
  • 限额领料单属于外来原始凭证吗
  • vue3+ts写法
  • phpstan
  • 应扣未扣应收未收税款是什么意思
  • 今天端午节是几月几号啊
  • 外商投资企业 外资企业
  • 【经验分享】使用了6年的实时操作系统,是时候梳理一下它的知识点了 | 文末赠书4本
  • 进项逾期未认证怎么办
  • imu定位
  • 【机器学习面试总结】————(一)
  • php自定义表单
  • 代扣费用会计分录
  • 个人出租租房交什么税
  • 企业的业务招待费属于什么费用
  • 开票资料需要哪些东西
  • 一般纳税人作废小规模时开的发票怎么报税
  • sqlserver去掉字符串内的指定字符
  • 收据能否入账?如何填写才具有合法性呢...
  • 一般纳税人企业所得税税率多少
  • 贸易公司开发票进项跟销项不符合怎么办?
  • 结账与对账的共同意义在于
  • 借贷记账法的记账依据是什么
  • 预交一年的房租怎么做账
  • 企业股权融资方式有哪些
  • 管理费用处理的是
  • 如何理解事业单位处罚暂行条例中第十八条的兼职规定
  • 企业会计制度对固定资产无入账价值怎么入账
  • 党建经费可以购买什么
  • 增值税销项抵扣报税后有效期是多长时间
  • 记账凭证模板
  • 填制凭证的主要内容和注意事项
  • 利润所属科目
  • 明细分类账的建账
  • SQL SELECT 语句的表连接
  • win2003和2003r2
  • ubuntu gnome3
  • 全自怎么安装方法
  • win7怎么打开程序
  • windows8怎么设置
  • unity connected games
  • 合并多个js文件
  • bc1998录制的css视频教程推荐新手看下
  • nodejs使用视频教程
  • 传智播客javappt
  • shell中setenv
  • python从入门到精通
  • 通过jquery实现页面的动画效果(实例代码)
  • 整理的什么
  • jquery 获取屏幕高度
  • 周炜老婆是干什么的
  • 深圳龙岗有几个街道
  • 企业代理申报还用自己申报吗
  • 江苏省财务官网
  • 江西国税电子税务局
  • 五四新文化运动究竟新在哪里
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设