自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

weixin_42730667的博客

每天进步一点点

  • 博客(308)
  • 资源 (3)
  • 收藏
  • 关注

原创 MachineDomTreeNode

MachineDomTreeNode 是 LLVM 中的一个类,它用于表示机器级别的控制流图(Machine CFG)中的基本块(basic block)之间的支配关系(dominance relationship)。在编译器中,支配关系是指某个基本块 dom 一另一个基本块 succ,当且仅当从函数的入口点开始,所有到达 succ 的路径都必须经过 dom。这个关系在代码的优化、代码生成以及异常处理等方面都有广泛应用。

2023-04-11 07:55:52 792 1

原创 function calling convention(函数调用约定)

实现原理是 在IR创建 Intrinsic::amdgcn_kernarg_segment_ptr 该IR 会在指令降级的过程中 指向kernel argment segment首地址的SGPR寄存器,之后就可以像操作内存load等指令一样,创建的Intrinsic::amdgcn_kernarg_segment_ptr 指令为全局的,此时并没有真正对该地址制值,因为每个kernel argument ptr所使用的SGPR并不相同,所以目前是处于一个伪指针情况。

2023-02-16 20:43:39 665

原创 LLVM MC layer框架说明

LLVM MC(machine code) 层是整个LLVM low level 较为底层一层,主要功能是负责汇编asm,反汇编disassembly以及生成obj 和汇编功能。不管是输入类型是什么,首先第一步就需要将其输入转换到MCInst,MCInst为MC layer层对指令抽象统一处理,是MC层整个处理都是围绕MCInst进行处理。具体各个层解释会有详细说明,后续会根据AMDGPU 后端详细说明各个步骤过程。上述文档说明了MC层各个部件,但是缺乏从整体角度进行说明。

2022-11-13 20:10:05 1335

原创 Clang Builtin函数格式说明

根据说明TARGET_BUILTIN 宏第一个参数定义builtin函数名称,并且clang 会根据定义的函数名生成clang::builtin::BIXX,clang 内部处理都是以Builtin ID进行识别和处理。

2022-10-23 20:50:54 1222

原创 LLVM Target、TargetMachine、MCSubtargetInfo

Target是LLVM中一个重要抽象,后端中将所有与Target相关的都抽象成相关接口,以方便对后端注册的所有Target接口进行管理该类位于\llvm\include\llvm\MC\TargetRegistry.h。

2022-10-06 08:37:43 970

原创 LLVM Data Layout

LLVM中每个Target都对应所属的数据格式,包括各种数据类型大小,对齐方式,地址空间等,LL为了便于对每个target 数据格式进行说明,一般都会在LLVM IR文件开头部分对支持的数据格式进行说明。LLVM IR文件中的data layout是LLVM IR是以磁盘文件形式,将所支持的数据格式保存下来,方便进行调试以下是一个AMDGPU kernel生成的IR开头:上述几个字段说明:以下图1所对应的 target triple 和datalayout 说明: datalayout 中格式如下:上

2022-09-16 19:20:39 834

原创 IRBuilder

IRBuilder类继承关系IRBuilder只是一个接口类,具体实现位于IRBuilderBase中。使用Inserter插入器中的insert方法,插入位置为InsertPt.

2022-07-25 08:35:20 579

原创 MC Layer Target

每种类型的backends在MC成都会有一个对应Target类,位于llvm\include\llvm\MC\TargetRegistry.h文件。Target 成员主要分为两个部分:基本信息成员以及各种回调函数XXXXFn 需要在启动时调用相应registerXXX函数进行注册,TargetRegistry.h文件中提供了各种register函数 提供XXXFn注册功能。TargetRegistry.h文件中还提供了各种creareXXXX函数,用于创建MC中各种组件。所有注册的backend Targe

2022-07-01 20:36:03 742

原创 MC Instruction Decoder

MC Instruction Decoder属于MC层LLVM中反汇编模块,主要功能是将输入的二进制文件读写成Bytes形式,输出为对应Target 机器指令MCInst,是反汇编中不可或缺的模块: MCDisassembler类是MC Instruction Decoder中对外提高的接口类,属于所有target disassembler的superclass,该类位于:llvm\include\llvm\MC\MCDisassembler\MCDisassembler.h文件该类所接口比较少,其中最重要

2022-06-29 20:22:50 570

原创 LLVM TargetPassConfig

TargetPassConfig类是LLVM 后端添加pass入口,LLVM 框架将整个后端依次划分为指令选择、指令调度,寄存器分配等几个阶段,,如下图:其中每个阶段包含有一个或者多个pass,LLVM后端一个重要的处理就是兼容性和模块化,为了对这些后端所加的pass进行管理,LLVM后端对上述几个比较重要的阶段封装成接口,而每个接口基本代表一个 重要阶段,每个target可以根据需要添加所需要pass,TargetPassConfig该类为codegen中各个阶段提供了各个接口,提供主要接口如下:接口说明

2022-06-22 21:21:33 343

原创 LLVM TargetInstrInfo VS MachineInstr

TargetInstrInfo类提供的机器指令描述接口,由于机器指令通常是与target 相关,因此该类提供的大部分接口都是虚函数,具体实现有每个target 后端来实现,其中TargetInstrInfo类接口主要提供获取机器指令信息接口,出了一些标准接口之外,每个target在实现的机器指令接口类还可以可以按照需要进行扩展,整个amdgpu后端机器接口指令继承关系如下图所示:MCInstrInfo该类为描述机器指令接口基础类,位于llvm\include\llvm\MC\MCInstrInfo.h文件中

2022-06-11 09:53:14 419 1

转载 LLVM测试框架

在LLVM编译器后端开发过程中,针对特定平台必然要定义特定指令集及其指令格式,并对后端流程的各个阶段或pass做相应修改。根据需求编写“测试用例”的测试驱动开发(Test-DrivenDevelopment,简称TDD)是推动开发进行的有效方法,可以在出现问题时实现可回溯,有助于编写简洁可用和高质量的代码。LLVM测试框架是在LLVM编译器后端开发过程中实现测试驱动开发的有效手段,有很高的灵活性和健壮性,可保证加速开发过程稳步进行。本文涵盖LLVM测试框架,需要用到的工具,以及如何增加和运行测试用例。LLV

2022-06-07 21:45:32 2083

原创 linux那些事之SYSCALL_DEFINEx

内核代码中常常在查看系统调用宏时常常会看到使用SYSCALL_DEFINEX一系列宏定义来定义内核针对系统调用接口的定义该宏位于include\linux\syscalls.h文件中,针对系统调用的参数不同,使用了一系列的宏进行方便定义:针对不同的参数个数,一般会使用不同的宏定义,例如open系统调用总共由三个参数,内核中针对open的系统调用为:上述几个宏定义,最终都是调用SYSCALL_DEFINEx,在该宏中x参数代表的是系统调用参数个数,name为系统调用名称,例如open,被_#

2022-06-06 08:52:46 726

原创 C中的#与##作用

平常阅读代码中,会经常遇到宏中使用#或者##号,很多初学者看到使用#或者##的定义宏时会有点头大其实区分两个东东非常简单:宏中使用#号 会将宏中的参数变为字符串,例如:#define toString(str) #str上述例子使用#号定义,将参数str转换成字符串,如果时toString(123456) 之后,123456数字会被转换成字符串“123456”##号的作用时黏贴符号的作用,将两个变量黏贴在一起,但是并不是转成字符串#define conVar(a,b) (a##b.

2022-05-22 12:45:43 432

原创 linux用户态切换到内核态方法

经常游荡在内核源码中,反而对一些基础的东西,确实总结,总结以下经常遇到的问题,linux 用户如何从用户态切换到内核态几个方法:系统调用syscall系统调用是最为常见,也是用于经常使用能够直接感受到的方法。用户态进程通过系统调用申请使用操作系统提供的服务完成工资。例如经常见到的open, fork等函数都需要切换到内核进程,由内核进程完成之后再返回到用户层上去。用户可以通过系统调用内核中的调度,内存等资源,主要工作步骤:Step 1)The processes executed in.

2022-05-20 06:00:55 2187

转载 linux那些事之spinlock

一直相对spinlock做个总结,今天看到一篇文章总结比较好,特意转发保存以下一、什么是spinlockspinlock又称自旋锁,是实现保护共享资源而提出一种锁机制。自旋锁与互斥锁比较类似,都是为了解决对某项资源的互斥使用无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁

2022-05-18 08:27:45 1078

原创 LLVM MachineInstr指令三地址

MachineInstr LLVM 后端处理过程中 在完成指令选择阶段将输入的IR转换成DAG图,接下来在指令调度和规范化阶段会将指令抽象转换成MachineInstr三地址形式。MachineInstr 指令三地址形式是后续LLVM进一步处理的基础,需要理解什么是指令三地址,专门翻了下龙书学习了解下三地址三地址代码基于两个基本概念:地址和指令。按照面向对象的说法,这两个概念对应于两个类,而各种类型的地址和指令对应于相应的子类。一般对编译器来说,地址可以具有如下几个形式:..

2022-05-12 08:35:16 1323

原创 linux内核那些事之内存规整(memory compact)

内存规整是Mel Gormal开发防止内存碎片anti-fragmen pach补丁的第二个部分Avoiding fragmentation with page clustering v27 [LWN.net],主要用于解决当系统长时间运行之后,造成比较碎化内存时,通过内存规整将处于可以移动MOVE的类型内存,重新进行页迁移 整合出较大连续物理内存:内存规整机制原因比较简单:利用类似快慢指针技巧,当需要对一个zone进行内存规整时,使用migrate_pfn和free_pfn两个遍历; m

2022-05-09 20:05:04 1541

原创 llvm raw_ostream

bool runOnFunction(Function &F) override { F.print(errs()); return false;}raw_ostream为LLVM内部封装的输入输出流。不仅支持标准的输入输出流,还可以支持文件以及string的输入输出流,常常用于内部打印等其他操作。write_impl()raw_ostream重要实现,为它保存将数据写入底层流的逻辑,并current_pos()返回当前写入流中的位置。llvm提供的raw_..

2022-05-03 08:19:39 1521

原创 linux那些事之shrink_node

shrink_node为实施内存回收的一个关键节点处理:不管是kswapd回收还是慢速申请直接回收都会通过shrink_node进行内存回收,shrink_nodeshrink_node主要是根据scan_control 控制内存回收力度,来决定具体回收的行为和策略,后续通过shrink_node_memcgs根据scan_control回收策略决定LRU和slab回收行为:static void shrink_node(pg_data_t *pgdat, struct scan_c

2022-05-01 11:11:41 1390

原创 llvm学习笔记

基础知识一个编译器通常是由前端和后端组成,后端负责特定语言的任务,读取源文件并将计算语义分析表示,通常是带注释的抽象语法树(AST)。后端从前端的结果创建优化机器码。前端通常执行的任务:词法分析器(Lexical analyzer简称Lexer)读取源文件并生成一个令牌流。 解析器从令牌流创建一个AST。 语法分析器向AST添加语义信息。 代码生成器从AST生成一个中间表示(IR)。中间表示是后端接口。后端执行的任务:后端在IR上执行与目标无关的优化。 为IR代码选择指令。 之后

2022-04-26 08:41:59 1175

原创 linux那些事之kswapd

内核从buddy中申请内存时,首先会尝试通过快速内存申请通道get_page_free_freelist中申请内存,当快速内存申请失败需要进入慢速申请通道尝试各自内存回收和规整等手段,尝试整理出空闲内存。尝试进行内存回收的第一个手段就是启动kswapd线程,对LRU中和slab中的内存进行回收。kswapd线程属于内存线程,在系统启动启动是,内核就会创建kswapd<node-id>线程,为了防止对性能影响,每个node节点各自创建一个kswapd线程,以node id为后缀,

2022-04-22 08:43:24 1590

原创 linux那些事之numa balance

numa balancenuma balance是页迁移技术最重要也是最开始使用应用的技术,主要是为解决由于调度器进程在两个node迁移造成访问内存性能问题。numba balance通过页迁移技术,将不在运行节点的内存迁移到所运行的节点上。对应numa balance要注意几点:防止进程在两个节点之前来回切换造成频繁进行页迁移(ping pang现场)从而影响性能。numa balance本身就是为了提高性能,不能因为造成频繁页迁移而对性能进行一个反向优化。 多个线程分布在不同线程 访.

2022-04-15 19:31:08 3119 1

原创 linux那些事之页迁移(page migratiom)

Page migration页迁移技术是内核中内存管理的一种比较重要的技术,最早该技术诞生于NUMA系统中(Page migration [LWN.net]),后续由于内存规整以及CMA和COW技术的出现,也需要用到页迁移技术,逐渐称为内核内存子系统中占有比较重要地位。页迁移在NUMA系统中的应用NUMA系统中,每个cpu运行的进程申请内存时尽量从该cpu本地节点中内存中(local memory)速度,这样才能够获得最佳内存访问性能,但是由于内核进程调度系统,当进程数量过多时,调度系统会将进程

2022-04-10 18:40:53 2376

原创 linux那些事之contiguous memory allocator(CMA)

在linux驱动开发过程中经常需要使用到连续大块物理内存,尤其是DMA设备。而实际在系统经过长时间的允许之后,物理内存会出现比较严重的碎片化现象,虽然通过内存规整,内存回收等手动可以清理出一段连续的物理内存,但是并不能保证一定能够申请较大连续物理块。最初连续申请较大块物理内存,一般都是只在DMA场景中使用,因此内核专门把物理内存划分出ZONE_DMA专门用于DMA内存申请(当然划分DMA_ZONE还有其他原因,在较早DMA中由于DMA寻址地址限制 只能将一定范围的物理内存),用于解决DMA申请连续物理内存问

2022-04-05 21:46:08 2285

原创 linux那些事之copy on write(COW)

copy on write(COW)特性主要用于在forck时节省内存空间,可以防止在fork时将父进程中的所有数据全局复制一份出来。可以想象如果fork是将所有父进程中的数据全部复制一份给子进程会造成严重副作用:复制大量不必要的数据会造成占有大量物理内存 fork时造成大量数据会比较耗时操作性能严重损耗。当一个程序在复制之后调用exec,则会造成更严重性能浪费。意味着fork时复制的数据时完全没有用。内核在解决次问题时,fork并不会复制父进程整个地址空间,也是只复制其page table,则这样

2022-03-26 00:00:00 2163

原创 linux那些事之反向映射RMAP

内核中经常出现一个page 被多个虚拟进程使用,例如fork是子进程会继承父进程的页面,同样在开始时拥有相同的页面,此时一个page会对应多个进程VMA:在共享内存场景中,一个物理内存也会被多个进程同时使用。针对上述场景,如果是一个文件被多个进程使用,实际上只对应一个物理页,此时page为page cache,page结构中可以通过page中的struct address_space *mapping结构进行管理。而针对匿名页由于没有对应具体文件,但是又经常需要用到根据page查找到对应的所有正

2022-03-23 21:16:14 1308

原创 linux内核那些事之buddy(慢速申请内存__alloc_pages_slowpath)(5)

内核提供__alloc_pages_nodemask接口申请物理内存主要分为两个部分:快速申请物理内存get_page_from_freelist(inux内核那些事之buddy(快速分配get_page_from_freelist())(3))和慢速申请__alloc_pages_slowpath慢速申请内存部分两个部分如下图:首先尝试快速申请内存get_page_from_freelist,在快速内存中如果当前水位wmark_pages满足要求则调用get_page_from_free_are.

2022-03-22 09:14:39 1233

原创 linux那些事之LRU(4)

当物理内存实际比较紧张时,内存水位处于较低water level时,会触发间接回收内存kswapd或者直接回收内存,从inactive LRU list中将不常用的内存 置换到内存中。vmscan系统提供shrink_inactive_list接口,用于将inactive LRU list中的页面置换出去功能。...

2022-03-20 16:54:03 1670

原创 linux那些事之LRU(3)

继续承接《linux那些事之LRU(2)》, 。shrink_active_list()函数中需要将调用isolate_lru_pages函数将active LRU中从链表尾部隔离出nr_to_scan页物理页面出来,准备将其加入到inactive LRU中isolate_lru_pagesisolate_lru_pages()为从将指定的LRU中分离出nr_to_scan个页面,该函数会将该LRU中page referecent为非零的页面全部挑选出来,该函数定义为:unsigned lon

2022-03-17 16:49:20 1431

原创 linux那些事之LRU(2)

继续《linux那些事之LRU(1)》,以匿名页 分析page 在不同时期所处位置说明page LRU。系统上电memblock->buddy free list系统上电之后,在初始化造成阶段此时buddy 并没有初始化建立,早期early阶段内存是被memblock接管(请参考《linux内核那些事之early boot memory-memblock》和《linux内核那些事之buddy》),memblock函数通过调用memblock_free_pages 将物理内存 按照页形式加入到b

2022-03-13 17:38:09 2883

原创 linux那些事之LRU(1)

一个物理页被分配之后,page其所挂载的链表从buddy空闲链表中摘除,会进入到active 或者inactive链表中,当物理内存water mark存在压力时会根据LRU(least recently unsed)策略将很久没有使用的物理页内存swap或者写入到磁盘中,以便将该页空闲出来供其分配使用。在各种服务器中应用程序 为了提高性能,大都使用内存密集性策略,因此随着长时间使用或者较多服务时会出现内存压力,因此采用合理策略从正在使用的物理页中选出合适的物理内存swap到磁盘中,以供分配使用,显得特

2022-03-10 21:46:56 2834

原创 linux那些事之page cache

page cachepage cache又称高速缓存,主要是针对文件文件系统,为了减少不必要的磁盘IO操作(读/写)造成卡顿问题,内核将磁盘文件中的内容缓存到内存中,并选择适当时机对磁盘进行读写操作。page cache在linux文件系统中占用重要地位。主要是由于CPU访问磁盘比从内存中读取要慢上百甚至上千倍;同时利用空间和时间局部性,当系统访问该文件中一定位置的内容之后,那么经常会很快访问附近位置,如果能提前将文件一部分内容缓存到内存中将会加快对文件操作效率。he Linux kernel

2022-03-06 08:35:31 1948 2

原创 linux那些事之page fault(do_fault)(5)

do_fault为 文件page fault处理,当vma被具体映射到某个文件使,发生page fault将会被认为是文件page fault:static vm_fault_t handle_pte_fault(struct vm_fault *vmf){ ... ... if (!vmf->pte) { if (vma_is_anonymous(vmf->vma)) return do_anonymous_page(vmf); else r

2022-03-04 00:00:00 1412 3

原创 linux那些事之zero page

zero pagezero page是一个特殊的物理页,里面值全部为0,zero page是针对匿名页场景专门进行优化,主要是节省内存和对性能进行了一定优化。当malloc或者mapp一段虚拟内存后,第一次对该内存访问为读操作,将会发生匿名page fault。do_anonymous_page处理,由于第一次为读操作还未发生写操作,因此发生一个zero page,为其申请一个特殊物理页zero page。zero page 好处:zero page是一个全局唯一的一个物理页,且只有一个物理页。

2022-03-01 00:00:00 1146

原创 linux内核那些事之mempolicy(2)

mempolicy相关系统调用主要有set_mempolicy/get_mempolicy 、mbind主要配置task/process policy和vma policy,如下图:

2022-02-25 19:54:29 1751

原创 linux内核那些事之mempolicy(1)

mempolicy为内核分配内存策略管理模块,主要是在numa系统中用于根据指定的内存分配策略决定分配的内存所处的NUMA节点中:In the Linux kernel, “memory policy” determines from which node the kernel will allocate memory in a NUMA system or in an emulated NUMA system由于NUMA系统中有多个内存控制器,每个控制器并不是与每个cpu距离相等的,如下图所示

2022-02-24 00:00:00 1216

原创 linux内核那些事之zone(zone watermark)(3)

为了对每个zone区域的物理内存使用情况,以便更好解决内存紧张而做出不同策略,同时又不影响性能,内核将zone中物理内存按照不同的使用程度划分为不同水位(watermakr),以更好采取不同的策略。《understanding linux virtual memory》一书中对watermark有了很好的说明,虽然它是以2.4内核版本为基础,但是对于理解watermark还是比较重要,:在2.4版本中zone watermark定义为:typedef struct zone_struct {

2022-02-22 00:00:00 1208

原创 linux内核那些事之buddy(anti-fragment机制-steal page)(5)

继<linux内核那些事之buddy(anti-fragment机制)(4)>,在同一个zone内指定的migrate type中没有足够内存,会启动fallback机制,从fallbacks数组中寻找到合适其他type中获取到steal page,实施steal page核心处理函数为steal_suitable_fallback。steal_suitable_fallbacksteal_suitable_fallback定义如下:void steal_suitable_fall

2022-02-20 00:30:00 644

原创 linux内核那些事之buddy(快速分配get_page_from_freelist())(3)

《linux内核那些事之buddy(2)》buddy算法内存申__alloc_pages_nodemask()函数申请内存时首先调用get_page_from_freelist进行第一次尝试申请内存(可以称为快速申请,所谓快速申请相对慢速申请相对来说),如果第一次尝试申请内存失败则进入__alloc_pages_slowpath()慢速申请通道。get_page_from_freelist()get_page_from_freelist()为buddy算法第一次尝试申请内存,核心思想就是当内存足够时

2022-02-16 01:30:00 1767 6

OV2640-DATASHEET.rar

OV2640 datasheet

2019-06-11

Parallel synchronous transmission using GPIO and DM.pdf

stm32F4xx datasheet stm32F4xx datasheet stm32F4xx datasheet

2019-06-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除