Sholck

不积跬步,无以至千里.不积小流,无以成江海

0%

linux-likely学习

背景

在日常的工作和学习中,经常发现likely和unlikely的使用,在通知链节点注册时,有如下函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static int notifier_chain_register(struct notifier_block **nl,                                                                                                                                                      
struct notifier_block *n)
{
while ((*nl) != NULL) {
if (unlikely((*nl) == n)) {
WARN(1, "notifier callback %ps already registered",
n->notifier_call);
return -EEXIST;
}
if (n->priority > (*nl)->priority)
break;
nl = &((*nl)->next);
}
n->next = *nl;
rcu_assign_pointer(*nl, n);
return 0;
}

这里通过遍历节点和插入节点地址对比,防止程序运行时重复插入通知链节点。当然,重复插入这种情况下是非常少见的,因此编译器针对此进行了性能优化。

阅读全文 »

动态模块加载异常

背景

动态模块加载,出现以下异常

1
disagrees about version of symbol module_layout"
阅读全文 »

内存泄露分析

背景

N项目超级夜景模式泄露内存,且泄露内存较大,大概每次19M

阅读全文 »

linux内核开发学习手册-内核许可证

原文见:内核开发文档-Linux kernel licensing rules(Linux内核许可规则)

内核通用许可证

  • linux内核虽然是开源的,但是为了避免开发者的心血被不良厂商赚取利益等和保护开源环境,因此是有基于GPL-2.0() 的通用公共许可证作为法律保护的,具体的描述见COPYING文件。
  • 所有的内核源文件都需要标志许可证,而且这个许可证是可以与GPL-2.0兼容的,但是UAPI是作为例外的,因为是非内核的软件如果与内核通信,需要包含此头文件,但是我们不能要求该通信软件也受此许可证限制,因此此类特殊的例外许可描述也会被记录。
阅读全文 »

内核开发学习手册-内核驱动接口

针对内核,无论是开发还是用户,我们所希望的是稳定的驱动功能,而稳定的驱动和有稳定的内核接口之间的联系,需要我们去思考,有助于理解linux的开发哲学。

下文解释了:

  1. 内核没有二进制内核接口
  2. 内核的源代码接口不稳定
    阅读全文 »

程序分析利器strace

简介

strace可以通过捕捉记录正在运行进程的系统调用和信号来进行程序分析,既然是系统调用,因此shell脚本和应用程序都可以通过strace来调试分析。

阅读全文 »

sysdump学习

简介

sysdump为dump system memory,也称内核转储。在内核发生异常时,通过kexec和kdump,将内存和寄存器信息保存,在重启以后的uboot阶段将信息转储到文件中。我们能够通过转储文件发现异常发生的根本原因。

阅读全文 »

程序分析利器gdb

简介

通过gdb可以分析进程在运行和crash的内部状态,根据man手册描述有以下作用

  1. 控制进程的开始和结束
  2. 设置进程暂停的条件
  3. 检查进程暂停时的堆栈等信息
  4. 改变程序变量等因素影响程序
阅读全文 »

程序分析利器perf

简介

全称为performance counter,是一个linux内核实现的框架来进行性能分析,覆盖了硬件CPU/PMU和(软件计数器,监测点)之类的特性。

本文重点介绍perf的使用和实践,不对原理性知识进行讲解

阅读全文 »