Albert's Blog

宁静致远

如何利用内核patch分析内核子系统

如何利用内核patch分析内核子系统

如何利用内核patch分析内核子系统 [TOC] 一、前言 ​ 本文是之前在某个公众号里面看到的,之前我也想过利用内核patch去分析内核子系统,但是无奈迟迟没有去总结,无意中看到这篇文章,于是就看了看,然后自己也去研究了一下。 ​ 原文地址,顺便说一下,作者对此还录了视频,可谓用心良苦。可以添加微信找作者索要视频资料,另外原文作者还会教你如何搭建环境,各位可以移步查看原文。我主要是...

获取内核符号地址或符号名

获取内核符号地址或符号名

获取内核符号地址或符号名 前言 ​ 为什么要去学习这个内容呢,之前在讲解netfilter函数丢包定位的时候讲到过,在分析网络协议栈的问题的时候,经常出现netfilter钩子函数丢包的情况,特别是我们自己在内核中注册了大量钩子函数的时候,然而钩子函数是通过遍历链表的方式执行,这个时候我们通过栈回溯无法知道是哪一个具体函数丢弃了数据包,这个时候我们可以先打印出函数指针的地址。然后再去匹...

zram内核文档翻译

zram内核文档翻译

zram内核文档翻译 网上看到一篇比较好的翻译文章 原文地址

Linux内存压缩浅析之原理

Linux内存压缩浅析之原理

Linux内存压缩浅析之原理 原文地址 1. 技术背景 ​ 相信对于搞技术的人来说,压缩这个词并不陌生,一想到这个词,我们首先想到的是压缩可以降低占用空间,使同样的空间可以存放更多的东西,类似于我们平时常用的文件压缩。 顾名思义,内存压缩就是压缩内存,节省内存空间。 你可能会说换个内存大的不就行了吗?但是但内存无论多大,总是会有不够用的时候,或者说我们总是想在尽量低的成本...

linux内存压缩浅析-使能zram

linux内存压缩浅析-使能zram

linux内存压缩浅析-使能zram ​ 为了验证zram, 我是在openwrt项目上面进行zram验证,打开zram需要打开内核的一些选项 make kernel_menuconfig后打开如下选项: CONFIG_SWAP=y CONFIG_MEMCG_SWAP=y CONFIG_MEMCG_SWAP_ENABLED=y make menuconfig后打开...

linux中定位数据包异常导致kernel panic

linux中定位数据包异常导致kernel panic

Linux中定位数据包异常导致kernel panic ​ 在网络问题的排查中,我们经常遇到,某个数据包导致异常发生,或者说这个导致异常的数据包是谁发出的,具体的报文格式是怎么样的,这里可以通过在内核中将导致异常的整个数据包dump出来,然后用wireshark再来具体分析是哪一个主机发出的数据包导致路由器异常。 1、在内核中dump出异常代码段的数据包 printk("----...

一种基于iptables的应用流量统计方式

一种基于iptables的应用流量统计方式

一种基于iptables的应用流量统计方式 [TOC] 一、前言 二、iptables简介 三、cgroup简介 四、流量统计 五、流量限制 六、总结

linux调试之栈帧原理与应用

linux调试之栈帧原理与应用

Linux调试之栈帧原理与应用 ​ 上一篇文章讲解了如何在Linux应用程序中进行栈回溯,本篇我们以x86_64位为例,说明栈回溯的原理与过程,其中可能会涉及到少量汇编,Google查一下就可以了。rbp一般代表栈基址寄存器, rsp一般是栈顶寄存器: 一、 函数调用过程 首先我们先写一段测试代码,然后通过汇编来看下函数的调用流程。 需要注意的是,每种处理器的汇编代码不尽相同,所...

linux调试之打印应用调用栈

linux应用程序中打印调用栈

Linux调试之打印应用调用栈 ​ 在Linux中程序发生异常时,将函数的调用栈打印出来,可以大大提高定位效率。在自己写应用模块的时候,尽量在自己的代码中首先实现类似与内核里面的dump_stack的函数,这样在出现问题的时候,可以大大提高问题排查效率。Linux中提供了三个函数用来获取调用栈: /* 获取函数调用栈 */ int backtrace(void **buffer, int...

帅到跳闸的livegrep实时检索代码工具

帅到跳闸的livegrep实时检索代码工具

帅到跳闸的livegrep实时检索代码工具 ​ 有时候需要在linux kernel里面查找一些ID或者查询回调函数在哪里实现的,这个时候各种插件工具(cscope,甚至source insight都通通不灵了,只能使用grep这 样的工具,但是grep查询的速度也不快,搜索整个linux kernel源码,在我的电脑上至少都要10s,其实也挺快了:-),但是这个10秒用在写代码上又可以...

linux内核调试之异常调用栈

linux内核调试之根据kernel panic找到异常调用栈

linux内核调试之异常调用栈 之前做项目的时候,在启动过程中出现 Unable to handle kernel NULL pointer dereference at virtual address 00000004 [ 90.967706] CPU: 1 PID: 0 Comm: swapper/1 Tainted: P 3.14.77 #1 [ 90.967714] task: c...

Linux内核调试之netfilter函数定位

寻找是哪个netfilter函数丢了网络数据包

Linux内核调试之netfilter函数定位 ​ 在分析网络协议栈的问题的时候,经常出现netfilter钩子函数丢包的情况,特别是我们自己在内核中注册了大量钩子函数的时候,然而钩子函数是通过遍历链表的方式执行,这个时候我们无法知道是哪一个具体函数丢弃了数据包,这个时候我们可以先打印出函数指针的地址,然后通过addr2line工具将该地址转换为字符串,然后通过grep工具找到该函数定义...

Linux内核调试之iptables观察数据包流向

Linux内核调试之iptables观察数据包流向

Linux内核调试之iptables观察数据包流向 ​ 众所周知,iptables的每个规则都会记录经过该规则的数据包的个数,如下图所示: ​ 那么我们基于此原则,可以对我们想要观察的数据包创建一条规则,规则的执行是-j ACCEPT. 那么该条规则就会对我们想要观察的数据包进行匹配,我们可以在netfilter框架中的任意怀疑丢包的地方创建规则,如果数据包经过了该规则,那么前面的数...

linux内核调试之dump_stack

linux内核调试之dump_stack

linux内核调试之dump_stack ​ 在实际的环境中,系统异常的时候,我们有时候需要知道,是哪一个进程调用了系统调用,或者是谁下发了配置到内核,这个时候可以通过dump_stack来打印调用栈。 struct task_struct *my_parent = current->parent; if((dev!=NULL)&&(dev->na...

Github更新fork后的仓库

Github更新fork后的仓库

Github更新fork后的仓库 ​ 我们经常遇到在Github上fork别人的开源库,那么我如何才能在Github上fork了别人的项目后,再同步更新别人的提交呢。主要有两种方式: ———通过网页的方式 ———通过Git命令行 ​ 命令行的方式其实只要是懂Git都知道如何操作。这里不再说明,我仅仅介绍通过网页当时更新 通过网页方式更新Github仓库 1、打开自己想要更新的Gi...

使用Sourcegraph阅读代码

使用Sourcegraph阅读代码

使用Sourcegraph阅读代码 ​ 作为编程人员,经常会阅读大神们的代码进行学习,像GitHub上有很多好的开源的代码供我们学习,所以呢,问题就来了,一般的方法阅读代码不光费劲,而且项目结构也不容易搞清楚。偶然发现了一个可以很好地查看代码的工具Sourcegraph,觉得很好。 1、Sourcegraph介绍 ​ 简单地说,Sourcegraph是一个帮助我们更好地阅读和理解代码的...

多核MMU和ASID管理逻辑-(转)

多核MMU和ASID管理逻辑-(转)

多核MMU和ASID管理逻辑 ​ 之前在看所有资料的时候,都没有思考过多核的关于MMU的资料,总是没有对所学的所有知识都建立起多核的概念。最近一段时间考虑问题的时候,都会强迫自己把一些知识点往多核上面思考。本来想自己写一篇,但是发现知乎上面一篇文章写得不错,自己也就懒得写了。 ​ 原文地址 ​ 本文是回答一位同事问到的,关于有多个核运行一个或者多个进程的时候,MMU和ASID怎么...

linux内存管理浅析

linux内存管理浅析

Linux内存管理浅析 ​ 前段时间公司需要在项目上进行内存裁剪,于是就抽时间把linux内存管理总结了一下,以便于进行开发工作。当时也是用markdown写的,但是部分当时一抽风只保留了pdf. 其他的全给删除掉了。这里也把pdf放到我自己的github上,加上链接吧。 linux内存管理浅析_Github 本人水平有限,欢迎各位发现错误,并邮件和我沟通。