一篇让你掌握Linux内核,漏洞安全与虚拟内存管理(值得大神们收藏)
Linux内核面试常见高频问题如下:
高速侧信道攻击的原理机制?
CPU熔断漏洞攻击?
CPU“幽灵”漏洞变体攻击原理机制?
一、CPU熔断/幽灵漏洞解决方案
侧信道攻击(SCA):密码学中常见暴力攻击。针对加密电子设备在运行过程中时间消耗、功率消耗、电磁辐射之类的侧信道信息泄露而对加密设备进行攻击。L1高速缓存是靠近CPU核心,它的访问速度是最快。(大约300个时钟周期,时间差异来进行攻击)。
通过视图来研究:高级缓存侧信道攻击中破解数据的流程,具体如下:
攻击者清空user_probe对应的高速缓存行;
攻击者访问受限地址attacked_mem_addr,CPU发生异常现象;
由于乱序执行,CPU预取了attacked_mem_addr的值;
根据预取的值来访问user_probe,CPU把数据加载到高速缓存行里;
遍历User_probe数据,测量访问时间来推测attacked_mem_addr的值。

乱序执行、异常处理及地址空间(熔断漏洞和计算机架构紧密相关)
【文章福利】小编推荐自己的Linux内核技术交流群:【891587639】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!前100名进群领取,额外赠送一份价值699的内核资料包(含视频教程、电子书、实战项目及代码)

乱序执行流水线中有两个功能:
消除指令之间的寄存器读后写(WAR)相关和写后写(WAW)相关;
当指令发生例外或者转移指令猜测错误而取消后面的指令时,可用来保证现场精确。
我们从处理器角度分析,指令顺序发车,乱序超车,顺序归队,这个容器就是保留站,这种乱执行的机制就是我们所讲的乱序执行。
// 物理地址到虚拟地址转换由这个宏__va来完成的




从上面的流程:就是物理地址转换成虚拟地址就完成,其实加上一个大小为0xffff888000000000的偏移量即可。
虚拟地址到物理地址的转换就更简单,直接将偏移量减掉就可以。



二、PAS/mm_struct详解
malloc()是用户态常用的分配内存接口函数,mmap()是用户态用于建立文件映射或匿名映射的函数。 比如进程地址空间在内核中用struct vm_area_struct数据结构进行描述,简称为VMA,也被称为进程地址空间或进程线性区。因为这些地址空间归属用户进程,所以在用户进程的struct mm_struct数据结构也有相应的成员。
1、PAS(进程地址空间):指进程可寻址的虚拟地址空间
在32位CPU当中,进程可以寻址4GB的地址空间,但是进程没有权限去寻址内核空间的虚拟地址,只能通过系统调用的方式间接访问。内存区域包含内容:代码段映射、数据段映射、用户进程的栈、堆映射区域、MMAP映射区域。
2、内核描述符mm_struct
Linux内核需要管理每个进程所有的内存区域及它们对应的页表映射,所以必须抽象出一个数据结构(mm_struct)。进程的进程控制块(PCB)数据结构task_struct中有一个指针mm指向这个mm_struct数据结构。
A、task_struct(进程描述符)内核对应源码分析如下:
我们从进程的角度来看内存管理 ,直接沿着mm_struct数据结构进行进一步延伸和思考,具体结构视图如下:

B.VMA管理(vm_area_struct)
三、malloc系统调用
在C语言程序设计当中,malloc()是志专门用于内存分配函数。假设系统中有进程X和进程Y,分别使用FuncX和FuncY函数分配对应内存。
malloc()函数-->Linux内核系统调用brk向系统申请内存。在32位Linux内核中,每个用户进程拥有3GB的虚拟空间。用户进程的可执行文件由代码和数据段组成,数据段包括所有的静态分配的数据空间,比如全局变量、静态局部变量等。这些空间在可执行文件装载时,内核就为其分配好这些空间,包括虚拟地址和物理页面。Linux内核brk系统调用视图如下:

处理器的MMU硬件单元处理最小单元为页,所以内核分配内存、建立虚拟地址和物理地址映射关系都以页为单位,PAGE_ALIGN(addr)宏让地址addr按页面大小对齐。
Linux内核malloc函数实现流程视图如下:

