自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

程序猿的日常干货

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

原创 内核中的插桩调试

插桩法是内核常用的一种调试手段,利用代码中插桩,执行到此时执行对应的钩子函数(hook)来达到调试的目的,从实现来说,它不可避免的会带来一些性能上的开销,不过随着实现的不断优化,这部分的开销已经越来越小了。比如使能了 dynamic ftrace 后的内核,在关闭 ftrace 开关的情况下,实际...

2020-05-15 18:02:25 104 0

原创 crash常用的调试命令

我的crash常用命令如下所示: log/dmesg: 打印出故障现场的kmsg缓冲区log_buf中的内容。 struct:展示结构体的定义,或者从指定的地址开始解析一个结构体。 union:与struct类似,但是用于union的展示 p:print查看某个变量的值,实际上是调用gdb的p命令...

2020-05-08 11:07:25 159 0

原创 内核中的VMAP_STACK特性
原力计划

在Linux-4.14之前,Linux内核栈都是位于线性映射区,该区域对应的虚拟地址和物理地址具有一个固定的偏移,并且是在系统刚启动是进行过pre-mapped,因此内核在使用时不需要另外做页表映射。 在2016年的时候内核引入了vmap_stack机制,它是采用vmalloc申请的内存作为内核栈...

2020-05-07 14:15:55 100 0

原创 对于MIGRATE_MOVABLE的理解

内存管理对于不同的zone管理区,都会划分为不同的memory block进行管理,这些memory block是按照2的幂次个页面进行管理的,对应的结构体如下: struct zone { ... /* free areas of different sizes */ s...

2020-04-30 15:45:01 96 0

原创 模拟一次soft lockup事件

前面我已经介绍过 Linux内核故障分类和排查 这篇文章。 通过前文,可以知道内核故障中有一类,叫做lockup,实际上就是死锁,分为soft lockup和hard lockup,对于hard lockup可能还需要平台的支持,那么本文就来模拟触发一下lockup的场景。在开始之前,需要做一下准...

2020-04-27 20:07:38 115 0

原创 page cache回写的几种触发方式

1.通过写入proc文件系统节点操作 echo 3 > /proc/sys/vm/drop_caches drop_caches是会把所有page cache都释放或者写回的。 2.sysctl设置系统参数 配置flushd进程把脏页写回到磁盘的是时间间隔,单位是1/100秒,因此如下配置...

2020-04-27 09:35:12 60 0

原创 oops堆栈分析实例
原力计划

本文基于Linux-4.0,根据一个crash现场的实例,根据堆栈中的数据,反推整个函数调用流程,由于本例子存在oops,也会直接打印出backtrace,最终可以与我们的分析结果做一下比较,看看分析是否正确。 / # echo c > /proc/sysrq-trigger sysrq: ...

2020-04-24 15:06:43 117 0

原创 Linux内核故障分类和排查

设备故障分为多种表现形式,可以把它分为3类: 1.系统崩溃重启(panic) 2.系统出现长时间无响应异常(hung) 3.系统出现短暂卡顿(性能问题) 针对第1类,一般引起的原因包括:软件bug、死锁(soft lockup、hard lockup)、指令异常abort、system error...

2020-04-22 20:28:13 117 0

原创 进程冻结和解冻的本质

在我前面的文章中已经介绍了内核中的进程冻结技术,进程冻结存在的意义以及它的实现架构,没有看过的童鞋可以点击如下链接过去浏览: https://blog.csdn.net/rikeyone/article/details/103182748 看过此文的人可能又会产生一些新的疑问,一个进程如果被冻结了...

2020-04-22 12:06:25 113 0

原创 使用crash工具分析高通ramdump

工具准备 1.下载并编译arm64平台上的crash工具 从github上下载crash工具源代码: git clone https://github.com/crash-utility/crash.git 编译针对arm64平台的crash工具: make target=ARM64 sudo...

2020-04-21 20:43:49 329 0

原创 ARM64堆栈回溯

基于AAPCS64栈帧的组织方式 先看一个实例代码程序: #include <stdio.h> int callee_func2(int a) { int b = 2; return a + b; } int callee_func1(int a) { in...

2020-04-20 15:47:58 115 0

原创 开源项目mini-ipc简介

简介 mini-ipc是一个进程间通信使用的开源库,由本猿独自开发的,可用于支持POSIX标准的类unix系统上。它的目标是为了更快速的实现用户空间的系统设计和应用设计。本库采用MIT-License开源协议,开发者可以使用这个开源库用于商业或者开源的项目中。 基于mini-ipc可以实现一个消息...

2019-12-15 19:49:28 266 0

原创 开源项目-minios

简介 minios 是使用QEMU实现的一个迷你 Linux 系统。它由 Linux 内核和 Rootfs 组成,Rootfs中包含了一系列的第三方基础库,比如 Libc , BusyBox 。这些都是操作系统运行的基础组件。利用 minios ,可以快速的构建一个 Linux 最小系统,包含有c...

2019-12-15 19:44:32 138 0

原创 Linux kernel oops

本文以ARM64为例,介绍内核的Oops机制,我们使用grep搜索一下内核中可能会报Oops的地方: ./arch/arm64/kernel/sys_compat.c:142: arm64_notify_die("Oops - bad compat syscall(2)", r...

2019-12-09 20:24:13 246 0

原创 Linux kernel panic代码解释

当Linux内核发生严重错误的时候,系统无法继续运行下去,此时内核会主动触发一个panic操作,它的执行流程分析过程如下所示: kernel/panic.c: void panic(const char *fmt, ...) { pr_emerg("Kernel panic -...

2019-12-04 14:54:09 646 0

原创 Linux电源管理--PM QoS

什么是PM QoS QoS全称叫做Quality of Service,直译过来就是“服务质量”的含义。既然它是服务质量,自然需要有两个主体对象:一个服务方(servicer),一个请求服务方(requester)。PM QoS framework针对两种对象分别提供了电源管理的基础框架和接口。 ...

2019-11-29 11:33:33 106 0

原创 进程冻结(freezing of task)

进程冻结(freezing of tasks) 进程冻结是当系统hibernate或者suspend时,对进程进行暂停挂起的一种机制,后面主要以hibernate为例进行介绍。那么为什么要在hibernate或者suspend时需要把进程冻结呢?主要是出于如下的原因: 第1点,防止文件系统被修改...

2019-11-21 15:00:32 355 0

原创 Linux Workqueue:work的处理

workqueue常用的queue操作接口如下所示: /** * schedule_work_on - put work task on a specific cpu * @cpu: cpu to put the work task on * @work: job to be don...

2019-09-12 15:05:03 264 0

原创 Linux Workqueue到CMWQ的技术演进

基础workqueue实现 Linux kernel 2.6.36版本之前,内核已经实现了workqueue的功能。 工作线程创建 支持single-thread和Per-CPU thread两种形式的workqueue,对于singlethread workqueue,内核会创建单个kthr...

2019-09-10 20:15:39 256 0

原创 LLVM-Clang编译器安装和使用

LLVM不仅仅是一个编译器,同时提供了模块化的功能和库,用于编译器的开发和功能扩展。常规的一个编译器分为前端、优化器和后端,LLVM编译器也不例外,Clang就是属于一个编译器的前端部分,LLVM属于优化器和后端,当然LLVM也可以支持其他类型的前端,比如GCC前端编译器。 Clang的安装 a...

2019-08-22 17:31:09 3373 0

原创 图解Linux内核中断子系统

本文用到的缩写词汇: SVC:Supervisor(SVC) Hyp:Hypervisor(Hyp) PC:Program Counter (PC) CPSR:Current Program Status Register (CPSR) SPSRs:Saved Program Status ...

2019-08-15 18:19:29 522 0

原创 Linux内核中的定时器

jiffies操作函数 include/linux/jiffies.h: #define time_after(a,b) \ (typecheck(unsigned long, a) && \ typecheck(unsigned long, b) &am...

2019-08-05 16:58:49 129 0

原创 Linux内核中的时间函数

ktime时间函数 基于ktime_t格式的时间 ktime_t ktime_get(void); 获取基于CLOCK_MONOTONIC的当前时间,返回ktime_t格式的数据类型。 ktime_t ktime_get_boottime(void); 获取基于CLOCK_BOOTTIME...

2019-08-05 16:52:08 1298 0

原创 Linux块设备驱动开发简介

本文基于Linux-4.14 文件系统框架 Linux内核的文件系统框架图如下所示: gendisk对象 Linux中用一个gendisk对象结构体表示一个磁盘分区,这个结构体对象中会包含该分区对应的设备文件的主设备号,次设备号,以及对应的gendisk->fops操作函数,这个块设备操作...

2019-07-19 17:51:07 479 0

原创 gcc支持的C语言标准(-std选项)

gcc支持多种版本的C标准,比如C90(ISO1990)、C99(ISO 1999)和C11(ISO2011),除此之外,GCC还会支持一些GCC特有的扩展。分别是: gnu89/gnu90: ISO C90 + GCC extension gnu99: ISO C99 + GCC extens...

2019-07-15 15:11:32 2402 0

原创 ftrace在实际问题中的应用

我在自己的其他博文中有介绍ftrace的介绍和使用方法,那么在实际的工作中,ftrace可以用来做什么呢? 在实际问题场景中ftrace主要用来跟踪延时和调用流程,分析性能问题。 function/function_graph 分析内核函数调用流程 function/function_graph是...

2019-07-08 18:12:27 678 0

原创 RT Preempt Linux简介

RTOS (实时操作系统) 什么是实时操作系统? 实时操作系统要求在一个触发信号到来之后能够在一个确定的时间点之前进行响应处理。它与普通的非实时操作系统区别在于:普通操作系统的响应延时受系统负载影响较大,轻负载时可能会满足响应的要求,但是在负载变大的时候响应会变慢,并且这个响应时间是不确定的。...

2019-07-03 11:59:57 1766 0

原创 文件系统--open系统调用详解

arm64平台关于32位系统调用的定义: #define __NR_open 5 __SYSCALL(__NR_open, compat_sys_open) #undef __SYSCALL #define __SYSCALL(nr, sym) [nr] = sym, /* * The ...

2019-06-19 17:23:15 655 0

原创 多核编程与CPU亲和力

多核编程 多核编程和多线程编程还是有一些差异的,对于多线程编程,我们可以创建多个线程去处理业务,但是不会关心具体哪个进程运行在哪个CPU上,而多核的意思则是可以把特定任务绑定到特定的CPU上运行。这样的好处是什么?能够把重要的任务独立到一个CPU上运行,从而不受其他任务影响,提升该任务的响应速度。...

2019-05-30 19:10:21 468 0

原创 valgrind (三)--suppression文件

suppression valgrind这个特性是为了屏蔽不必要的error报错,由于valgrind是针对每个指令的监控,所以当每一条指令出现错误时都会相应的报错,而有一些错误是存在于系统lib库中的,而不是作为我们的代码中存在的,这些错误我们是不care的,但是每次执行都会报出来,这样很不好看...

2019-05-28 18:40:06 385 0

原创 系统检测分析工具--free、vmstat、slabtop、top

free命令详细介绍 $ free -h total used free shared buff/cache available Mem: 15G 6.9G 201M ...

2019-05-17 17:49:47 327 0

原创 valgrind (二)--函数调用分析

既上一篇介绍了使用valgrind进行内存泄露和内存越界访问检查之后,本文介绍如何使用valgrind进行函数调用的性能分析。 使用方法 测试代码和编译步骤参见我的上一篇博文《valgrind (一)–检测内存泄露和内存越界》。这里只介绍如何进行性能分析。再开始之前首先安装一下需要使用的工具: s...

2019-05-10 16:58:09 352 0

原创 valgrind (一)--检测内存泄露和内存越界

简介 valgrind是一套代码运行动态分析工具集,它是用于debug调试应用程序的一套工具集合,基于模块化的设计,包含一个framework核心框架层和各个moudule组件,新的功能模块可以方便的加入其中,而不影响旧的模块功能。 valgrind包含如下工具组件: Memcheck 这是一个...

2019-05-10 15:55:50 907 0

原创 HMP调度器和EAS调度器

HMP调度器 为了降低功耗,ARM开发了大小核架构处理器。Linux内核中的负载均衡算法基于SMP模型,并未考虑big.LITTLE模型,因此Linaro开发了一个HMP调度器用于支持这种架构,它也被用于Android 5.x和Android6.x中,但这种调度器并没有被合入内核的基线中。 该调度...

2019-03-08 10:27:41 5896 2

原创 CPU负载均衡

如何实现负载均衡 为了系统负载的均衡,主要通过如下三种手段: (1)当一个进程要加入runqueue时,选择负载最轻的cpu上的runqueue (2)当前CPU的runqueue为空时,主动拉取其他runqueue上的进程来运行 (3)周期计算各个CPU上的负载情况,在必要的时候迁移进程 具体的...

2019-02-28 19:37:36 884 0

原创 进程创建过程

进程创建 在进程创建时,调用do_fork函数来创建新进程,那么和调度相关的操作主要有两个,一个是sched_fork,这是对一个进程进行调度的初始化,另外一个就是wake_up_new_task,这个是把刚刚创建的子进程唤醒加入到调度器中管理。 首先来看sched_fork函数,调用流为do_f...

2019-02-25 16:07:26 1272 0

原创 scheduler_tick函数详解

scheduler_tick是调度器中的一个核心重要的函数,它叫做周期调度器,驱动调度器运行的机制之一。 event_handler()--&gt;tick_handle_periodic()-&gt;tik_periodic()-&gt;update_process_ti...

2019-02-24 17:09:01 752 0

原创 CFS调度器(二)

组调度 前面介绍到的CFS调度器都是以进程为单位进行的调度,实际应用场景中,用户可能会希望系统调度是基于用户组进行的。比如一个服务器上有两个用户同时使用,如果想要两个用户拥有相同的资源分配,那么就可以采用组调度方式。如果依然以进程为单位,那么假如一个用户拥有1个进程,而另一个用户拥有10个进程,这...

2019-02-24 15:08:41 112 0

原创 CFS调度器(一)

关于调度类和优先级的概念,前面的文章《调度器概述》中已经做了介绍了,本文不在重述。本文主要关注的就是CFS调度器,或者叫做fair_sched_class调度类。这种调度器是被SCHED_NORMAL、SCHED_BATCH这两种调度策略使用的。(本文基于Linux4.0) 提到调度器涉及到两个...

2019-02-22 18:09:09 334 0

原创 PELT负载计算

PELT负载计算 (Per-Entity Load Tracking) 简介 什么是负载,负载实际上表示的是进程运行对系统的“压力”情况,它和进程消耗CPU时间是两个概念,比如: 10个进程在运行队列runqueue中,和1个进程在runqueue中,虽然在runquque中的进程并没有正在消耗C...

2019-02-21 20:33:59 529 0

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