背景Readthefuckingofficialdocuments!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:对不起,我竟然用了一个夺人眼球的标题;我会尽量从一个程序员的角度来阐述OpenCL,目标是浅显易懂,如果没有达到这个效果,就当我没说这话;子曾经曰过:不懂Middleware的系统软件工程师,不是一个好码农;1.介绍OpenCL(OpenComputingLanguage,开放计算语言):从软件视角看,它是用于异构平台编程的框架;从规范视角看,它是异构并行计算的行业标准,由KhronosGroup来维护;异构平台包括了CPU、GPU、F
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:SourceInsight3.5,Visio1.概述Workqueue工作队列是利用内核线程来异步执行工作任务的通用机制;Workqueue工作队列可以用作中断处理的Bottom-half机制,利用进程上下文来执行中断处理中耗时的任务,因此它允许睡眠,而Softirq和Tasklet在处理任务时不能睡眠;来一张概述图:在中断处理过程中,或者其他子系统中,调用workque
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:SourceInsight3.5,Visio1.概述中断子系统中有一个重要的设计机制,那就是Top-half和Bottom-half,将紧急的工作放置在Top-half中来处理,而将耗时的工作放置在Bottom-half中来处理,这样确保Top-half能尽快完成处理,那么为什么需要这么设计呢?看一张图就明白了:ARM处理器在进行中断处理时,处理器进行异常模式切换,此时会
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:SourceInsight3.5,Visio1.概述【原创】Linux中断子系统(一)-中断控制器及驱动分析讲到了底层硬件GIC驱动,以及Arch-Specific的中断代码,本文将研究下通用的中断处理的过程,属于硬件无关层。当然,我还是建议你看一下上篇文章。这篇文章会解答两个问题:用户是怎么使用中断的(中断注册)?外设触发中断信号时,最终是怎么调用到中断handler的
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:SourceInsight3.5,Visio1.概述从这篇文章开始,来聊一聊中断子系统。中断是处理器用于异步处理外围设备请求的一种机制,可以说中断处理是操作系统管理外围设备的基石,此外系统调度、核间交互等都离不开中断,它的重要性不言而喻。来一张概要的分层图:硬件层:最下层为硬件连接层,对应的是具体的外设与SoC的物理连接,中断信号是从外设到中断控制器,由中断控制器统一管理
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:KVM版本:5.9.1QEMU版本:5.0.0工具:SourceInsight3.5,Visio文章同步在博客园:https://www.cnblogs.com/LoyenWang/1.概述汪汪汪,最近忙成狗了,一下子把我更新的节奏打乱了,草率的道个歉。前边系列将VirtioDevice和VirtioDriver都已经讲完,本文将分析virtqueue;virtqueue用于前后端之间的数据交换,一看到这种数据队列,首先想到的就是ring-buffe
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:KVM版本:5.9.1QEMU版本:5.0.0工具:SourceInsight3.5,Visio文章同步在博客园:https://www.cnblogs.com/LoyenWang/1.概述前篇文章讲完了Qemu中如何来创建VirtioDevice,本文将围绕GuestOS中的VirtioDriver来展开;看一下GuestOS(Linux)中的Virtio框架高层架构图:核心模块为virtio和virtqueue,其他高层的驱动都是基于核心模块之上
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:KVM版本:5.9.1QEMU版本:5.0.0工具:SourceInsight3.5,Visio文章同步在博客园:https://www.cnblogs.com/LoyenWang/新的一年,大家牛起来!祝小姐姐们:落雁沉鱼兰质蕙心明眸皓齿螓首蛾眉天生丽质天香国色杏脸桃腮煦色韶光涎玉沫珠宜嗔宜喜远山芙蓉艳色绝世余霞成绮阿娇金屋逞娇呈美国色天香花颜月貌绝色佳人暗香盈袖闭月羞花倾国倾城温婉娴淑千娇百媚仪态万千...祝男的:新年好。1.概述先来张图:图中罗
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:KVM版本:5.9.1QEMU版本:5.0.0工具:SourceInsight3.5,Visio概述从本文开始将研究一下virtio;本文会从一个网卡虚拟化的例子来引入virtio,并从大体架构上进行介绍,有个宏观的认识;细节的阐述后续的文章再跟进;1.网卡1.1网卡工作原理先来看一下网卡的架构图(以Intel的82540为例):OSI模型,将网络通信中的数据流划分为7层,最底下两层为物理层和数据链路层,对应到网卡上就是PHY和MAC控制器;PHY:
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:KVM版本:5.9.1QEMU版本:5.0.0工具:SourceInsight3.5,Visio文章同步在博客园:https://www.cnblogs.com/LoyenWang/1.概述先从操作系统的角度来看一下timer的作用吧:通过timer的中断,OS实现的功能包括但不局限于上图:定时器的维护,包括用户态和内核态,当指定时间段过去后触发事件操作,比如IO操作注册的超时定时器等;更新系统的运行时间、walltime等,此外还保存当前的时间和日
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:KVM版本:5.9.1QEMU版本:5.0.0工具:SourceInsight3.5,Visio文章同步在博客园:https://www.cnblogs.com/LoyenWang/1.概述本文会将ARMGICv2中断虚拟化的总体框架和流程讲清楚,这个曾经困扰我好几天的问题在被捋清的那一刻,让我有点每有会意,欣然忘食的感觉。在讲述中断虚拟化之前,我们应该对中断的作用与处理流程有个大致的了解:中断是处理器用于异步处理外围设备请求的一种机制;外设通过硬件
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:KVM版本:5.9.1QEMU版本:5.0.0工具:SourceInsight3.5,Visio文章同步在博客园:https://www.cnblogs.com/LoyenWang/1.概述《Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化》文中描述过内存虚拟化大体框架,再来回顾一下:非虚拟化下的内存的访问CPU访问物理内存前,需要先建立页表映射(虚拟地址到物理地址的映射),最终通过查表的方式来完成访问。在ARMv8中,内核页表基地址存放
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:KVM版本:5.9.1QEMU版本:5.0.0工具:SourceInsight3.5,Visio文章同步在博客园:https://www.cnblogs.com/LoyenWang/1.概述本文围绕ARMv8CPU的虚拟化展开;本文会结合Qemu+KVM的代码分析,捋清楚上层到底层的脉络;本文会提供一个SampleCode,用于类比Qemu和KVM的关系,总而言之,大同小异,大题小做,大道至简,大功告成,大恩不言谢;先来两段前戏。1.1CPU工作原理
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:KVM版本:5.9.1QEMU版本:5.0.0工具:SourceInsight3.5,Visio文章同步在博客园:https://www.cnblogs.com/LoyenWang/1.概述从本文开始将开始sourcecode的系列分析了;KVM作为内核模块,可以认为是一个中间层,向上对接用户的控制,向下对接不同架构的硬件虚拟化支持;本文主要介绍体系架构初始化部分,以及向上的框架;2.KVM初始化贝多芬曾经说过,一旦你找到了代码的入口,你就扼住了软件
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:KVM版本:5.9.1QEMU版本:5.0.0工具:SourceInsight3.5,Visio1.概述KVM虚拟化离不开底层硬件的支持,本文将介绍ARMv8架构处理器对虚拟化的支持,包括内存虚拟化、中断虚拟化、I/O虚拟化等内容;ARM处理器主要用于移动终端领域,近年也逐渐往服务器领域靠拢,对虚拟化也有了较为完善的支持;Hypervisor软件,涵盖的功能包括:内存管理、设备模拟、设备分配、异常处理、指令捕获、虚拟异常管理、中断控制器管理、调度、上
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:KVM版本:5.9.1QEMU版本:5.0.0工具:SourceInsight3.5,Visio1.概述从这篇文章开始,将开始虚拟化的系列研究了,大概会涉及到ARM64虚拟化支持、KVM、QEMU等分析;虚拟化相关的实践与操作有且仅有:VMware/VirtualBox等虚拟机使用、QEMU使用、QEMU源码修改模拟IO设备;Showmethecode,一切从源代码出发;本文作为开篇,从宏观方面来进行介绍,有个初步认识,不涉及到具体原理分析。2.概念
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:SourceInsight3.5,Visio1.概述V4L2(VideoforLinux2):Linux内核中关于视频设备驱动的框架,对上向应用层提供统一的接口,对下支持各类复杂硬件的灵活扩展;V4L2框架,主要包括v4l2-core、meidaframework、videobuf2等模块,这也是本文将要展开的内容,仅提纲挈领;开始吧。2.v4l2-core2.1应用视角
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:Kernel版本:4.14ARM64处理器使用工具:SourceInsight3.5,Visio1.概述先回顾一下PCIe的架构图:本文将讲PCIeHost的驱动,对应为RootComplex部分,相当于PCI的HostBridge部分;本文会选择Xilinx的nwl-pcie来进行分析;驱动的编写整体偏简单,往现有的框架上套就可以了,因此不会花太多笔墨,点到为止;2.流程分析但凡涉及到驱动的分析,都离不开驱动模型的介绍,驱动模型的实现让具体的驱动开
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:Kernel版本:4.14ARM64处理器使用工具:SourceInsight3.5,Visio1.概述本文将分析LinuxPCI子系统的框架,主要围绕LinuxPCI子系统的初始化以及枚举过程分析;如果对具体的硬件缺乏了解,建议先阅读上篇文章《LinuxPCI驱动框架分析(一)》;话不多说,直接开始。2.数据结构PCI体系结构的拓扑关系如图所示,而图中的不同数据结构就是用于来描述对应的模块;HostBridge连接CPU和PCI系统,由struct
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:Kernel版本:4.14ARM64处理器使用工具:SourceInsight3.5,Visio1.概述从本文开始,将会针对PCIe专题来展开,涉及的内容包括:PCI/PCIe总线硬件;LinuxPCI驱动核心框架;LinuxPCIHost控制器驱动;不排除会包含PCIe外设驱动模块,一切随缘。作为专题的第一篇,当然会先从硬件总线入手。进入主题前,先讲点背景知识。在PC时代,随着处理器的发展,经历了几代I/O总线的发展,解决的问题都是CPU主频提升与
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:SourceInsight3.5,Visio1.概述今天来聊一下Linux设备模型的基石:kset/kobject/ktype。sysfs文件系统提供了一种用户与内核数据结构进行交互的方式,可以通过mount-tsysfssysfs/sys来进行挂载;Linux设备模型中,设备、驱动、总线组织成拓扑结构,通过sysfs文件系统以目录结构进行展示与管理;Linux设备模型中
前言Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基1.概述Linux系统在访问设备的时候,存在以下几种IO模型:BlockingIOModel,阻塞IO模型;NonblockingI/OModel,非阻塞IO模型;I/OMultiplexingModel,IO多路复用模型;SignalDrivenI/OModel,信号驱动IO模型;AsynchronousI/OModel,异步IO模型;今天我们来分析下IO多路复用机制,在Linux中是通过select/poll/epoll机制来实现的。先看一下阻塞IO模
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:SourceInsight3.5,Visio1.概述ContiguousMemoryAllocator,CMA,连续内存分配器,用于分配连续的大块内存。CMA分配器,会Reserve一片物理内存区域:设备驱动不用时,内存管理系统将该区域用于分配和管理可移动类型页面;设备驱动使用时,用于连续内存分配,此时已经分配的页面需要进行迁移;此外,CMA分配器还可以与DMA子系统集成
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:SourceInsight3.5,Visio1.概述RMAP反向映射是一种物理地址反向映射虚拟地址的方法。映射页表用于虚拟地址到物理地址映射,其中的PTE页表项记录了映射关系,同时structpage结构体中的mapcount字段保存了有多少PTE页表项映射了该物理页。反向映射当某个物理地址要进行回收或迁移时,此时需要去找到有多少虚拟地址射在该物理地址,并断开映射处理。在
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:SourceInsight3.5,Visio1.概述上篇文章分析到malloc/mmap函数中,内核实现只是在进程的地址空间建立好了vma区域,并没有实际的虚拟地址到物理地址的映射操作。这部分就是在PageFault异常错误处理中实现的。Linux内核中的PageFault异常处理很复杂,涉及的细节也很多,malloc/mmap的物理内存映射只是它的一个子集功能,下图大概
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:SourceInsight3.5,Visio1.概述这篇文章,让我们来看看用户态进程的地址空间情况,主要会包括以下:vma;malloc;mmap;进程地址空间中,我们常见的代码段,数据段,bss段等,实际上都是一段地址空间区域。Linux将地址空间中的区域称为VirtualMemoryArea,简称VMA,使用structvm_area_struct来描述。在进行内存申
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:SourceInsight3.5,Visio1.概述在之前的系列文章中,分析到了BuddySystem的页框分配,Slub分配器的小块内存对象分配,这些分配的地址都是物理内存连续的。当内存碎片后,连续物理内存的分配就会变得困难,可以使用vmap机制,将不连续的物理内存页框映射到连续的虚拟地址空间中。vmalloc的分配就是基于这个机制来实现的。还记得下边这张图吗?vmap
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:SourceInsight3.5,Visio1.概述之前的文章分析的都是基于页面的内存分配,而小块内存的分配和管理是通过块分配器来实现的。目前内核中,有三种方式来实现小块内存分配:slab,slub,slob,最先有slab分配器,slub/slob分配器是改进版,slob分配器适用于小内存嵌入式设备,而slub分配器目前已逐渐成为主流块分配器。接下来的文章,就是以slu
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:SourceInsight3.5,Visio1.概述本文将讨论memoryreclaim内存回收这个话题。在内存分配出现不足时,可以通过唤醒kswapd内核线程来异步回收,或者通过directreclaim直接回收来处理。在针对不同的物理页会采取相应的回收策略,而页回收算法采用LRU(LeastRecentlyUsed)来选择物理页。直奔主题吧。2.LRU和pagevec
背景Readthefuckingsourcecode!--By鲁迅Apictureisworthathousandwords.--By高尔基说明:Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:SourceInsight3.5,Visio1.概述本文将描述memorycompaction,内存碎片整理技术。内存碎片分为内碎片和外碎片:内碎片:内存页里边的碎片;外碎片:内存页之间的碎片,可能会造成连续物理页面分配失败。memorycompaction就是通过将正在使用的可移动页面迁移到另一个地方以获得连续的空闲页面的方法。针对内存碎片,内核中定义了migrate_