rikeyone的博客

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

内核调度时机

调度的时机 内核中常见的调度场景如下: (1)进程被阻塞时,比如执行sleep()后,需要立刻执行schedule()进行调度 (2)当唤醒进程时,比如try_to_wake_up()执行时,会重新计算负载,查找需要执行的进程,并设置TIF_NEED_RESCHED标志延时调度 (3)当周期执行的...

2019-02-19 10:19:19

阅读数 3

评论数 0

Linux2.6 O(1)调度器

O(1)调度器存在于2.4-2.6版本的内核中。 普通进程和实时进程 Linux中把进程分为普通进程和实时进程两种,实时进程对于系统的响应时间要求很高,因此实时进程的优先级都是要高于普通进程的。 静态和动态优先级 静态和动态优先级的范围都是[100~139],这两个值对于普通进程来说非常重要。 静...

2019-02-15 15:56:12

阅读数 11

评论数 0

semaphore信号量

semaphore也就是信号量,是一种进程见同步机制,我们可以作为互斥量来保护临界区资源,但是作为一种同步机制,还能怎么用呢?当然我们可以做进程间的同步使用,比如进程A和进程B,如果进程A要等待进程B完成某项工作后才能继续运行,那么可以使用信号量来操作,进程A先对一个信号量进行P操作(减少),然后...

2019-01-24 16:55:40

阅读数 18

评论数 0

什么是FIT uImage?

全称是flattened image tree uImage,为了更好的支持单个固件的通用性,类似于kernel device tree机制,uboot也需要对这种uImage固件进行支持。FIT uImage中加入多个dtb文件,和ramdisak文件,当然如果需要的话,同样可以支持多个kern...

2019-01-22 14:30:43

阅读数 28

评论数 0

bootloader启动参数传递

arm平台 /* * Kernel startup entry point. * --------------------------- * * This is normally called from the decompressor code. The requiremen...

2019-01-21 14:20:00

阅读数 31

评论数 0

atomic原子操作

结构体 typedef struct { int counter; } atomic_t; 实际的内容就是一个int型的变量counter。 实现 对应的atomic操作有: atomic_add atomic_read atomic_set atomic_inc atomic_dec...

2019-01-18 17:22:00

阅读数 27

评论数 0

spinlock自旋锁

spinlock加锁过程 代码调用流程: spin_lock ->raw_spin_lock -->_raw_spin_lock --->__raw_spin_lock ---->arch_spin_lock ...

2019-01-18 16:36:14

阅读数 28

评论数 0

内存独占访问

ARM平台上内核锁机制的实现根本 在ARM平台上,锁的意义就是为了保护临界区,也就是临界区只能被一个进程独占,那么最底层是如何实现这种内存的独占访问呢?实际上ARM定义了独占内存访问的指令:ldrex和strex。这两个指令是内核锁实现的基石。 内核原子操作、spinlock等等的实现都是基于这两...

2019-01-18 10:53:22

阅读数 24

评论数 0

内存屏障

内存屏障 由于一些编译器优化或者CPU设计的流水线乱序执行,导致最终内存的访问顺序可能和代码中的逻辑顺序不符,所以需要增加内存屏障指令来保证顺序性。 ARM平台上存在三种内存屏障指令: DMB{cond} {option} 这种指令只影响到了内存访问指令的顺序,保证在此指令前的内存访问完成后才执...

2019-01-18 09:43:43

阅读数 35

评论数 0

systrace简介

简介 systrace是给予内核ftrace机制来实现的一套trace工具,android上层实现了Trace类,用于把trace信息写入ftrace buffer,最后再通过ftrace buffer抓取出来。因此想要使用systrace,必须设备使能了ftrace功能。另外User版本的固件不...

2019-01-17 14:07:23

阅读数 32

评论数 0

内存管理中关于Movable的理解

内核中的管理区 内核中定义了如下一些管理区zone: enum zone_type { #ifdef CONFIG_ZONE_DMA /* * ZONE_DMA is used when there are devices that are not able * to ...

2019-01-15 19:57:41

阅读数 334

评论数 0

ARM 64架构内存布局

首先我们以最为常用的4KB page + 3 levels配置为例去介绍: AArch64 Linux memory layout with 4KB pages + 3 levels: Start End Size Use ----...

2019-01-15 17:25:56

阅读数 7876

评论数 0

内存管理--KSM

KSM (Kernel Samepage Merging) 内核合并页,目的是为了把内容完全相同的页面合并,从而释放内存供其他应用使用。Linux对虚拟机的支持,增加了相同页面的数量,所以KSM存在的合理性也就越来越大了,KSM页面在struct page中的page->ma...

2019-01-10 14:40:28

阅读数 34

评论数 0

内存管理--KASAN

KASAN是用于内存debug使用的一种机制,通过内核中使能该选项: CONFIG_KASAN = y 它的原理就是,通过内存中分配一块专用内存为“影子内存”(shadow memory)用来标记系统可以用内存的状态,类似于内核中使用struct page结构体,只不过影子内存比struct ...

2019-01-09 16:13:44

阅读数 40

评论数 0

slab着色

对于大小相同的slab object,虽然处于不同的物理地址处,但是由于cache访问地址的规则,这两个地址很有可能会被分配给同一个cache line去加载,那么会带来一个问题,比如软件中反复去读取这样的两个对象,那么会带来什么后果呢? 我们发现对应的cache line需要被反复刷新,而其余的...

2019-01-09 15:03:49

阅读数 31

评论数 0

内存回收

简介 内存回收是内存管理最为复杂的机制,本文主要在广义上介绍回收方法,而不拘泥于细节。随着系统的运行,内存会逐渐被消耗,而内存主要占用的部分有两个,分别是高速缓存以及用户进程,内核高速缓存包括磁盘高速缓存,slab缓存等。 首先介绍内核中内存回收的几种方式: 直接内存回收 当我们调用内存分配函数...

2019-01-09 14:36:53

阅读数 38

评论数 0

深入浅出内存管理--kmalloc支持的最大内存分配

首先我们来看下kmalloc的实现,本文基于kernel 4.0版本: static __always_inline void *kmalloc(size_t size, gfp_t flags) { if (__builtin_constant_p(size)) { ---------...

2019-01-04 14:34:59

阅读数 61

评论数 0

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

存在的意义 页分配器只能按页为单位进行内存分配,但对于不足一页的申请,如果依然按一页来分配,就会造成内存的浪费,slab分配器就是为了完成小内存的分配和管理的。slab分配器建立在页分配器之上,它最终也是从页分配器申请得到整页内存,但是它对页内内存进行了更细化的管理,这一套机制有助于缓解内碎片问...

2018-12-31 22:13:00

阅读数 37

评论数 0

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

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

2018-12-30 20:54:22

阅读数 36

评论数 0

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

Trace32 Simulator debug 熟悉高通平台的童鞋可能会比较熟悉,高通有ramdump功能,当系统crash后通过warm reset重启来抓取ram中的数据,然后利用Trace32进行故障现场的查看来排查问题。这实际上用到的就是trace32的simulator功能,也就是仿真器...

2018-12-26 20:52:31

阅读数 240

评论数 1

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