- 博客(94)
- 资源 (1)
- 收藏
- 关注
原创 80386 AT&T汇编语法
因此,可能的后缀有“bl”(从字节到长)、“bw”(从不字节到单词)和“wl”(从单词到长)。请注意,‘jcxz’、‘jecxz’、‘sloop’、‘loopz’、‘aloope’、'loopnz’和’loopne’指令仅以字节位移形式出现,因此,如果使用这些指令(gcc不使用它们),则可能会收到错误消息(和不正确的代码)。这些对应于操作码后缀“s”、“l”和“t”t’代表临时实数,80387仅通过’fldt’(将临时实数加载到堆栈顶部)和’fstpt’(存储临时实数和弹出堆栈)指令支持此格式。
2024-03-21 13:49:59
1189
原创 指令的装载和运行
在 Linux 中,逻辑地址通常指的是由段选择符和段内偏移量组成的地址,这种地址表示方式主要用于 x86 架构的机器。而线性地址是指一种平坦的统一地址空间,它不涉及任何段的概念。逻辑地址通常对程序员是透明的,也就是说,程序员通常不需要直接处理逻辑地址。在高级编程语言中,程序员通常使用变量名来访问内存中的数据,编译器和操作系统负责将这些变量名转换为逻辑地址或线性地址。总的来说,逻辑地址对于大多数程序员来说通常是不可见的,因为高级语言和操作系统抽象了底层硬件细节,使得程序员可以更加专注于程序设计和功能实现。
2024-03-21 10:46:23
1131
原创 【virtio-networking 和 vhost-net 简介】
在这篇文章中,我们触及了virtio网络生态系统的表面,向您介绍了virtio网络使用的虚拟化和网络的基本构建块。我们已经简要介绍了 virtio 规范和 vhost 协议,回顾了用于实现 virtio 接口的前端和后端架构,并带您了解了 vhost-net(host内核)与 virtio-net(guest内核)通信的 vhost-net/virtio-net 架构。在试图解释事物时,我们遇到的一个根本性挑战是历史上术语的超载。
2024-03-19 15:44:45
657
原创 介绍 virtio-networking:为现代 IT 结合[虚拟化]和[网络]
各家硬件厂商都有自己的网卡硬件标准。virtio networking是有统一标准的网络解决方案。
2024-03-19 12:19:43
202
原创 【虚拟化简介】
CPU处理能力的飞速提升。它的另一面也就意味着, 个人单独拥有一台计算机, 从资源利用效率角度来看, 被大大闲置了的。硬件对于软件来说,就是一堆寄存器和资源的总和。虚拟化技术是一种资源管理技术,它可以将计算机的各种实体资源(如CPU、内存、磁盘空间、网络适配器等)予以抽象、转换后呈现出来, 以达到最大化利用物理资源的目的。并可供分割、组合为一个或多个计算机配置环境。
2024-03-19 10:58:34
136
原创 linux 传统网卡收、发包流程
但是,需要注意的是,在执行新中断B的过程中,可能会修改一些寄存器或内存的值,这些修改可能会影响到旧中断A下半部的执行结果。这说明__disable_irq()只是禁止CPU去响应中断,没有真正的去屏蔽中断的触发,中断发生后,相应的寄存器会将中断标志置位,在__enable_irq()开启中断后,由于相应的中断标志没有清空,因而还会触发中断。是的,如果旧中断A的下半部正在执行时发生了新中断B,那么旧中断A的下半部会被新中断B中断,新中断B的下半部会开始执行。是的,硬件中断的上半部是实时执行的。
2024-03-19 10:48:47
545
原创 QEMU的内存虚拟化[1]——基本数据结构理解
kvm_set_phys_mem中的start_addr为该MemoryRegionSection在AddressSpace中的起始地址,对address_space_memory而言,其表示的就是虚拟机的物理地址,kvm_set_phys_mem(kml, &u1->section调用kvm_set_user_memory_region进行物理内存HVA和GPA关系的的注册和映射。system_memory和system_io是所有MemoryRegion的root节点。
2024-03-14 16:35:03
239
原创 qemu虚拟机内存分配 -m size参数解析
visit_type_MemorySizeConfiguration 中获取了-m size到mem->size中。machine->memdev是在create_default_memdev里赋值的。1373代码行处将ms->ram_size作为memdev backend的大小。完成了memdev的MR ram_block主机内存分配和MR初始化。将machine->ram的一部分添加到system_memory中。
2024-03-13 15:23:28
409
原创 QEMU开启vIOMMU的VFIO设备直通下的地址翻译流程
此处,iova是GIOVA,vaddr是HVA,这次的ioctl(container->fd, VFIO_IOMMU_MAP_DMA, &map)最终完成了在Host IOMMU页表中的GIOVA到HPA的PFN的映射。IOMMU映射[786432,size=2146697216]IOVA->[0x7ffecfec0000]HVA。IOMMU映射[786432,size=131072]IOVA->[0x7fffd8400000]HVA。4G GPA地址区间和HVA的IOMMU映射关系已全部建立。
2024-03-12 14:13:28
499
原创 dpdk-vdpa中QEMU热迁移脏页log内存的分配和传递流程
QEMU:dev->vhost_ops->vhost_set_log_base调用vhost_user_set_log_base,传递fd和mmap size给dpdk-vdpa进程;log是通过vhost_log_alloc调用log->log = qemu_memfd_alloc分配的,这个会在Host上创建一个共享文件和fd;dpdk-vdpa中,调用rte_vfio_container_dma_map做IOVA到log_base(HVA)的IOMMU页表映射关系。
2024-03-07 18:12:44
286
原创 Features/VT-d vIOMMU介绍
本页介绍QEMU中的VT-d仿真(guest-vIOMMU)以及所有相关内容。有关该技术的详细信息,请参阅参考资料部分。下图显示了QEMU中的一个基本设备分配用例。让我们考虑上面的一个通用PCI设备,它是连接到主机系统的真实硬件。主机可以使用通用内核驱动程序来驱动设备。在这种情况下,该设备的所有读/写都将受到主机IOMMU的保护,这是安全的。受保护的DMA如绿色箭头所示。PCI设备也可以分配给guest。通过利用主机内核中的VFIO驱动程序,设备可以由任何用户空间程序(如QEMU)独占管理。
2024-03-06 16:58:21
211
原创 QEMU设备直通pass through的地址映射转换
DMA内存是有Guest driver通过dma_alloc_coherent等DMA API接口分配,由于Guest中没有开启IOMMU,多以dma_alloc_coherent分配的内存的物理地址GPA就是DMA地址。GPA地址被写到Host device的寄存器中,Host device从而可以访问GPA地址。在__domain_mapping里,将IOVA(即GPA)和HVA对应的物理地址HPA的PFN填充到IOMMU的二级翻译页表项的PTE中,实现GPA->HPA的转换。第六列:映射的文件名。
2024-03-05 17:53:44
268
原创 iommu=pt内核参数解析
PCI总线的地址位宽是32位,所以可能存在设备无法访问到4GB以上内存地址空间的问题。但是,PCIe 3.0的总线地址位宽是64位。这意味着它可以支持高达8TB(2^64字节)的寻址空间。完全可以覆盖目前的内存地址空间范围。在linux内核中,iommu=pt是一个默认项,不添加改参数也是开启的pt模式。即device访问的DMA地址就是内存物理地址。没有iommu二级翻译转换(IOVA->PA),所以性能比开启iommu二级翻译转换高。
2024-03-04 15:50:17
2770
原创 IOMMU的PASID
所以CPU这边的接口就只有dma=dma_alloc(dev, size),分配了物理地址,然后映射为内核的va,然后把pa作为dma地址,CPU提供给设备,设备访问这个dma地址,就得到内存里面的那个数据了。我这个需要提醒一句,iommu用的页表,和mmu用的页表,不是同一个页表,为了容易区分,我们把前者叫做iopt,后者叫pt。等你从VFIO上detach,把你的domain删除了,这个iommu就会恢复原来的default_domain,这样你就可以继续用你的内核的dma API了。
2024-02-26 16:52:00
590
原创 vDPA测试环境搭建
运行 Linux 发行版的计算机。本指南使用 CentOS 9-stream,但对于其他 Linux 发行版,特别是对于 Red Hat Enterprise Linux 7,命令不应有重大变化。具有 sudo 权限的用户~ 主目录中有 25 GB 的可用空间至少 8GB 内存。
2024-02-23 11:04:34
709
原创 disagrees about version of symbol
都是基于内核源码树编译的,但是两次编译导致模块B中的函数CRC和A中的函数CRC不一样,因此报错。原因是编译两个核外驱动,是单独编译的。A用了一次Make,B用了一次Make。内核有两个驱动模块A和B,B调用A EXPORT_SYMBOL出来的函数。将A和B使用同一个Makefile一次性编译,insmod不再报错。但是报标题描述的错误。
2023-08-18 16:07:57
1070
原创 【网络编程】sendto/recvmsg demo; man getaddrinfo(3)
Server programClient program
2022-12-07 16:31:41
230
原创 计算机上电流程
initramfs挂在root文件系统找到systemd。CPU执行指定位置的UEFI固件代码。grub加载initramfs。grub加载操作系统内核。运行initramfs。
2022-11-23 11:13:52
286
翻译 bonding
Linux以太网绑定驱动程序HOWTO最新更新:2011年4月27日最初发布:Thomas Davis <lda.gov上的tadavis>更正,HA扩展:2000/10 / 03-15:威利·塔罗(Willy Tarreau)米奇·威廉姆斯<intel.com上的mitch.a.williams>介绍Linux绑定驱动程序提供了一种用于将多个网络接口聚合为单个逻辑“绑定”接口的方法。绑定接口的行为取决于模式。一般来说,模式提供热备用或负载平衡服务。另外,可以执行链路完整
2020-12-12 23:18:22
1626
翻译 initrd/initramfs文件制作及解压
MKINITRAMFS(8)系统管理MKINITRAMFS(8)名称mkinitramfs-用于生成initramfs image的低级工具概要 mkinitramfs [option]... -o outfile [version] mkinitramfs -h描述mkinitramfs脚本生成一个initramfs映像。initramfs是压缩的cpio归档文件。可以将归档文件与相应的Linux内核一起用于同一体系结构的不同机器中。mkinitramfs用于高级用途。在您的本
2020-12-10 16:34:24
7258
翻译 linux mount命令
MOUNT(8)系统管理MOUNT(8)名称 mount-挂载文件系统概要 mount [-l|-h|-V] mount -a [-fFnrsvw] [-t fstype] [-O optlist] mount [-fnrsvw] [-o options] device|dir mount [-fnrsvw] [-t fstype] [-o options] device dir描述Unix系统中所有可访问的文件都排列在一棵大树中,文件树的根目录为/。这些文件
2020-12-10 11:26:00
4080
翻译 Linux pktgen使用
file:///home/chenhao/backup/github/linux/Documentation/networking/pktgen.rst… SPDX-许可证标识符:GPL-2.0HOWTO for the linux packet generator启用CONFIG_NET_PKTGEN以在内核中编译和构建pktgen或作为模块。首选模块;如果需要,请使用modprobe pktgen。一旦在运行时,pktgen将为每个与该CPU有亲和力的CPU创建一个线程。监视和控制通过/ p
2020-12-09 15:31:37
1840
翻译 systemd man手册
SYSTEMD(1)systemd SYSTEMD(1)名称systemd,init-systemd系统和服务管理器概要 /lib/systemd/systemd [OPTIONS...] init [OPTIONS...] {COMMAND}描述systemd是Linux操作系统的系统和服务管理器。在启动时作为PID的第一个进程运行时,它充当启动系统并维护用户空间服务的初始化系统。为了与SysV兼容,如果将systemd作为init调用且PID不为1,它将执行telinit并
2020-11-30 21:49:22
764
翻译 linux内核启动“No init found.“ boot hang message解析
内核文档Documentation/admin-guide/init.rst对此问题有做解释。加载初始化二进制文件失败的一些高级原因(大致按执行顺序列出)如下:A)无法挂载根FSB)rootfs上不存在初始化二进制文件C)控制台设备损坏D)二进制文件存在但依赖项不可用E)无法加载二进制文件以上各问题的详细分析方法说明如下:A)设置“调试”内核参数(在引导程序配置文件或CONFIG_CMDLINE中)以获取更详细的内核消息。如在grub的linux命令行后加上loglevel=7.B)确保
2020-11-30 13:44:56
723
翻译 NETLINK
NETLINK(7)Linux程序员手册NETLINK(7)名称netlink-内核和用户空间之间的通信(AF_NETLINK)概要#include <asm / types.h>#include <sys / socket.h>#include <linux / netlink.h> netlink_socket = socket(AF_NETLINK, socket_type, netlink_family);描述Netlink用于在内核进程和
2020-11-11 17:48:50
1130
翻译 linux音频声卡 pulseaudio服务
这里写目录标题pulseaudio(1)通用命令手册pulseaudio(1)pulse-daemon.conf(5)pulse-client.conf(5)daemon.confsetrlimit(2)/etc/security/limits.conf/ etc / machine-iddefault.pa(5)pacmd(1)pulseaudio(1)通用命令手册pulseaudio(1)名称pulseaudio-PulseAudio声音系统概要 pulseaudio [optio
2020-09-16 22:36:36
22167
翻译 PDFTOHTML Linux pdf转换为html工具
PDFTOHTML(1)通用命令手册PDFTOHTML(1)名称pdftohtml-将PDF文件转换为HTML,XML和PNG图像的程序概要pdftohtml [options] <PDF-file> [<HTML-file> <XML-file>]描述本手册页简要介绍了pdftohtml命令。该手册页是为Debian GNU / Linux发行版编写的,因为原始程序没有手册页。 pdftohtml是将PDF文档转换为HTML的程序。它在当前工作目录中
2020-09-12 21:13:14
1388
翻译 linux/Documentation/kbuild/module.rst
=========================构建外部模块本文档介绍了如何构建树外内核模块。… 目录=== 1简介=== 2如何构建外部模块-2.1命令语法-2.2选项-2.3目标-2.4建立单独的文件=== 3.为外部模块创建Kbuild文件-3.1共享Makefile— 3.2分开的Kbuild文件和Makefile-3.3二进制斑点— 3.4构建多个模块=== 4.包含文件— 4.1内核包含-4.2单个子目录— 4.3几个子目录=== 5.模块安装-5.1
2020-08-10 14:48:39
460
原创 iozone文件系统测试工具
IOZONE(1)通用命令手册IOZONE(1)名称Iozone-文件系统基准概要Iozone [-a|-A] [-s filesize_Kb] [-r record_size_Kb] [-f [path]filename] [-i test] [-E] [-p] [-m] [-M] [-t children] [-h] [-o] [-l min_number_procs] [-u max_number_procs] [-v] [-R] [-x] [-dmicroseconds
2020-07-06 11:21:44
839
原创 linux内核串口日志抓取-minicom工具使用方法
linux man手册有如下描述MINICOM(1)版本2.7 MINICOM(1)名称 minicom-友好的串行通信程序概要 minicom [选项] [配置]描述 minicom是一种通信程序,有点像共享软件TELIX,但没有源代码,并且在大多数Unices下运行。功能包括具有自动重拨功能的拨号目录,对串行设备上UUCP样式的锁定文件的支持,单独的脚本语言解释器,捕获到文件,具有单独配置的多个用户等等。命令行 -s,--setu
2020-06-01 10:03:00
9237
原创 cmp/test && je/jz分析
以如下汇编函数为例:put_queue: pushl %ecx pushl %edx movl table_list,%edx # read-queue for console movl head(%edx),%ecx1: movb %al,buf(%edx,%ecx) incl %ecx andl $size-1,%ecx#cmp和sub指令对标志位寄存器是相同的效果,只是结果不会存储到目的操作数中。#如果源操作数和目的操作数是相同的,则结果为0,ZF=1。#je:Jump if
2020-05-09 20:45:22
879
原创 Linux内核开源代码风格批量修改
Linux内核源码有自己独特的开源编码规范。文档路径:\linux-5.5.tar\linux-5.5\linux-5.5\Documentation\process在开发的过程中经常因为不小心违反了编码规范,这里提供个方法可以进行代码风格检测和批量修改。在Linux内核源码中自带了代码风格检测脚本checkpatch.pl和代码风格修改工具Lindent。1.代码风格检测脚本checkp...
2020-05-06 22:26:16
1248
原创 linux0.12编译问题解决记录
从setup跳转到head的时候显示“physical address not avaliable”。bochs单步调试,发现jmp 0,8后,执行的都是空指令,按‘c’连续执行,根据退出地址8:000000000c00知道head的数据在此处,突发灵感,觉得是gcc文件头格式变了,于是在build.c文件中构造system文件的地方,把GCC_HEADER宏加上0xc00,然后重新make,发...
2019-11-06 22:52:50
631
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人