linux
jongwu3
这个作者很懒,什么都没留下…
展开
-
vCPU hotplug on Arm
vcpu hotplug在Arm上的支持原创 2022-11-07 12:35:06 · 297 阅读 · 0 评论 -
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 · 2076 阅读 · 0 评论 -
qemu+gdb调试linux kernel的注意事项
调试内核的注意事项原创 2022-07-18 11:41:48 · 335 阅读 · 0 评论 -
深入理解memory barrier
这里有个讲解内存屏障的链接,从硬件实现上阐述为什么需要内存屏障,以及内存屏障的作用原创 2022-07-18 11:33:24 · 82 阅读 · 0 评论 -
如何编译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 · 1409 阅读 · 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 · 1045 阅读 · 0 评论 -
在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 · 1700 阅读 · 0 评论 -
挂载qcow2 image
如何挂载qcow2镜像翻译 2022-02-14 17:51:42 · 472 阅读 · 0 评论 -
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 · 323 阅读 · 0 评论 -
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 · 4240 阅读 · 0 评论 -
Linux slab分配器笔记
伙伴系统是面向大块内存请求,基本单位是page。对于小块内存的分配,slab是比较常用的分配器。首先要明确,slab分配器也是建立在伙伴系统之上的。最常用的分配函数kmalloc,入参size是以字节为单位的,它就是利用slab分配器实现的。slab有两个重要的优点:一是可以分配小块内存,二是可以加快内存分配。这跟它的实现原理有关。slab简单来讲就是首先在伙伴系统的基础上分配出一批大小相同的内存块,这些内存块一般是某个常用的数据结构,然后把这些内存块缓存起来,等到需要的时候就直接分配出来,无需再经原创 2021-07-06 20:52:32 · 78 阅读 · 0 评论 -
linux 基于伙伴系统的内存分配笔记
上一篇记录了伙伴系统的组织结构,这一篇记录一下基于伙伴系统的具体分配策略。一、分配接口alloc_pages(gfp_tgfp_mask,unsignedintorder)原创 2021-06-30 22:42:49 · 221 阅读 · 0 评论 -
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 · 117 阅读 · 0 评论 -
linux 伙伴系统内存组织笔记
上一篇记录了伙伴系统的初始化,这里记录一下伙伴系统工作原理。伙伴系统(buddy system)是内存管理的基础,很多内存分配接口底层都是伙伴系统。比如常见的kmalloc。原创 2021-06-16 22:55:06 · 137 阅读 · 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 · 311 阅读 · 0 评论 -
linux内存初始化笔记
内存是计算机的重要的硬件资源。如果没有软件的管理,再多再快的内存也只是摆设。在管理内存之初是对内存的初始化。本文基于内核源码和一些参考资料谈谈我的理解。硬件内存:原创 2021-06-14 20:55:02 · 608 阅读 · 0 评论 -
git 如何重新切分commit
有时候对于已经完成的提交想要重新切分成多个commit。例如,新建三个文件1 2 3,然后一起提交。commit e8772b47bbd60c8fbfec2652da6501e5b6442fdc (HEAD -> master)Author: xxx <[email protected]>Date: Wed Apr 21 13:24:08 2021 +0800 new file 1 2 3现在我不像让他们一起提交了,我想单个文件提交。这时候用git reset --原创 2021-04-21 13:36:39 · 624 阅读 · 0 评论 -
Linux上性能调试工具笔记
最近在看《性能之巅》,里面有很多有用的工具,记下来先。cpuuptime:可以显示1分钟、5分钟、15分钟的cpu平均负载。vmstat: 显示用户时间,系统时间,空间时间,等待io的cpu空间时间的平均数。mpstat: 显示每个cpu的统计信息,包括中断,上下文切换,锁等待,系统调用等的时间sar: ps: topprstat:pidstat:按进程或线程打印cpu使用量dtrace , perf都是很强大的工具,待续。。。...原创 2021-04-19 22:25:26 · 74 阅读 · 0 评论 -
如何将机器码转换为汇编代码
在linux内核里面有很多脚本工具,位于linux/scripts/。里面有一个decodecode工具可以用来转换机器码,用法如下:比如有一行armv8的机器码:f2a800e8,将其翻译成汇编。:$ echo "f2a800e8" > code:$ ./decodecode < codeCode starting with the faulting instruction===========================================0: f2a8原创 2021-03-09 12:23:00 · 3630 阅读 · 0 评论 -
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 · 42257 阅读 · 0 评论 -
编译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 · 3605 阅读 · 0 评论 -
一种简单的qemu网络配置方法
qemu上网是一件头疼的事,搜索了很多方法都是不可靠的,最终想到了一种权宜之计。qemu上网的一种主要的方式是在host上配置好网桥,将tap设备添加到网桥上,在起qemu虚拟机的时候用tap作为网络设备,这种方法的关键是怎么在host上配置可以上网的网桥。利用现成的可以用的网桥就是我要讲的权宜之计,docker0就是这种可以用的网桥。docker默认的网络模式是桥接,就是在host上创建一个do...原创 2018-05-29 16:12:11 · 12385 阅读 · 5 评论 -
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 · 1785 阅读 · 0 评论 -
使用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 · 1692 阅读 · 0 评论 -
linux的ksm特性的使用限制
ksm(kernel same-page merging)是Linux kernel合并相同内存页面的特性,初期为虚拟化所用,在非虚拟化下也有类似的场景。ksm的使用是有限制的。ksm只能用来合并私有匿名映射(文档是这么写的).但是查看kernel源码我没发现对文件映射的限制。在很多场景下,私有文件映射也是会产生大量相同页面的,用来进行合并是很合适的,所以我猜测ksm是可以用来对私有文件映射进行合并。此外,对于dax的页面,ksm也是不能合并的。这些限制从code中很容易找到:case MADV.原创 2020-07-13 14:57:47 · 630 阅读 · 0 评论 -
通过对比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 · 211 阅读 · 0 评论 -
Linux中的dax特性
在Linux中由于块设备一般属于低速设备,访问成本很高,为了减少访问块设备的次数内核一般会将访问磁盘的内容缓存起来,等下次访问时直接从内存中获得结果,这大大提高了系统的性能。所以说缓存是个好东西。但是随着技术进步,一些类似于内存的块设备出现了,主要的有Intel的nvdimm设备,它是一种既可以当磁盘又可以当内存使用的存储设备,它的名字是非易失性内存,速度可以比肩内存,而又不会掉电丢数据。如果...原创 2020-03-10 18:13:07 · 2528 阅读 · 0 评论 -
浅说ksm的适用范围
ksm(Kernel Samepage Merging)是linux内核中一个feature,通过合并内存中的相同页面来减小内存占用,常用语虚拟化中。ksm合并的一般是用户分配的内存(能不能用在内核页面我还不清楚)。关键的是它只能合并私有的匿名页面。想了解更多的有关页面的分类可以查看man mmap。如果想让自己分配的页面可以被ksm优化,那就必须显示声明出来。方法是使用madvise接口,一...原创 2020-02-14 10:32:11 · 442 阅读 · 0 评论 -
runc容器中的”钓鱼执法“
如今最流行的容器运行时就是runc和kata-container。一般而言runc比kata效率高,kata比runc安全。我在测试中发现他们之间不易察觉的另一个隐秘的区别, 我把它叫“钓鱼执法”举个例子:docker run -d -m 4G tensorflow tensorflow这个例子我没运行过,我的意思是当我们给容器设定一个内存限制时,对于runc和kata将有不同的表现...原创 2019-12-24 12:03:21 · 305 阅读 · 0 评论 -
转: qemu-kvm内存管理
记得很早之前分析过KVM内部内存虚拟化的原理,仅仅知道KVM管理一个个slot并以此为基础转换GPA到HVA,却忽略了qemu端最初内存的申请,而今有时间借助于qemu源码分析下qemu在最初是如何申请并管理虚拟机内存的,坦白讲,还真挺复杂的。一、概述qemu-kvm 模型下的虚拟化引擎,内存虚拟化部分要说简单也挺简单,在虚拟机启动时,有qemu在qemu进程地址空间申请内存,即内存的申请...转载 2019-12-16 18:53:52 · 758 阅读 · 0 评论 -
多线程的cache调优
一般使用多线程是希望它能带来比单线程更高的效率但是事实上常常事与愿违,一个粗糙的多线程可能得到比单线程更差的性能。其中的原因可能是锁竞争也可能是调度,本文重点讨论cache对多线程的影响。举个简单的例子:我的机器上CPU拓扑:我有四个cpu但是每两个CPU是共享一级二级cache的,这个对编程影响很大。cache line是64B。硬件上知道这些就好。演示程序很简单,计算...原创 2019-08-31 23:10:27 · 2049 阅读 · 2 评论 -
读《linux0.11 内核完全解析》的一点感受
为了看懂《Linux内核完全剖析》决定动手写一个操作系统。从7月开始写,到今天才完成了从启动代码到main函数,以及中断处理。已经enable了时钟中断了键盘中断,可以在屏幕上打字母。接下里还要写文件系统,内存管理和进程管理。直到写出一个shell程序。这期间参考了《x86汇编-从实模式到保护模式》和《自己动手写操作系统》的代码,有些直接拿来抄了,在此对李忠等及于渊几位作者表示感谢。今天想跟记...原创 2018-10-24 23:09:48 · 7788 阅读 · 5 评论 -
docker源码编译安装步骤解析
原料:linux 系统,本人在Ubuntu16.04上运行step 0:安装docker,终端执行sudo apt—get install docker.io因为docker的源码需要在容器中 运行,因此必须要有docker存在step 1:gitclone https://github.com/docker/docker.git下载最新的源码原创 2017-04-24 15:52:02 · 12699 阅读 · 4 评论 -
虚拟机挂载9pfs的时间不一致问题
在kata的实现中是利用9pfs将host上的rootfs挂载成容器的rootfs,这可能会引起一个时间不一致问题。当虚拟机和host的时间没有高度同步时,由于在9p文件系统中进行文件创建时实际上是在host上创建,这样时间戳就是host的时间,也就是这个文件的时间与当前guest系统是不一致的。...原创 2019-08-21 13:54:32 · 483 阅读 · 0 评论 -
chmod 的权限设置
今天执行sudo 的时候突然报错:sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set谷歌一下终于知道以前所忽略的一些文件权限相关的知识点。上述问题的解决方案是:如果能够以root用户登录系统那么就修改/usr/bin/sudo 的权限chmod 4755 /usr/bin/sudo如果不能就比较困难了。下面介...原创 2018-03-29 13:37:25 · 2996 阅读 · 0 评论 -
在Linux中进行io和文件系统性能测试
io性能的测试最简单的方法是用dd命令,dd if=/dev/zero of=./zero.img bs=10M count=100 oflag=dsync上面的命令是从0设备读入数据并写入zero.img 文件,最后一个参数是为了排除cache的问题。测试文件系统性能最全面的工具是iozone,可以从http://www.iozone.org/src/current/iozone3_471.ta...原创 2018-04-11 18:08:01 · 1279 阅读 · 0 评论 -
Ubuntu上用qemu起虚拟机
在x86上用qemu起虚拟机是比较容易的。qemu是一款可以从ISA(instructure system arch)开始模拟硬件架构的工具。比如在x86上可以模拟arm架构的机器,它可以不断将guest虚拟机需要的机器指令转换成host指令来模拟不同架构。因此它的性能相当差。因此一般通过联合kvm这种半虚拟化工具达到提高性能的目的,一般有kvm加持的虚拟机速度堪比host。1 安装qemu kv...原创 2018-04-09 18:25:18 · 4861 阅读 · 0 评论 -
linux file system info
本文转载自http://blog.chinaunix.net/uid-11320152-id-2883103.html有哪些文件系统,至少通过本文您能了解得到;++++++++++++++++++++++++++++++++++++++++++++++++++++++++正文++++++++++++++++++++++++++++++++++++++++++++++++++++++++操作系统基于...转载 2018-04-02 14:59:27 · 278 阅读 · 0 评论 -
浅谈tun/tap 的vnet_hdr flag
tun/tap是内核虚拟出来的用户网络设备,一般是给虚拟机使用,作为virtio的后端实现的重要接口。设备的接口在/proc/net/tun,一般起虚拟机的时候hypervisor 会自动实现,只要在参数中添加网络设备的相关参数。以qemu起虚拟机为例:qemu-system-x86_64 -netdev tap,id=tap0 -device netdev=tap0 ....netdev 指明...原创 2018-03-21 16:23:12 · 1059 阅读 · 0 评论 -
用qemu-system-aarch64起Linux虚拟机
第一步:安装qemuapt-get -y qemu 第二步:下载build-root kernel镜像,并用qemu-system-aarch64 起虚拟机wget http://people.linaro.org/~alex.bennee/images/aarch64-linux-3.15rc2-buildroot.imgqemu-system-aarch64 -machine virt -c...转载 2018-03-05 17:30:49 · 7244 阅读 · 0 评论