自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

程序猿Ricky的日常干货

学而不思则罔,思而不学则殆! (xiehaocheng127@163.com)

  • 博客(21)
  • 资源 (4)
  • 收藏
  • 关注

原创 深入浅出内存管理--slab分配器

存在的意义页分配器只能按页为单位进行内存分配,但对于不足一页的申请,如果依然按一页来分配,就会造成内存的浪费,slab分配器就是为了完成小内存的分配和管理的。slab分配器建立在页分配器之上,它最终也是从页分配器申请得到整页内存,但是它对页内内存进行了更细化的管理,这一套机制有助于缓解内碎片问题。设计思想slab分配器把内存区看作对象来进行管理,并对外提供申请和释放的接口。它的核心是维护一个...

2018-12-31 22:13:00 696

原创 深入浅出内存管理--alloc_pages与free_page分析(框图)

alloc_pages从前面文章的介绍来看,alloc_pages用于连续物理内存的分配,它的实现如下图所示:从这个流程图来分析,函数是一步一步调用到buffered_rmqueue的,alloc_pages是页分配器的对外接口,系统中很多模块和驱动可以直接调用它申请到内存,而buffered_rmqueue是底层伙伴系统算法的实现。它的流程图如下所示:这里框图介绍了buffered_rm...

2018-12-30 20:54:22 4314

原创 Trace32 simulator调试以及简单实用命令介绍

Trace32 Simulator debug熟悉高通平台的童鞋可能会比较熟悉,高通有ramdump功能,当系统crash后通过warm reset重启来抓取ram中的数据,然后利用Trace32进行故障现场的查看来排查问题。这实际上用到的就是trace32的simulator功能,也就是仿真器功能,我们只需要获取到设备的内存快照来进行指令集的仿真,以此查看故障现场,而不用真实的连接目标板来实时...

2018-12-26 20:52:31 37964 3

原创 Trace32-ICD和Trace32-ICE的区别

ICD:In Circuit Debugger,ICE:In Circuit Emulator,中文分别为“在线调试器”和“在线仿真器”Trace32是Lauterbach公司开发的一套工具,包括软硬件一起搭配使用,包括了Trace32-ICD和 Trace32-ICE。早期我们只有ICE能够用于CPU的调试,它主要实现方式就是使用一套硬件替代原本想要调试的CPU,以此达到仿真目的,但是需要我们...

2018-12-25 18:21:41 2463

原创 深入浅出内存管理--页分配器

页分配器页分配器是用于整页内存申请的,伙伴系统也是针对页为基本单位的一种算法,因此我们的页分配器是会使用伙伴系统算法的上层接口,为了优化伙伴系统的效率,内核还实现了一个per-cpu的页框高速缓存,这种高速缓存是为了提升页分配器的效率而存在的,当我们申请单个页框的时候会优先从高速缓存中申请,而不用每次都运行伙伴系统算法来进行寻找,这是对伙伴系统的一种补充和优化。下面我们将主要介绍页分配器的上层接...

2018-12-23 17:08:19 465

原创 深入浅出内存管理--高端内存映射之fixmap(固定映射)

我们知道系统中的高端内存是不能作为直接映射区映射到内核空间的,那么我们想要使用它怎么办呢?前面的文章我们已经有过相关的介绍,可以使用三种方法,分别是pkmap(永久映射)/fixmap(临时固定映射)/vmlloc,本文主要介绍fixmap,也就是固定映射又叫临时映射。关键点通过前面的介绍我们知道,fixmap和pkmap的最大区别是fixmap不会被阻塞,因此可以在中断上下文中使用。那会不会...

2018-12-23 16:32:23 2158 6

原创 深入浅出内存管理--高端内存映射之pkmap(永久映射)

我们知道系统中的高端内存是不能作为直接映射区映射到内核空间的,那么我们想要使用它怎么办呢?前面的文章我们已经有过相关的介绍,可以使用三种方法,分别是pkmap(永久映射)/fixmap(临时固定映射)/vmlloc,本文主要介绍pkmap,也就是永久映射。入口函数首先我们来介绍pkmap的入口函数,它就是kmap:void *kmap(struct page *page){ mig...

2018-12-23 16:00:01 2289

原创 QEMU测试环境搭建

本人的github仓库:https://github.com/rikeyone/qemu.git仓库中集成了整个QEMU环境,包含install、build、start、stop相关的脚本,只需要执行几个命令,即可轻松创建qemu环境,并且开始内核的调试。descriptionThis is an develop test environment for linux kernel usi...

2018-12-19 15:48:57 1279

原创 深入浅出内存管理-- 伙伴系统(buddy system)

buddy system伙伴系统是内核中用来管理物理内存的一种算法,我们知道内存中有一些是被内核代码占用,还有一些是被特殊用途所保留,那么剩余的空闲内存都会交给内核内存管理系统来进行统一管理和分配,内核中会把内存按照页来组织分配,随着进程的对内存的申请和释放,系统的内存会不断的区域碎片化,到最后会发现,明明系统还有很多空闲内存,却无法分配出一块连续的内存,这对于系统来说并不是好事。而伙伴系统...

2018-12-17 18:57:39 18865

原创 深入浅出内存管理--高速缓存(cache memory)和转换后援缓冲(TLB)

高速缓存(Cache memory)CPU的运行速度时非常快的,当今的CPU主频都是GHZ级别的,而对于内存DDR来说,每次存取操作都会耗用很多的时钟周期,这意味着,CPU需要等待很长时间来完成一次读或者写操作。为了缩小CPU和DDR两者之间速度上的不匹配造成的等待问题,硬件上引入高速缓存,这利用了局部行原理,简单来说,该原理的想表达的就是:CPU运行所需要的内存一般都在当前访问地址的附近,最...

2018-12-16 22:25:13 2381

原创 深入浅出内存管理--对于lowmem_reserve的理解

每个内存管理区(zone)都有一个lowmem_reserve字段,它代表本管理区预留的物理内存大小。所谓预留,那就是说肯定还是有用的,只是用的时机不同。之前的文章中由介绍过water mark水位值,系统中已经为每个管理区(zone)内存大小设定了三个水位值了,分别时WMARK_HIGH/WMARK_LOW/WMARK_MIN。怎么这里又多出来一个lowmem_reserve?在内存分配时,...

2018-12-16 15:12:35 4058

原创 深入浅出内存管理--对于watermark的理解

经过前面文章的介绍,每个内存管理区都有一个数组watermark,内核中定义了三个watermark来表示当前系统剩余的空闲内存。WMARK_MIN,WMARK_LOW,WMARK_HIGH,watermarkhigh当剩余内存在high以上时,系统认为当前内存使用压力不大。low当剩余内存降低到low时,系统就认为内存已经不足了,会触发kswapd内核线程进行内存回收处理m...

2018-12-16 15:10:06 5040

原创 深入浅出内存管理--页描述符(Page)

内核中采用struct page来描述物理内存页,它的主要成员如下(非全部成员):unsigned long flags;标志位,内核中每个page的状态可以由此标志位来表示,列举几个标志位:PG_locked 页被锁定,比如在磁盘I/O操作中涉及到的页,不能被页框回收算法回收。PG_reserved 页留给内核代码或者没有使用,这种页是不受内存管理系统用于分配的,所以不能被回收算法回...

2018-12-16 14:13:56 1431

原创 深入浅出内存管理--内存管理区(Zone)

本文以Linux内核4.9来做介绍。内存管理区(ZONE)结构体每个Node节点中的内存又划分为多个ZONE来进行管理,内核中一共定义有如下几种类型的ZONE。enum zone_type {#ifdef CONFIG_ZONE_DMA /* * ZONE_DMA is used when there are devices that are not able ...

2018-12-14 17:50:17 2214

原创 深入浅出内存管理--内存节点(Node)

本文以Linux内核4.9来做介绍。Node 结构体内核中的节点是使用一个结构体struct pglist_data来进行管理的,它的组成如下所示,本文只会列出几个关键成员,其余成员待遇到时在做解释: typedef struct pglist_data { struct zone node_zones[MAX_NR_ZONES]; struct zonelist nod...

2018-12-14 15:36:09 3272

原创 深入浅出内存管理--物理内存框架

NUMA首先需要介绍一个NUMA的概念,非一致性内存访问模型,在这种系统中,CPU访问不同内存单元的时间可能是不一样的,物理内存被划分为不同的Node节点来进行管理,对于单CPU的系统也可能使用NUMA,因为这些系统的物理内存有可能不一定是整块的,而是中间包含有很大的洞,因此划分出多个Node进行管理。比如系统中存在两个内存芯片并且内存芯片的地址不连续,内核对应的也把物理内存划分为多个内存Nod...

2018-12-14 14:07:03 505 5

原创 深入浅出内存管理--内存管理概述(arm32内存布局)

内存管理我的理解是分为两个部分,一个是物理内存的管理,另一个部分是物理内存地址到虚拟地址的转换。物理内存管理内核中实现了很多机制和算法来进行物理内存的管理,比如大名鼎鼎的伙伴系统,以及slab分配器等等。我们知道随着Linux系统的运行,内存是不断的趋于碎片化的,内存碎片分为两种类型,一种为外碎片,所谓外碎片就是以页为单位的内存之间的碎片化,另一种为内碎片,内碎片是指同一个页面内的碎片化,那么...

2018-12-12 17:26:07 10606

原创 Linux内核中的per-cpu变量

per CPU变量per-CPU变量从字面上即可猜出它大概的含义,这种类型的变量实际上每个CPU都分配了一个该变量的副本。对于per-CPU的访问几乎不需要锁定,因为每个CPU都工作在自己的副本上,另外per CPU变量还可以保存在CPU自己的缓存上,这样就最大的优化访问速度和减少竞争。静态定义和访问#define DEFINE_PER_CPU(type, name) ...

2018-12-11 19:30:59 1974

原创 Linux内核抢占的理解

可抢占性,对一个系统的调度延时具有重要意义。2.6 之前,一个进程进入内核态后,别的进程无法抢占,只能等其完成或退出内核态时才能抢占, 这带来严重的延时问题,2.6 开始支持内核态抢占。禁止内核抢占的情况列出如下:(1)内核执行中断处理例程时不允许内核抢占,中断返回时再执行内核抢占。(2)当内核执行软中断或tasklet时,禁止内核抢占,软中断返回时再执行内核抢占。 (3)在临界区禁止内核...

2018-12-11 19:14:11 2115 4

原创 深入浅出内存管理--页表的创建

页表的创建Linux在启动过程中,要首先进行内存的初始化,那么就一定要首先创建页表。我们知道每个进程都拥有各自的进程空间,而每个进程空间又分为内核空间和用户空间。以arm32为例,每个进程有4G的虚拟空间,其中0-3G属于用户地址空间,3G-4G属于内核地址空间,内核地址空间是所有进程共享的,因此内核地址空间的页表也是所有进程共享的。Linux内核中内存的管理是通过一个结构体mm_struc...

2018-12-03 20:05:08 6743

原创 深入浅出内存管理-虚拟地址和物理地址转换

谈起内存管理,首先我们就要搞清楚虚拟地址和物理地址的关系。本文就是简单介绍下这两个基础概念。物理地址物理地址指实际存在的物理内存地址,比我有一个2G的内存芯片,那么系统的物理内存就是2G,我要访问该内存中的一个地址,那就需要对应的物理内存。虚拟地址虚拟地址,就是就是一种逻辑意义上的地址,而当我们想要访问这个虚拟地址时,是需要转换到物理地址才能够真实的访问到,比如我一个2G的内存,那么虚拟地...

2018-12-01 11:24:46 8157 1

linux gtk hello test

gtk hello world,test for gtk lib

2016-01-14

linux v4l2 camera config

linux v4l2 camera config

2016-01-14

v4l2 camera capture and config

linux系统下的camera capture和camera config实例

2015-08-17

linux v4l2 camera capture

v4l2接口,camera capture实例,合法合规!

2003-07-28

空空如也

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

TA关注的人

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