- 博客(45)
- 收藏
- 关注
原创 rust中Atomic Ordering含义总结
Ordering除了可以对绑定到单个原子数据类型的操作上,也可以用在fence约束多条原子操作上,防止编译器和处理器对内存操作的重排,添加内存屏障(memory barrier),这也是构建临界区的一种方式。
2024-01-07 15:46:59
915
原创 mdbook 使用 Rust 创建书籍的 Markdown 工具
以及一些 vscode 插件提供的 markdown 编辑插件,推荐一个开源实用的由 rust 官方维护的。使用 Rust 创建书籍的 Markdown 工具。当我们使用 markdown 编写文档时,目前有。
2024-01-07 14:41:32
805
原创 记一次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
1094
原创 kvm虚拟化 steal time 机制详解
steal time 是指在虚拟化的环境下,管理机(host os,如 linux)窃取的虚拟机中的时间(虚拟机上的一个 vcpu 对应主机上一个线程,当该线程未在运行时,则是主机窃取的虚机时间),即 vcpu 没有在运行的时间。在虚机中执行 top 命令,其中有一个 st 字段,该字段数据则是描述主机窃取时间占比的。ps:对于真实物理机器:该字段永远为 0,如果是 guest os:该字段可能不为0,如果该字段占比较大,说明主机任务比较繁忙,该虚机被调度较少。
2024-01-05 11:10:37
1187
原创 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
1091
原创 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
1810
1
原创 linux-6.0 内核存储栈全景图
linux 存储栈原图地址:https://www.thomas-krenn.com/en/wiki/Linux_Storage_Stack_Diagram
2024-01-03 11:33:38
490
原创 multipath 内核接口及框架介绍
可以看到上述路径中在计算节点使用了 mutlipath 聚合路径来实现负载均衡和路径切换等。用户态工具相关:启动脚本udev 命令规则用户工具/usr/sbin/multipathd 守护进程,监听系统中路径状态的变化,并做相应的处理。/usr/sbin/mpathpersist SCSI PR命令工具,主要用于隔离。/usr/sbin/mpathconf 修改多路径配置/usr/sbin/kpartx DeviceMapper虚拟设备创建工具。
2024-01-03 11:30:47
1163
原创 云主机存储网络相关技术概念及网络拓扑介绍
早期的 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
1176
原创 Linux iscsi/target 内核模块框架详细解析
SCSI(Small Computer System Interface),即小型计算机系统接口。SCSI 是一种智能的通用接口标准。一种用于计算机和智能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统级接口的独立处理器标准。它是各种计算机与外部设备之间的接口标准。SCSI 是个多任务接口,设有母线仲裁功能。挂在一个 SCSI 母线上的多个外设可以同时工作。SCSI 上的设备平等占有总线。SCSI 接口可以同步或异步传输数据。
2024-01-03 11:06:26
1297
原创 linux 热补丁机制基本概念
内核实现 livepatch 对架构,编译器等均有一些要求,比如编译器为架构提供可靠栈回溯,支持动态 ftrace regs 等,否则对应架构很难实现 livepatch,目前有 x86,powerpc,s390 能在内核直接支持 livepatch。kpatch 修补的单位是函数,而不是数据结构,如果补丁对数据结构进行了修改,那一般会出问题,需要重新制作补丁,默认不允许修改数据结构,如果这样做了,kpatch-build 可能会抛出错误。字符串,从打印中可以看到补丁应用成功,卸载补丁后恢复原来的字符串。
2024-01-03 10:21:14
1614
原创 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
1310
原创 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
1685
原创 一次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
830
原创 一次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
778
原创 一次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
941
原创 一次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
967
原创 linux top命令中 cpu 利用率/mem 使用率与load average平均负载计算方式
top 命令是 Linux 上一个常用的系统监控工具,它经常用来监控 Linux 的系统状态,是常用的性能分析工具,能够显示较全的系统资源信息,包括系统负载,CPU 利用分布情况,内存使用,进程资源占用情况等。这里主要看进程的 CPU%, MEM% 和 load averge 字段。
2024-01-02 16:29:29
3104
原创 ftrace 原理详细分析
ftrace 机制实现分析,ftrace 为内核调试带来了全新的跟踪机制,基于此也衍生了更过的 tracer,如 irqsoff,premmptoff,blk,stacktrace 等等一些内核 trace 机制
2023-08-03 11:29:15
610
原创 tracepoint 原理详细分析
tracepoint 机制是内核的静态事件点跟踪机制,提供了一系列的内核事件点跟踪,可以在 ftrace,perf,bpf 等其他跟踪器一起使用,为用户提供强大的内核调试机制和实际工程作用。
2023-08-03 11:23:48
958
原创 早期内存分配器 memblock 详解
linux 内核启动早期阶段使用的内存分配接口,在完成前期初始化后,memblock管理的内存全部释放到伙伴系统
2023-08-03 11:04:24
563
原创 几个影响 cpu cache 性能因素及 cache 测试工具介绍
cpu cache 性能的影响因素以及一些 cache 的benchmark 工具介绍
2023-07-28 18:09:25
2478
2
原创 git reset撤销索引操作和git restore恢复工作树文件 (十)
文章目录1 git reset 重置当前HEAD到指定的状态1.1 概要2 git restore 恢复工作树文件2.1 概要3 导航页1 git reset 重置当前HEAD到指定的状态1.1 概要git reset [-q] [<tree-ish>] [--] <pathspec>...git reset [-q] [--pathspec-from-file=<file> [--pathspec-file-nul]] [<tree-ish>]gi
2022-03-20 10:31:52
1603
原创 git log查看提交历史 (九)
文章目录git log 显示提交日志1 概要2 导航页git log 显示提交日志1 概要git log [<options>] [<revision range>] [[--] <path>...]显示提交日志。该命令采用适用于git rev-list命令的选项来控制显示的内容和方式,以及适用于git diff-*命令的选项来控制每次提交引入的更改如何显示。选项:[--follow]继续列出重命名以外的文件历史记录(仅适用于单个文件)。[--no-
2022-03-20 01:29:05
1845
原创 git mv对跟踪文件进行移动重命名 (八)
文章目录git mv 移动或重命名文件、目录或符号链接1 概要2 导航页git mv 移动或重命名文件、目录或符号链接1 概要git mv <options>... <args>...移动或重命名一个文件,目录或者符号链接。 git mv [-v] [-f] [-n] [-k] <source> <destination> git mv [-v] [-f] [-n] [-k] <source> ... <destination
2022-03-19 11:50:54
525
原创 git rm从Git存储库移除对文件的跟踪 (七)
文章目录git rm 从工作树或者索引中移除文件1 概要2 导航页git rm 从工作树或者索引中移除文件1 概要git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>...从索引中或者工作树中删除文件。git rm不会从未跟踪的文件中删除文件,如果要删除请使用bin/rm。当给出--cached选项时将从索引中删除文件,而从存放到工作空间中。选项:<file&g
2022-03-17 20:51:25
488
原创 git diff查看文件在工作树和历史提交中的修改 (六)
文章目录git diff查看文件在工作树和历史提交中的修改1 git diff 概要git diff查看文件在工作树和历史提交中的修改1 git diff 概要git diff [<options>] [<commit>] [--] [<path>...]git diff [<options>] --cached [<commit>] [--] [<path>...]git diff [<options>] <
2022-03-17 01:02:22
1953
原创 ARMv8架构u-boot启动流程详细分析(二)
5 u-boot在汇编启动阶段对系统的一些初始化当cpu交由u-boot接管进入u-boot后,首先会到_start符号出开始执行初始化,并在此期间完成一些必要的系统寄存器相关的初始化,包括保存boot参数,进行地址无关fixed,系统寄存器复位,低平台相关初始化等,启动代码位于arch/arm/cpu/armv8/start.S,入口地址为_start。首先第一部分代码如下:/**************************************************************
2022-02-20 16:58:08
4337
原创 ARMv8架构u-boot启动流程详细分析(一)
文章目录1 概述2 armv8 u-boot的启动3 u-boot源码整体结构和一些编译配置方式3.1 编译配置方式注:本文基于armv8架构来对u-boot进行启动流程分析,u-boot版本为2022-01。1 概述首先引用wiki上的简介:u-boot 是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构。u-boot最先是由德国DENX软件中心团队开发,后续众多有志于开放源码bootloader移植工作的嵌入式开发人员将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支
2022-02-16 11:47:51
8350
4
原创 git status检查当前工作树文件状态 (五)
文章目录使用git status 显示工作树的状态1 git status 概要2 导航页使用git status 显示工作树的状态1 git status 概要git status [<options>...] [--] [<pathspec>...]显示索引中内容和HEAD的差异,工作树和索引文件的差异,工作树中没有被Git忽略的未跟踪文件。[-s, --short]以简短格式显示:[-b, --branch]显示分支信息:[--show-st
2022-01-21 17:01:56
732
原创 git commit提交更新到Git存储库 (四)
文章目录使用git commit 将索引中的更新文件提交到Git存储库中1 概要2 导航页使用git commit 将索引中的更新文件提交到Git存储库中1 概要 git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend] [--dry-run] [(-c | -C | --fixup | --squash) <commit>] [-F <
2022-01-21 15:41:40
1040
原创 git add跟踪新文件和加入索引 (三)
文章目录使用git add 跟踪新文件和将文件加入索引中1 git add概要2 导航页使用git add 跟踪新文件和将文件加入索引中1 git add概要git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]]
2022-01-19 17:05:57
1047
1
原创 git config配置Git (二)
文章目录使用git config配置Git1 git config 概要2 示例3 一些有用的配置变量4 导航页使用git config配置Git1 git config 概要git config [<file-option>] [--type=<type>] [--show-origin] [-z|--null] name [value [value_regex]]git config [<file-option>] [--type=<type>]
2022-01-19 11:20:18
1535
原创 git init和git clone获取仓库 (一)
使用git init和git clone获取git仓库通常获取git仓库有两种方式:将本地未进行版本控制的本地目录转换为Git仓库;从其他服务器上克隆一个已存在的Git仓库;1 git init在本地目录上创建Git仓库git init [-q | --quiet] [--bare] [--template=<template_directory>] [--separate-git-dir <git dir>] [--shar
2022-01-18 22:53:19
1794
原创 git命令详细使用方式讲解及记录
目的本系列文章主要记录一些常用git命令的详细用法,使其作为一个工具书的形式查阅使用,比如在需要使用git完成某些操作时查阅本系列文章找到对应的用法,又比如想要拓展一下git的使用,找到一些自己没有用过的git功能或者一些命令的高级使用技巧。适用人群本系列文章并不作为一个git教程使用,不会从零开始讲解git的历史,安装下载,工作原理,基础命令使用,而是以介绍命令的形式详细介绍每个命令的详细使用方式。所以文章默认你是已经使用过git并对git的工作原理有一定理解,能够使用git的一些基本命令完成简单的
2022-01-18 13:55:11
787
原创 Ftrace debugfs 接口使用说明(内核文档 ftrace.rst)
本文主要详细讲解linux下面ftrace的tracefs(debugfs)接口的使用方式,基本涵盖所有功能点的使用方式,及每个文件的具体作用,当然与之有关联的或拓展的功能如perf,kprobe等使用不在本次讲解范围。ftrace作为内核性能分析调优,跟踪内核行为等的强大工具,应该是每个内核开发人员或驱动开发人员需要掌握的一项调试手段,相信认真读完本文对ftrace的使用及帮助分析内核行为或者理解linux内核各个子模块源码是很有帮助的。
2021-12-01 16:52:10
2651
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人