![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux
文章平均质量分 91
内核新视界
深耕底层技术,系统核心原理
展开
-
记一次x86 kvm虚机缺失 tlb flush 引发的 CVE 漏洞
linux 5.5 版本以下才会触发,之后的版本已经修复该问题。触发现象:在x86 intel 芯片上的 kvm 虚机环境中:当有多个进程或者多个线程在频繁或者多次执行 malloc,write,read,free 操作时,有概率触发任务程序崩溃产生 core dump 或者程序 abort。该问题触发对应。首先描述一下该 CVE 漏洞原文:上述崩溃触发原因是缺少 TLB flush,这可能使运行 KVM 客户机中的进程访问到它不应该访问的客户机中的内存位置。原创 2024-01-05 16:26:42 · 1128 阅读 · 0 评论 -
kvm虚拟化 steal time 机制详解
steal time 是指在虚拟化的环境下,管理机(host os,如 linux)窃取的虚拟机中的时间(虚拟机上的一个 vcpu 对应主机上一个线程,当该线程未在运行时,则是主机窃取的虚机时间),即 vcpu 没有在运行的时间。在虚机中执行 top 命令,其中有一个 st 字段,该字段数据则是描述主机窃取时间占比的。ps:对于真实物理机器:该字段永远为 0,如果是 guest os:该字段可能不为0,如果该字段占比较大,说明主机任务比较繁忙,该虚机被调度较少。原创 2024-01-05 11:10:37 · 1273 阅读 · 0 评论 -
kvm 虚拟化原理补充:x86虚拟化相关原理
当客户机执行一些特权指令或者发生外部事件时,比如 IO 访问,对控制寄存器的操作,MSR 的读写等,都会导致物理 cpu 发生 vm exit,停止运行客户机,将客户机保存到 VMCS 中,主机状态装入物理处理器中,处理器进入 root 模式,kvm 取得控制权,通过读取 VMCS 中 VM_EXIT_REASON 字段得到引起 vm exit 的原因。是否有其他路径抢占?退出之后,检查退出原因,如果有时钟中断发生,则插入一个时钟中断,如果是用户空间的中断发生,则退出原因填写 KVM_EXIT_INTR。原创 2024-01-05 10:38:43 · 1136 阅读 · 0 评论 -
arm64虚拟化技术与kvm实现原理分享
hypervisor(guest 管理机) 又称为 VMM(virtual machine monitor)(1)软件虚拟化不借助硬件支持,通过软件完整的模拟一台虚拟机 => qemu tcg。(2)硬件虚拟化根据 VMM 实现不同,硬件虚拟化包含 type1 hypervisor 和 type2 hypervisor 两种类型。type1(XEN,sel4) hypervisor 直接运行在硬件上,并管理系统中所有的硬件和虚拟机资源。原创 2024-01-05 10:28:07 · 1989 阅读 · 1 评论 -
linux-6.0 内核存储栈全景图
linux 存储栈原图地址:https://www.thomas-krenn.com/en/wiki/Linux_Storage_Stack_Diagram原创 2024-01-03 11:33:38 · 508 阅读 · 0 评论 -
multipath 内核接口及框架介绍
可以看到上述路径中在计算节点使用了 mutlipath 聚合路径来实现负载均衡和路径切换等。用户态工具相关:启动脚本udev 命令规则用户工具/usr/sbin/multipathd 守护进程,监听系统中路径状态的变化,并做相应的处理。/usr/sbin/mpathpersist SCSI PR命令工具,主要用于隔离。/usr/sbin/mpathconf 修改多路径配置/usr/sbin/kpartx DeviceMapper虚拟设备创建工具。原创 2024-01-03 11:30:47 · 1194 阅读 · 0 评论 -
云主机存储网络相关技术概念及网络拓扑介绍
早期的 SAN 存储系统中,服务器与交换机的数据传输是通过光纤进行的,因为服务器是把 SCSI 指令传输到存储设备上,不能走普通 LAN 网的 IP 协议,所以需要使用 FC 传输, 因此这种 SAN 就叫 FC-SAN。DRBD是镜像块设备,是按数据位镜像成一样的数据块。后期出现了用 IP 协议封装的 SAN,可以完全走普通 LAN 网络,因此叫做 IP-SAN,其中最典型的就是现在热门的 iSCSI。FC SAN、IP SAN 都要有存储管理软件(如卷管理、数据的快照、镜像、备份、恢复、 归档等等)。原创 2024-01-03 11:18:17 · 1187 阅读 · 0 评论 -
Linux iscsi/target 内核模块框架详细解析
SCSI(Small Computer System Interface),即小型计算机系统接口。SCSI 是一种智能的通用接口标准。一种用于计算机和智能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统级接口的独立处理器标准。它是各种计算机与外部设备之间的接口标准。SCSI 是个多任务接口,设有母线仲裁功能。挂在一个 SCSI 母线上的多个外设可以同时工作。SCSI 上的设备平等占有总线。SCSI 接口可以同步或异步传输数据。原创 2024-01-03 11:06:26 · 1384 阅读 · 0 评论 -
linux 热补丁机制基本概念
内核实现 livepatch 对架构,编译器等均有一些要求,比如编译器为架构提供可靠栈回溯,支持动态 ftrace regs 等,否则对应架构很难实现 livepatch,目前有 x86,powerpc,s390 能在内核直接支持 livepatch。kpatch 修补的单位是函数,而不是数据结构,如果补丁对数据结构进行了修改,那一般会出问题,需要重新制作补丁,默认不允许修改数据结构,如果这样做了,kpatch-build 可能会抛出错误。字符串,从打印中可以看到补丁应用成功,卸载补丁后恢复原来的字符串。原创 2024-01-03 10:21:14 · 1759 阅读 · 0 评论 -
arm64 UAO/PAN 特性对用户空间边界读写的影响(copy_from/to_user)
(1)(2)(3)在调用从用户空间拷贝的 api 时首先会调用 uaccess_enable_not_uao 来激活访问用户空间,这里其实调用的就是 SET_PSTATE_PAN(0) (先暂时不看 UAO 特性,假设这里没有启用 UAO 特性),禁用了 PAN ,那么此时使用 ldr/str 指令访问用户空间不会出现问题,当完成访问后调用 SET_PSTATE_PAN(1)再次开启 PAN 特性,所以这里就是在特殊的访问 api 中临时禁用 PAN,以便顺利访问用户空间。原创 2024-01-02 22:31:43 · 1411 阅读 · 0 评论 -
linux stop_machine 停机机制应用及一次触发 soft lockup 分析
可以看到报告 lockup 的点是 rcu_momentary_dyntick_idle 这个函数里面,触发 lockup 的线程是迁移线程migration/85:537。也就是说在迁移线程中调用 rcu_momentary_dyntick_idle函数触发了 lockup。该函数逻辑为:在 stop machine cpu 停机的状态下执行 msdata 中指定的回调。原创 2024-01-02 22:05:47 · 1808 阅读 · 0 评论 -
一次cfs组调度不公平引起的负载不均衡分析及cfs组调度深入探索(五)
根据之前分析,可以得到下面几个前提条件:1)对于 cfs_rq 的 load_sum 来源于任务节点下下所有调度实体 se 的 load_sum * se->load.weight 之和,同时由调度实体 attch/deattch 附加或者移除 load_sum。同时在对 cfs_rq 进行 pelt 更新时,也是根据当前 cfs_rq->load.weight * contrib 累加得来。其中 contrib 对于 cfs_rq 是当前周期的时间片 delta。原创 2024-01-02 20:31:03 · 839 阅读 · 0 评论 -
一次cfs组调度不公平引起的负载不均衡分析及cfs组调度深入探索(四)
那么为什么在(2)中 update_load_avg 第三个参数为零(该参数表示是否需要对对应的任务组负载进行更新),for_each_leaf_cfs_rq_safe 属于自底向上的依次遍历,那么在更新完child cfs_rq 后,在遍历下一个cfs_rq时拿到的即是 parent cfs_rq,因为我们每次都会对cfs_rq进行负载更新,所以在对 se 负载同步和广播负载时我们不需要多余的去更新任务组负载,反正遍历下一个节点时,如果负载有更新均会更新到任务组负载。原创 2024-01-02 20:26:47 · 791 阅读 · 0 评论 -
一次cfs组调度不公平引起的负载不均衡分析及cfs组调度深入探索(三)
对于 patch,在任务设置到任务组的时候在调用 attach_entity_cfs_rq 时,patch将任务对应的 cfs_rq(这里是 cfs_rq[30])将其加入到链表中,那么只要这个cfs_rq还有负载,就会在负载均衡时一直进行负载更新,直至移除负载或者衰减为0,那么此时向任务组贡献的load_avg将会正确衰减回归正确水平。从上述逻辑中可以看到,对于非睡眠任务负载会直接移除,并更新整个任务组负载,如果任务睡眠,负载并不会立即移除,而是在唤醒时附加到原有 cfs_rq->removed 中。原创 2024-01-02 20:14:06 · 955 阅读 · 0 评论 -
一次cfs组调度不公平引起的负载不均衡分析及cfs组调度深入探索(二)
1022y可以理解成由于经历了一个周期,因此上一时刻的负载需要衰减一次,因此1022需要乘以衰减系数y,2y可以理解成,2us属于上一个负载计算时距离一个周期1024us的差值,由于2是上一个周期的时间,因此也需要衰减一次,8是当前周期时间,不需要衰减。(4)用于标记该 cfs_rq 已经向 task_group 贡献的负载(load_avg),在update_tg_load_avg函数中用于计算向任务组贡献的负载,如果 cfs_rq 负载衰减,在更新任务组负载时任务组负载会逐渐降低。原创 2024-01-02 19:55:49 · 983 阅读 · 0 评论 -
一次cfs组调度不公平引起的负载不均衡分析及cfs组调度深入探索(一)
cfs group 深入分析,记录cfs组调度不公平性触发原理原创 2024-01-02 17:30:04 · 994 阅读 · 0 评论 -
linux top命令中 cpu 利用率/mem 使用率与load average平均负载计算方式
top 命令是 Linux 上一个常用的系统监控工具,它经常用来监控 Linux 的系统状态,是常用的性能分析工具,能够显示较全的系统资源信息,包括系统负载,CPU 利用分布情况,内存使用,进程资源占用情况等。这里主要看进程的 CPU%, MEM% 和 load averge 字段。原创 2024-01-02 16:29:29 · 3510 阅读 · 0 评论 -
ftrace 原理详细分析
ftrace 机制实现分析,ftrace 为内核调试带来了全新的跟踪机制,基于此也衍生了更过的 tracer,如 irqsoff,premmptoff,blk,stacktrace 等等一些内核 trace 机制原创 2023-08-03 11:29:15 · 699 阅读 · 0 评论 -
tracepoint 原理详细分析
tracepoint 机制是内核的静态事件点跟踪机制,提供了一系列的内核事件点跟踪,可以在 ftrace,perf,bpf 等其他跟踪器一起使用,为用户提供强大的内核调试机制和实际工程作用。原创 2023-08-03 11:23:48 · 1109 阅读 · 0 评论 -
kprobe 原理详细分析
内核调试机制 kprobe 原理详细分析,使用 kprobe 可以在内核任意位置设置 hook 并跟踪调试原创 2023-08-03 11:12:49 · 658 阅读 · 0 评论 -
早期内存分配器 memblock 详解
linux 内核启动早期阶段使用的内存分配接口,在完成前期初始化后,memblock管理的内存全部释放到伙伴系统原创 2023-08-03 11:04:24 · 658 阅读 · 0 评论 -
几个影响 cpu cache 性能因素及 cache 测试工具介绍
cpu cache 性能的影响因素以及一些 cache 的benchmark 工具介绍原创 2023-07-28 18:09:25 · 2782 阅读 · 2 评论 -
RCU 使用及机制源码的一些分析
rcu 使用说明,实现原理的简单分析原创 2023-07-28 16:47:54 · 1431 阅读 · 0 评论 -
wsl2安装及一些使用技巧
WSL2的安装及使用技巧原创 2022-01-17 17:43:11 · 47952 阅读 · 6 评论 -
Ftrace debugfs 接口使用说明(内核文档 ftrace.rst)
本文主要详细讲解linux下面ftrace的tracefs(debugfs)接口的使用方式,基本涵盖所有功能点的使用方式,及每个文件的具体作用,当然与之有关联的或拓展的功能如perf,kprobe等使用不在本次讲解范围。ftrace作为内核性能分析调优,跟踪内核行为等的强大工具,应该是每个内核开发人员或驱动开发人员需要掌握的一项调试手段,相信认真读完本文对ftrace的使用及帮助分析内核行为或者理解linux内核各个子模块源码是很有帮助的。原创 2021-12-01 16:52:10 · 2831 阅读 · 1 评论 -
ARM64启动过程分析
文章目录arm64启动过程分析arm64启动过程分析(一)boot protocolarm64启动过程分析(二)内核启动第一步arm64启动过程分析(三)创建启动阶段页表arm64启动过程分析(四)为开启mmu进行的cpu初始化arm64启动过程分析(五)开启mmuarm64启动过程分析(六)进入start_kernelarm64启动过程分析(七)其他一些功能实现arm64启动过程分析参考:DDI0487F_b_armv8_arm.pdf 蜗窝科技 ARMv8A Archarm64启动过程分析原创 2021-04-20 17:08:25 · 5994 阅读 · 0 评论 -
Linux下ARM64内核空间分布及页表查询
Linux下ARM64内核空间分布及页表查询下面的ko模块可用于查询内核空间及用户程序空间虚拟地址分布及属性,以及查询对应虚拟地址的物理地址。github地址https://github.com/MaybeYoc/pid_page_tables在git根目录Makefile中将KDIR指向自己的linux内核代码目录即可,使用make编译出pid_page_tables.ko。注意此ko适用于arm64架构。一. 打印内核空间地址分布使用命令echo kernel > /sys/kern原创 2021-04-20 17:01:54 · 2948 阅读 · 0 评论 -
VS Code Remote远程登陆linux服务器详解
VS Code Remote 发布!vscode远程登陆linux服务器详解北京时间 2019 年 5 月 3 日,在 PyCon 2019 大会上,微软发布了 VS Code Remote,开启了远程开发的新时代!这次发布包含了三款核心的全新插件,它们可以帮助开发者在容器、物理机器或虚拟机,以及 Windows Subsystem for Linux (WSL) 中实现无缝的远程开发。通过安...原创 2019-05-08 23:34:39 · 10555 阅读 · 0 评论 -
linux-0.11在gcc-4.3.0版本以上的编译和调试
在《Linux内核完全注释》一书中配置的环境只在CentOS 7上使用gcc-3.x编译成功并且运行,但书中对源码和Makefile的修改并不能用在gcc-4.x以上的版本。主要可能会出现:1. 大块数据拷贝方向位不正确。2. string.h中字符串操作导致数据和指针出现奇怪改变。3. 启用-On优化后出现问题(比如-O2优化会去优化链接顺序导致入口函数不正确)。4. get_fs_lo...原创 2019-02-08 15:01:10 · 1234 阅读 · 1 评论