- 博客(124)
- 资源 (7)
- 收藏
- 关注
原创 gdb调试多进程多线程
由于bianry2是在binary1中调用的,不适合使用“gdb binary”的形式进行debug,只能在程序运行之后找到birnary2的pid,然后通过pid调试。我的办法是结合进程的log,大概定位到问题代码,然后在对应函数里面wait一段时间,这样我们在用gdb之前可以先等上一段时间,确定代码已经进入问题函数再去用gdb调试。进入调试终端后看到的都是主进程的上下文,而问题出在其中一个线程,所以要再进入对应线程调试终端。这个时候就可以开始调试了。
2023-03-27 09:00:58 443
原创 添加信号处理函数debug程序异常退出
signal处理的几种现有的工具,主流的signal_hook感觉有点复杂,不太适合我的需求。我希望得到一个类似于c中sigaction的东西。rust也是提供了的。最近在debug rust写的程序异常退出问题,没有任何log。猜测可能是被kill掉。通过手动添加signal handle来尝试打印出出错信息发现了问题所在。这个例子中,你首先要知道给哪个signal安装handle。为此我找到了另外一个工具,可以简单的获取信号类型。一旦我们得到信号类型,我们就可以据此安装相应的handler。
2023-03-15 16:23:47 258
原创 rust中循环忙等的实现
有时候我们需要在rust中通过忙等来实现延时。相比sleep,这种方式对栈和寄存器的破坏较小。但是你要防止你选取的寄存器会破坏函数的寄存器,所以有一定的风险,如果你能得到反汇编的代码会更好的控制寄存器选取,避免冲突。rust编译器的stable版本缺少禁止优化的feature。我们可以通过内联汇编来达到同样的目的。
2023-03-15 14:35:13 351
原创 linux内核随机数初探
根据测试在系统时钟是200M的机器上samples_per_bit的值是1,也就是每次都会调用credit_init_bits.在系统时钟频率是25M的机器上samples_per_bit是2,也即每两次entropy_timer调用,调用一次credit_init_bits.系统时钟频率越高此值越大。根据测试,采样的用数量大约在250次左右,不同机器差异不大,如此,影响随机数初始化时间的因素包括硬件:系统时钟的频率;本机上大部分的调用都是entropy_timer, 即大部分的熵的来源是时钟中断。
2022-09-28 09:10:29 2354
原创 如何编译musl libc
在使用编译rust项目时如果需要musl-gcc编译可以会出现musl静态库找不到的情况,比如libseccomp.a。折腾很久才找到一个办法去手动编译musl静态库。编译musl静态库的难点在你需要一个完整的musl toolchin。 怎么在ubuntu上搭建这个环境我还没研究过,也怕吧gnu的环境搞坏,在我发现有些distro支持原生musl库这个问题就容易多了。alpine就是其中一个。起一个alpine的容器,然后在里面clone库的源码,正常编译即可。可能会遇到很多工具缺失的情况,goo
2022-05-17 16:56:42 1600 1
原创 基于arm64的linux kernel cpu 初始化分析
从start_kernel开始分析init/main.cstart_kernel | smp_setup_processor_id | setup_arch | setup_nr_cpu_ids | setup_per_cpu_areas | smp_prepare_boot_cpu | boot_cpu_hotplug_init | arch_call_rest_init
2022-04-08 21:05:57 1208
原创 qemu monitor qom-get 获取device property
加上-monitor unix:qemu-monitor-socket,server,nowait启动qemu,从另一个shell进入monitor。info qom-tree可以看到所有的device以qom格式展示。通过qom-get可以得到对应设备的指定propoty。info qom-tree大概长这个样子:(qemu) info qom-treeinfo qom-tree/machine (virt-6.2-machine) /device-memory[0] (memory-r
2022-03-25 16:12:40 1539
原创 在arm64上基于qemu的vhost user blk设备hotplug
在kata中,vhost user blk设备是hotplug进去的。本文记录一下如果在qemu中hotplug一个vhost user blk设备。首先准备一个设备,以spdk设备为例。build spdkgit clone https://github.com/spdk/spdk.gitcd spdk; ./configure; make -j `nproc`制作vhost user blkmkdir -p block/socketsbuild/bin/spdk_tgt -
2022-03-19 15:52:26 1819
原创 如何给用containerd启动的kata容器添加网络
如果直接用ctr创建容器,那么容器内部是没有网络的。这是因为containerd属于CRI模块,网络是由CNI组件去完成的,因此要想有网先要搞定cni。好消息是已经有个非常好的工具可以像docker一样使用containerd的service启动有网络的容器。这就是nerdctl, 使用方法参见https://github.com/containerd/nerdctl可惜这个工具虽好但是对kata容器支持的不够完善,只能启动kata但是却没有给kata容器建立网络。我发现一个办法可以给kata添加网
2021-10-27 18:13:30 886
原创 kexec如何绕过virtio_mem热插拔的内存
virtio_mem是kernel的新feature,以virtio设备的形式给虚拟机热插拔内存。kexec是可以在当前系统上替换运行kernel的feature。当虚拟机中通过virtio_mem添加内存后再通过kexec去替换现有的kernel可能会产生一些意想不到的问题。因此需要让kexec避免使用这段新添加的内存。kexec有多种形式。主要是kexec_load和kexec_file_load两种。在第一中形式中,kexec会通过扫描/proc/iomem来准备new kernel的内存,通
2021-10-27 18:03:02 366
原创 ubuntu启动进入grub shell的修复办法
有时候ubuntu启动会进入grub界面,即便能手动进入系统重启可能还是会进入grub。这里有一个办法可以fix这个问题。首先要进入grub,这里有个简单的办法:grub> configfile ($root)/EFI/GRUB/grub.cfg如果这个办法不行,就按下面的办法:#ls查看硬盘分区grub> ls#比如root分区时hd0,gpt1grub> set root=hd0,gpt1grub> set prefix=(hd0,gpt1)/boot
2021-09-07 13:19:48 3345
原创 rust交叉编译
目标: 在linux x86_64环境编译arm64的bin环境:ubuntu 20.04的容器环境,arch为x86_64安装rust环境curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh#设置环境变量echo "PATH=$PATH:/root/.cargo" >> /root/.bashrc. /root/.bashrc新建rust项目cargo new hello; cd hello
2021-08-11 17:53:07 1103 1
原创 Job for xx.service Canceled的解决办法
在使用systemd来控制service状态时比如systemctl stop xx,有时候会出现:Job for xxcanceled这是systemd中打出的错误,源码在https://github.com/systemd/systemd/blob/d61ee727f037ab4e07af720ab34055e9cafe9cec/src/shared/bus-wait-for-jobs.c#L238systemd中对这种情形的解释是:Job canceled by a conflictin.
2021-07-07 10:20:28 4576
原创 Linux slab分配器笔记
伙伴系统是面向大块内存请求,基本单位是page。对于小块内存的分配,slab是比较常用的分配器。首先要明确,slab分配器也是建立在伙伴系统之上的。最常用的分配函数kmalloc,入参size是以字节为单位的,它就是利用slab分配器实现的。slab有两个重要的优点:一是可以分配小块内存,二是可以加快内存分配。这跟它的实现原理有关。slab简单来讲就是首先在伙伴系统的基础上分配出一批大小相同的内存块,这些内存块一般是某个常用的数据结构,然后把这些内存块缓存起来,等到需要的时候就直接分配出来,无需再经
2021-07-06 20:52:32 93
原创 linux 基于伙伴系统的内存分配笔记
上一篇记录了伙伴系统的组织结构,这一篇记录一下基于伙伴系统的具体分配策略。一、分配接口alloc_pages(gfp_tgfp_mask,unsignedintorder)
2021-06-30 22:42:49 262
原创 GIC ITS在snapshot之后的恢复顺序
snapshot是VMM的一个特性。原理是将处于某个节点运行的VM stop并保存所有内存和寄存器的状态,然后在恢复运行时再将所有上下文restore到相应的寄存器中。本文基于kernel文档记录一下GIC ITS的恢复顺序。在kernel文档virt/kvm/devices/arm-vgic-its.rst的记录中,对gic its的恢复顺序如下:1、恢复所有客户机内存并创建vcpu;2、恢复所有gicr_*寄存器;3、提供ITS的基地址;4、恢复ITS: a、恢复...
2021-06-27 22:33:02 137
原创 linux 伙伴系统内存组织笔记
上一篇记录了伙伴系统的初始化,这里记录一下伙伴系统工作原理。伙伴系统(buddy system)是内存管理的基础,很多内存分配接口底层都是伙伴系统。比如常见的kmalloc。
2021-06-16 22:55:06 161 2
原创 Linux伙伴系统初始化
上一篇文章记述了node和zone初始化的基本流程。本篇记录一下伙伴系统初始化。linux内存初始化:asmlinkage __visible void __init __no_sanitize_address start_kernel(void){ ... //跟架构相关,zone,node初始化 setup_arch(&command_line); ... //zonelists 初始化 build_all_zonelists(NULL); page_al
2021-06-15 23:06:12 372
原创 linux内存初始化笔记
内存是计算机的重要的硬件资源。如果没有软件的管理,再多再快的内存也只是摆设。在管理内存之初是对内存的初始化。本文基于内核源码和一些参考资料谈谈我的理解。硬件内存:
2021-06-14 20:55:02 654
原创 git 如何重新切分commit
有时候对于已经完成的提交想要重新切分成多个commit。例如,新建三个文件1 2 3,然后一起提交。commit e8772b47bbd60c8fbfec2652da6501e5b6442fdc (HEAD -> master)Author: xxx <xx.xx@xx.com>Date: Wed Apr 21 13:24:08 2021 +0800 new file 1 2 3现在我不像让他们一起提交了,我想单个文件提交。这时候用git reset --
2021-04-21 13:36:39 661
原创 Linux上性能调试工具笔记
最近在看《性能之巅》,里面有很多有用的工具,记下来先。cpuuptime:可以显示1分钟、5分钟、15分钟的cpu平均负载。vmstat: 显示用户时间,系统时间,空间时间,等待io的cpu空间时间的平均数。mpstat: 显示每个cpu的统计信息,包括中断,上下文切换,锁等待,系统调用等的时间sar: ps: topprstat:pidstat:按进程或线程打印cpu使用量dtrace , perf都是很强大的工具,待续。。。...
2021-04-19 22:25:26 81
原创 如何将机器码转换为汇编代码
在linux内核里面有很多脚本工具,位于linux/scripts/。里面有一个decodecode工具可以用来转换机器码,用法如下:比如有一行armv8的机器码:f2a800e8,将其翻译成汇编。:$ echo "f2a800e8" > code:$ ./decodecode < codeCode starting with the faulting instruction===========================================0: f2a8
2021-03-09 12:23:00 3920
原创 在qemu虚拟机中使用vhost-net时如何创建多个vhost线程
本文参考了https://gist.github.com/mcastelino/43cc733e53d65ef67452ecaf78e936c2vhost-net是一种较virtio-net更为高效的网络虚拟化技术。在qemu中使用vhost-net非常容易,只需在-netdev tap,之后加上vhost=on。但是默认情况下host只会产生一个vhost线程,当虚拟机有多个核心时无法发挥最大的效率。下面展示一下如何创建与vcpu数量匹配的vhost线程数。qemu \...-netdev.
2021-03-03 21:42:20 880 1
原创 cannot open display的解决办法
使用linux的server版是没有图形化界面的,但是有时候图形化界面又是必须的,比如执行gparted就需要有个可交互的图形化界面,这个时候经常会有“Gtk-WARNING **: 11:43:53.553: cannot open display:” 的错误,今天终于找到解法了,记一下。1 设置一下server 端的/etc/ssh/sshd_configX11Forwarding yes2 client端执行xhost +关闭client端的访问控制3 以打开x11转发的方式
2021-01-25 11:59:17 47048
转载 Armv8架构虚拟化介绍
https://calinyara.github.io/technology/2019/11/03/armv8-virtualization.htmlNOVEMBER-3-20191 综述本文描述了Armv8-A AArch64的虚拟化支持。包括stage 2页表转换,虚拟异常,以及陷阱。本文介绍了一些基础的硬件辅助虚拟化理论以及一些Hypervisor如何利用这些虚拟化特性的例子。文本不会讲述某一具体的Hypervisor软件是如何工作的以及如何开发一款Hypervisor软件。通过阅读本文
2021-01-05 22:02:19 1149 1
原创 编译qemu/arm64的uefi
在arm64上启动qemu虚拟机有两种方式,一种是通过-kernel 的方式直接direct kernel boot,另一种是先启动uefi在bootkernel。本文记录一下怎么编译qemu/arm64 的uefi。uefi可以大概理解为bios的升级版。它是一个开放的标准,并没有官方的实现。目前用的比较多的实现是intel开源的https://github.com/tianocore/edk2。这个edk2是一个可以跨平台编译uefi的项目,arm64也是用的这个代码。编译主要是参照arm的开发
2021-01-05 15:31:54 4026
原创 vfio设备直通虚拟机
vfio设备直通虚拟机可以使虚拟机直接与虚拟机交互获得较好的性能。关于vfio的详细讲解我觉得李强的《qemu/kvm源码分析与应用》讲的很好。本文只讲一下如何使用。环境要求:host kernel:设置如下configCONFIG_VFIO_IOMMU_TYPE1=m CONFIG_VFIO=mCONFIG_VFIO_PCI=m关闭 CONFIG_VFIO_NOIOMMU重新编译安装kernel后重新启动。绑定设备到vfio,以网卡设备为例 lspci -D | grep
2020-10-16 15:53:16 1924
转载 使用Ubuntu自带的系统盘制作工具
使用ubuntu自带工具Startup Disk Creator 制作USB启动盘向灯塔而行2019-06-04 06:32:166218收藏分类专栏:Linux版权一切有为法,如梦如幻,亦如露如电,应作如是观。1.Insert a USB stick with at least 2GB of free space.2Open the dash and ...
2020-09-17 10:18:09 1757
原创 如何在arm64 host上创建arm32 kvm虚拟机
大约在今年五六月份(kernel 5.7),arm kernel社区的maintainer Marc Zyngier移除了对arm32 kvm的支持,也就是在kernel 5.7以后不能在arm32的host上创建kvm虚拟机。但是在arm64的host上还是可以创建arm32 kvm虚拟机的,本文就介绍一下如何在arm64的host上创建arm32虚机。arm64的host最容易获得的是树莓派,最好在树莓派4上安装64位的ubuntu。本文以树莓派4-ubuntui系统为例。创建虚机需要的原料
2020-09-14 13:45:48 1143
原创 linux的ksm特性的使用限制
ksm(kernel same-page merging)是Linux kernel合并相同内存页面的特性,初期为虚拟化所用,在非虚拟化下也有类似的场景。ksm的使用是有限制的。ksm只能用来合并私有匿名映射(文档是这么写的).但是查看kernel源码我没发现对文件映射的限制。在很多场景下,私有文件映射也是会产生大量相同页面的,用来进行合并是很合适的,所以我猜测ksm是可以用来对私有文件映射进行合并。此外,对于dax的页面,ksm也是不能合并的。这些限制从code中很容易找到:case MADV.
2020-07-13 14:57:47 675
原创 tcp传输控制博客收藏
https://baijiahao.baidu.com/s?id=1664395039305097355&wfr=spider&for=pchttps://blog.csdn.net/qq_41431406/article/details/97926927
2020-06-03 16:32:50 140
原创 通过对比kernel参数来debug网络测试性能问题
最近发现一个问题,用iperf测试的虚拟机带宽,对于5.4kernel的guest的带宽明显小于使用4.14的kernel,通过对比tcp的kernel参数看到5.4kernel采用bbr的拥塞控制算法而4.14 使用cubic。在5.4的kernel上打开cubic后发现带宽正常。由此可见,当测试网络性能出现问题时,最为有效的策略时查看环境参数。关于kernel的网络参数可以使用sysctl或者在/proc/sys/net下进行查看。例如:sysctl -A |grep tcpkernel查看到有
2020-06-03 14:54:47 233
转载 vhost 工作原理
http://blog.vmsplice.net/2011/09/qemu-internals-vhost-architecture.html
2020-05-04 16:32:28 493
原创 qemu虚拟机的实时时钟从哪里来
对于物理机而言时间是实时时钟(rtc)+启动后时间(boot up time)的和。rtc一般是存在于cmos存储中,它是一个类似于flash的东西,掉电不失,可读写的存储空。rtc存储在里面,每次机器启动的时候读一次就知道机器刚刚启动时的时间了。对于虚机要想知道启动时的时间就需要vmm提供类似于rtc的东西。也就是模拟rtc设备。对于qemu-kvm虚拟机,qemu就负责模拟rtc。qe...
2020-03-12 15:10:50 3208 1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人