Linux Kernel 学习笔记
1 一些有用的资料
内含大量示例与分析
Github上硬核的免费的Cookbook。 内涵大量的示例
上海交通大学 陈海波 夏虞斌教授著
由浅入深介绍现代操作系统经典理论与方法
这本书的内容较为新颖,与传统的《操作系统概念》等书以x86体系为主导,基本以介绍Linux、UNIX等宏内核架构的操作系统为主不同,该书也会堆当前已广泛流行的ARM等体系结构进行讲解,溶蚀对当前新兴而又经典的微内核架构等系统进行深入介绍。
2 kernel 开发环境
开发环境采用 ubuntu虚拟机、xshell、vscode (remote插件)
也可以使用实体机 或者直接在虚拟机里使用vscode/vim/gedit 等编辑器和shell进行开发
但是在windows环境下进行 个人觉得效率更高
ubuntu虚拟机的版本为
Linux ubuntu 5.11.0-25-generic #27~20.04.1-Ubuntu SMP Tue Jul 13 17:41:23 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
内核版本
linux-headers-5.11.0-25-generic - Linux kernel headers for version 5.11.0 on 64 bit x86 SMP
配置环境时,需要为ubuntu虚拟机配置静态ip方便 xshell和vscode通过ssh协议连接上虚拟机,之后就可以在windows中愉快的coding了
关于使用vscode的自动补全功能,可以在在vscode中按Ctrl+Shift+P 然后输入edit选择C/C++ 配置,之后在c_cpp_properties.json文件中配置头文件包含路径
具体就是在"includePath"下加上下列三条, 因为内核版本不同中间的
linux-headers-5.11.0需要修改成自己对应的目录"/usr/src/linux-headers-5.11.0-25-generic/include", "/usr/src/linux-headers-5.11.0-25-generic/include/linux", "/usr/src/linux-headers-5.11.0-25-generic/arch/arm/include"
3 linux 内核保护
3.1 SMAP(Supervisor Mode Access Prevention)
管理模式访问保护
作用是禁止内核CPU访问用户空间的数据
3.2 SMEP(Supervisor Mode Exectuion Prevention)
管理模式执行保护
禁止内核态执行用户态的代码
当CPU处于ring0模式(即内核态时),执行用户空间的代码 会触发页错误 这个保护在arm 中被称为PXN
3.3 KPTI(Kernel Page Table Isolation)
内核页表隔离
KPTI补丁基于KAISER,它是一个用于缓解不太重要问题的早期补丁,当时业界还未了解到Meltdown的存在。
如果没有KPTI,每当执行用户空间代码(应用程序)时,Linux会在其分页表中保留整个内核内存的映射,并保护其访问。这样做的优点是当应用程序向内核发送系统调用或收到中断时,内核页表始终存在,可以避免绝大多数上下文切换相关的开销(TLB刷新、页表交换等)。
KPTI通过完全分离用户空间与内核空间页表来解决页表泄露。支持进程上下文标识符(PCID)特性的x86处理器可以用它来避免TLB刷新,但即便如此,它依然有很高的性能成本。据KAISER原作者称,其开销为0.28%[2];一名Linux开发者称大多数工作负载下测得约为5%,但即便有PCID优化,在某些情况下开销高达30%。
使用内核启动选项“pti=off”可以部分禁用内核页表隔离。依规定也可对已修复漏洞的新款处理器禁用内核页表隔离。

浙公网安备 33010602011771号