meltdown linux 补丁,宋宝华: ARM64 Linux meltdown修复补丁KPTI的最重要3个patch
原创 宋宝华 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相关推荐
- arm linux内核实时补丁,宋宝华: Linux实时补丁的原理和实践
2012年的文章,重新在微信公众号发表. 第一章:硬实时Linux(RT-Preempt Patch)在PC上的编译.使用和测试第二章:硬实时Linux(RT-Preempt Patch)的中断线程化 ...
- linux 没有windows.h头文件_宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)...
本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前向声明 编程定律 先强调一点:在一切可 ...
- linux pdf 宋宝华,51CTO博客-专业IT技术博客创作平台-技术成就梦想
原创 宋宝华 Linux阅码场 2018-04-10 前言 网上关于BIO和块设备读写流程的文章何止千万,但是能够让你彻底读懂读明白的文章实在难找,可以说是越读越糊涂! 我曾经跨过山和大海 也穿过人山 ...
- 宋宝华: Linux实时补丁的原理和实践
2012年的文章,重新在微信公众号发表. 第一章: 硬实时Linux(RT-Preempt Patch)在PC上的编译.使用和测试 第二章: 硬实时Linux(RT-Preempt Patch)的中断 ...
- 宋宝华:Linux内核中用GFP_ATOMIC申请内存究竟意味着什么?
本文目的 本文补充校正一些Linux内核开发者关于GFP_ATOMIC的认知不完整的地方,阐述GFP_ATOMIC与free内存watermark的关系,并明确什么时候应该用GFP_ATOMIC申请内 ...
- 宋宝华:Linux设备与驱动的手动解绑与手动绑定
众所周知,Linux靠设备与驱动之间的match,来完成设备与驱动的bind,从而触发驱动的probe()成员函数被执行.每个bus都有相应的match方法,完成match的总的入口函数是: stat ...
- 宋宝华:linux内存中 swappiness=0究竟意味着什么?
本文解释linux内存中swappiness的作用,以及linux内存中swappiness=0究竟意味着什么. 内存回收 我们都知道,Linux一个进程使用的内存分为2种: file-backed ...
- 宋宝华:评Linux 5.13内核
目录 Misc cgroup Landlock安全模块 系统调用的堆栈随机化 printk无锁ringbuffer的进一步优化 BPF可调用内核函数 公共的IO PAGE Fault支持 Linux ...
- 宋宝华:LEP(Linux易用剖析器) 是什么,为什么以及怎么办(2)
LEP(LINUX EASY PROFILING) 是Linuxer之LEP项目组(Barry Song,Mac Xu,陈松等以及陈莉君教授/西邮Linux 3+1实验室)正在致力于打造的一个开源项目 ...
- 宋宝华_2010年11-12月Linux驱动和内核讲座PPT下载
12月29日,宋宝华老师在线讲座(按键和LCD驱动) cloudquan 2010-12-20 2/146 heyan0208 3 天前 00:37 宋宝华_2010年12月11日_& ...
最新文章
- 用Access作为后台数据库支撑,书写一个C#写入记录的案例
- python字典数组排序sorted_Python利用sorted进行字典排序
- C与c++中-什么时候用,头文件中与“”区别
- TypeScript里一些特殊的类型
- oracle运行环境配置,oracle 环境配置开机自启动
- WPF TextBox只能输入数字
- js本页导出Excel,下载
- Spring实战——无需一行xml配置实现自动化注入
- HTML CSS设计与构建网站
- Laravel文档梳理5、HTTP请求
- 【GA MTSP】基于matlab遗传算法求解多旅行商问题(同起点不同终点)【含Matlab源码 1325期】
- html高德地图无法显示,关于高德地图不显示的问题
- python基础-数据类型与基本操作
- Java云同桌学习系列(二十二)——mongoDB数据库
- 愿你永远像个boy,找到自己的光亮
- 旧机还在换盆?! Linux deploy让她再发光!
- element plus之el-table行融合+列融合+小计行+自定义控件+样式自定义方案
- 类的封装性、继承性和多态性设计
- 初学者c语言编程软件_C初学者手册:仅需几个小时即可学习C编程语言基础知识
- arm服务器测评_ARM搭建我的世界服务器教程,适用于树莓派