6 程序猿Ricky的日常干货

尚未进行身份认证

我要认证

腾讯扫地僧

等级
TA的排名 7k+

网络虚拟化

qemu对于网络的虚拟化需要两个命令行参数来指定,其中一个用于指定网络的前端驱动,也就是客户机中的实现,另一个用于指定网络的后端实现,也就是在宿主机中的实现。命令行参数qemu支持两种方式来实现上面的功能,一种是旧版本上使用的,参数为 -net 配合 -net ,另一种是在新版本上支持的 -device 配合 -netdev 。qemu的发展趋势是倾向于用 -device 一种命令格式来虚拟出不同的设备,其中包括网卡设备。对于旧版本的qemu来说使用如下命令来虚拟网络配置,前端:-net ni

2020-06-15 17:31:56

内核中的插桩调试

插桩法是内核常用的一种调试手段,利用代码中插桩,执行到此时执行对应的钩子函数(hook)来达到调试的目的,从实现来说,它不可避免的会带来一些性能上的开销,不过随着实现的不断优化,这部分的开销已经越来越小了。比如使能了 dynamic ftrace 后的内核,在关闭 ftrace 开关的情况下,实际上只是多了个几个 nop 指令,并不会带来很大的性能开销。下面就来看下内核中都有哪几种常用的插桩调试机制。ftrace 我在其他博客中有介绍过,它的原理是使用 gcc 编译器的 -pg 选项,达到在内核代码中插桩

2020-05-15 18:02:25

crash常用的调试命令

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

2020-05-08 11:07:25

内核中的VMAP_STACK特性

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

2020-05-07 14:15:55

Linux cma内存的使用

CMA的全称叫做contiguous memory allocator,它是为了便于进行连续物理内存申请的一块区域,一般我们把这块区域定义为reserved-memory。早期的Linux内核中没有cma的实现,如果驱动想要申请一个大块的物理连续内存,那么只能通过预留专属内存的形式,然后在驱动中使用ioremap来映射后作为私有内存使用。这样带来的后果就是有一部分内存将被预留出来不能作为系统中的...

2020-05-06 14:54:22

对于MIGRATE_MOVABLE的理解

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

2020-04-30 15:45:01

内存越界问题如何调试

内核里面内存越界问题是一类很常见的错误类型,当然有些也属于异常难调试的问题,这种错误行为会触发内核运行异常,假如越界访问修改了错误的数据区,情况较轻的可能导致应用获取的数据不对;情况严重的,比如修改了一个错误的地址,那么内核访问该地址时就会触发oops和panic。下面来聊聊内存越界的类型,内存越界发生在哪些情况下呢?内存问题分类内存访问异常可以分为如下几种类型:数组越界数组的长度是预先...

2020-04-28 20:24:17

如何处理Hung故障

系统hung故障一般认为是系统出现了异常,但是内核并没有死掉,出现这种情况,一般都是系统中的关键进程处于D状态,也就是不可中断的睡眠状态(也叫Disk Sleep)。那么什么情况下系统会处于D状态?我觉得可以分为两种情况:1.第一种为可恢复的D状态,表现为系统的卡顿,一般进程的D状态都是在获取系统资源时避免被外界异步信号打断而进入的,并且该状态正常情况下是维持时间很短的,如果是进入了D状态维...

2020-04-28 09:29:33

模拟一次soft lockup事件

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

2020-04-27 20:07:38

page cache回写的几种触发方式

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

2020-04-27 09:35:12

oops堆栈分析实例

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

2020-04-24 15:06:43

内核打开kaslr后的调试方法

本文基于ARM64平台代码分析,ARM64平台的内核,在编译链接时,kernel代码段被链接的位置是:KIMAGE_VADDR + TEXT_OFFSET。我们可以通过查看vmlinux.lds.S链接文件查看具体内容:. = KIMAGE_VADDR + TEXT_OFFSET;.head.text : { _text = .; HEAD_TEXT}下面依次介绍各个变...

2020-04-23 17:51:21

Linux内核故障分类和排查

设备故障分为多种表现形式,可以把它分为3类:1.系统崩溃重启(panic)2.系统出现长时间无响应异常(hung)3.系统出现短暂卡顿(性能问题)针对第1类,一般引起的原因包括:软件bug、死锁(soft lockup、hard lockup)、指令异常abort、system error(SError)。(1)软件bug:指的时在代码上检测到运行到异常逻辑后调用BUG宏,从而产生oop...

2020-04-22 20:28:13

进程冻结和解冻的本质

在我前面的文章中已经介绍了内核中的进程冻结技术,进程冻结存在的意义以及它的实现架构,没有看过的童鞋可以点击如下链接过去浏览:https://blog.csdn.net/rikeyone/article/details/103182748看过此文的人可能又会产生一些新的疑问,一个进程如果被冻结了,那么它到底在做什么呢?处于什么状态呢?这也是我当时产生的疑问,经过RTFSC,就记录了本文,对该问题...

2020-04-22 12:06:25

使用crash工具分析高通ramdump

工具准备1.下载并编译arm64平台上的crash工具从github上下载crash工具源代码:git clone https://github.com/crash-utility/crash.git编译针对arm64平台的crash工具:make target=ARM64sudo make install2.解析高通的ramdump数据使用crash加载ramdump数据,...

2020-04-21 20:43:49

ARM64堆栈回溯

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

2020-04-20 15:47:58

Linux kernel分支管理与维护

mainline分支维护Linux kernel的主线分支只有一个master分支,该分支由Linus Torvalds维护,对于不同的版本的内核是采用打tag的方式进行发布的,一般在发布一个正式版本之前,都会先发布一系列的候选版本,比如linux-5.6最终版发布之前先发布了linux-5.6.rc1到linux-5.6.rc7,rc值越大越接近最终版本linux-5.6。从linux-3....

2020-04-16 20:09:24

如何动态的把kernel config配置编译到kernel中

有了前面一篇博客的基础,《如何在把主机及版本信息编译进内核中?》现在我们可以进阶一下,任务是如何把kernel的config配置编译到内核中,这样在每个运行中的kernel环境,我们都可以查看它配置了哪些功能。我们把实现代码放置于kernel-4.4/fs/proc/info/目录中,共有三个文件:Makefile/config_info.c/mkconfiginfo其中mkconfiginf...

2018-04-25 18:12:04

链接器lds文件简介

lds后缀的文件是一个linker script,是一个链接器脚本文件。它用来描述链接器要如何链接生成一个目标执行文件,一般我们在编译C语言程序时,都不会创建lds文件,那是因为libc中已经暗含了链接文件。如果我们编译一个汇编文件,那么没有加入libc库,那么就需要创建一个lds文件并且传递给ld链接器来生成可执行elf文件。OUTPUT_FORMAT("elf32­littlearm", "...

2020-02-11 18:35:45

内核debugfs使用简介

常规接口创建一个debugfs目录:struct dentry *debugfs_create_dir(const char *name, struct dentry *parent);创建一个debugfs文件:struct dentry *debugfs_create_file(const char *name, umode_t mode, s...

2020-01-17 18:05:56

查看更多

CSDN身份
  • 博客专家
勋章 我的勋章
  • 签到新秀
    签到新秀
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 专栏达人
    专栏达人
    授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 1024勋章
    1024勋章
    #1024程序员节#活动勋章,当日发布原创博客即可获得
  • 勤写标兵Lv2
    勤写标兵Lv2
    授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
  • 学习力
    学习力
    《原力计划【第二季】》第一期主题勋章 ,第一期活动已经结束啦,小伙伴们可以去参加第二期打卡挑战活动获取更多勋章哦。
  • 原力新人
    原力新人
    在《原力计划【第二季】》打卡挑战活动中,成功参与本活动并发布一篇原创文章的博主,即可获得此勋章。