原创 宋宝华 Linux阅码场 2018-03-23

看完这篇文章,可以知道AARCH64平台修复meltdown漏洞的KPTI补丁的基本原理。此文很难很分裂,需要具备大量背景知识,慎重阅读。

看不懂也没有关系,记住最后三张页表的结论即可。

+config UNMAP_KERNEL_AT_EL0

+bool "Unmap kernel when running in userspace (aka \"KAISER\")"

+default y

+help

+ Some attacks against KASLR make use of the timing difference between

+ a permission fault which could arise from a page table entry that is

+ present in the TLB, and a translation fault which always requires a

+ page table walk. This option defends against these attacks by unmapping

+ the kernel whilst running in userspace, therefore forcing translation

+ faults for all of kernel space.

+

+ If unsure, say Y.

+

第二个patch是"arm64: mm: Map entry trampoline into trampoline and kernel page tables",地址:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=51a0048beb449682d632d0af52a515adb9f9882e

此处建立了一个只包含EL0陷入EL1和退出的必要的代码的页被映射的页表(trampoline page table),

+#ifdef CONFIG_UNMAP_KERNEL_AT_EL0

+static int _ _init map_entry_trampoline(void)

+{

+extern char _ _entry_tramp_text_start[];

+

+pgprot_t prot = rodata_enabled ? PAGE_KERNEL_ROX : PAGE_KERNEL_EXEC;

+phys_addr_t pa_start = _ _pa_symbol(__entry_tramp_text_start);

+

+/* The trampoline is always mapped and can therefore be global */

+pgprot_val(prot) &= ~PTE_NG;

+

+/* Map only the text into the trampoline page table */

+memset(tramp_pg_dir, 0, PGD_SIZE);

+__create_pgd_mapping(tramp_pg_dir, pa_start, TRAMP_VALIAS, PAGE_SIZE,

+ prot, pgd_pgtable_alloc, 0);

+

+/* ...as well as the kernel page table */

+__set_fixmap(FIX_ENTRY_TRAMP_TEXT, pa_start, prot);

+return 0;

+}

+core_initcall(map_entry_trampoline);

+#endif

+.macro tramp_map_kernel, tmp

+mrs\tmp, ttbr1_el1

+sub\tmp, \tmp, #(SWAPPER_DIR_SIZE + RESERVED_TTBR0_SIZE)

+bic\tmp, \tmp, #USER_ASID_FLAG

+msrttbr1_el1, \tmp

+.endm

+

+.macro tramp_unmap_kernel, tmp

+mrs\tmp, ttbr1_el1

+add\tmp, \tmp, #(SWAPPER_DIR_SIZE + RESERVED_TTBR0_SIZE)

+orr\tmp, \tmp, #USER_ASID_FLAG

+msrttbr1_el1, \tmp

tramp_map_kernel可以让EL0陷入EL1的时候,载入FULL的kernel page table,而 tramp_unmap_kernel可以帮助kernel从EL1退回到EL0的时候,TTBR1里面切换到一个只包含最基本EL0到EL1入口和出口代码的向量表等信息映射的页表(trampoline page table),这样kernel不至于暴露给user。

由此,我们发现AARCH64对meltdown的修复看起来比X86还要复杂,X86好歹只有2个页表,见维基百科:https://en.wikipedia.org/wiki/Kernel_page-table_isolation :

但是ARM64 Linux的需要3个页表:

kernel完整的页表 TTBR1

kernel的只包含trampoline的trampoline页表(这部分完全是为了让EL0陷入和退出EL1用的,并且帮助完成trampoline页表和kernel完整页表的切换)

user的页表 TTBR0

meltdown linux 补丁,宋宝华: ARM64 Linux meltdown修复补丁KPTI的最重要3个patch相关推荐

  1. arm linux内核实时补丁,宋宝华: Linux实时补丁的原理和实践

    2012年的文章,重新在微信公众号发表. 第一章:硬实时Linux(RT-Preempt Patch)在PC上的编译.使用和测试第二章:硬实时Linux(RT-Preempt Patch)的中断线程化 ...

  2. linux 没有windows.h头文件_宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)...

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前向声明 编程定律 先强调一点:在一切可 ...

  3. linux pdf 宋宝华,51CTO博客-专业IT技术博客创作平台-技术成就梦想

    原创 宋宝华 Linux阅码场 2018-04-10 前言 网上关于BIO和块设备读写流程的文章何止千万,但是能够让你彻底读懂读明白的文章实在难找,可以说是越读越糊涂! 我曾经跨过山和大海 也穿过人山 ...

  4. 宋宝华: Linux实时补丁的原理和实践

    2012年的文章,重新在微信公众号发表. 第一章: 硬实时Linux(RT-Preempt Patch)在PC上的编译.使用和测试 第二章: 硬实时Linux(RT-Preempt Patch)的中断 ...

  5. 宋宝华:Linux内核中用GFP_ATOMIC申请内存究竟意味着什么?

    本文目的 本文补充校正一些Linux内核开发者关于GFP_ATOMIC的认知不完整的地方,阐述GFP_ATOMIC与free内存watermark的关系,并明确什么时候应该用GFP_ATOMIC申请内 ...

  6. 宋宝华:Linux设备与驱动的手动解绑与手动绑定

    众所周知,Linux靠设备与驱动之间的match,来完成设备与驱动的bind,从而触发驱动的probe()成员函数被执行.每个bus都有相应的match方法,完成match的总的入口函数是: stat ...

  7. 宋宝华:linux内存中 swappiness=0究竟意味着什么?

    本文解释linux内存中swappiness的作用,以及linux内存中swappiness=0究竟意味着什么. 内存回收 我们都知道,Linux一个进程使用的内存分为2种: file-backed ...

  8. 宋宝华:评Linux 5.13内核

    目录 Misc cgroup Landlock安全模块 系统调用的堆栈随机化 printk无锁ringbuffer的进一步优化 BPF可调用内核函数 公共的IO PAGE Fault支持 Linux ...

  9. 宋宝华:LEP(Linux易用剖析器) 是什么,为什么以及怎么办(2)

    LEP(LINUX EASY PROFILING) 是Linuxer之LEP项目组(Barry Song,Mac Xu,陈松等以及陈莉君教授/西邮Linux 3+1实验室)正在致力于打造的一个开源项目 ...

  10. 宋宝华_2010年11-12月Linux驱动和内核讲座PPT下载

        12月29日,宋宝华老师在线讲座(按键和LCD驱动) cloudquan 2010-12-20 2/146 heyan0208 3 天前 00:37     宋宝华_2010年12月11日_& ...

最新文章

  1. 用Access作为后台数据库支撑,书写一个C#写入记录的案例
  2. python字典数组排序sorted_Python利用sorted进行字典排序
  3. C与c++中-什么时候用,头文件中与“”区别
  4. TypeScript里一些特殊的类型
  5. oracle运行环境配置,oracle 环境配置开机自启动
  6. WPF TextBox只能输入数字
  7. js本页导出Excel,下载
  8. Spring实战——无需一行xml配置实现自动化注入
  9. HTML CSS设计与构建网站
  10. Laravel文档梳理5、HTTP请求
  11. 【GA MTSP】基于matlab遗传算法求解多旅行商问题(同起点不同终点)【含Matlab源码 1325期】
  12. html高德地图无法显示,关于高德地图不显示的问题
  13. python基础-数据类型与基本操作
  14. Java云同桌学习系列(二十二)——mongoDB数据库
  15. 愿你永远像个boy,找到自己的光亮
  16. 旧机还在换盆?! Linux deploy让她再发光!
  17. element plus之el-table行融合+列融合+小计行+自定义控件+样式自定义方案
  18. 类的封装性、继承性和多态性设计
  19. 初学者c语言编程软件_C初学者手册:仅需几个小时即可学习C编程语言基础知识
  20. arm服务器测评_ARM搭建我的世界服务器教程,适用于树莓派

热门文章

  1. Dev-C++下的char字符数组strlen()诡异事件
  2. Google 按图搜索的原理
  3. 公网远程开机(唤醒家庭PC)
  4. 银行会计凭证粗略整理
  5. 中央银行会计核算数据集中系统(ACS系统)
  6. 史上最全 MCC(移动国家码)和 MNC(移动网络码)
  7. 判断闰年的3种方法(判断+范围输出)
  8. 【opencv】图片拼接
  9. 妈妈见我来了的香港旅游局
  10. 明通智能:EA交易外汇ea能稳定盈利吗?