秒扒Linux
Linux源码学习与研究,共享知识
崔世勋
这个作者很懒,什么都没留下…
展开
-
Linux内核tracepoints
授人以鱼,不如授人以渔. 具体的可以参考kernel文章, 路径: Documentation/trace里面的tracepoints.txt和tracepoint-analysis.txt.内核的每个tracepoint提供一个钩子来调用probe函数. 一个tracepoint可以打开或关闭.打开时, probe函数关联到tracepoint, 关闭时, probe函数不关联到tracep...转载 2019-02-13 08:37:18 · 958 阅读 · 0 评论 -
使用vim阅读linux源码
source insight是windows下的优秀编辑器,适合阅读管理代码,主要有以下功能:(1)查找函数、变量或者宏的定义(2)查找函数、变量或者宏的引用位置(3)查找某个符号在工程内的所有匹配由于unix哲学主张一个工具只做好一件事情,所以这里使用vim来阅读Linux源码1.vim#yum search vim //查看vim相关软件信息#yum install...转载 2018-06-24 14:57:05 · 3166 阅读 · 0 评论 -
Linux DECLARE_COMPLETION宏
completion是一种轻量级的机制,它允许一个线程告诉另一个线程工作已经完成。可以利用下面的宏静态创建completion:DECLARE_COMPLETION(my_completion);如果运行时创建completion,则必须采用以下方法动态创建和初始化:struct compeltion my_completion;init_completion(&my_c...转载 2018-06-20 13:29:37 · 729 阅读 · 0 评论 -
Linux command line详细解析
全局变量1.command_line2.default_command_line3.saved_command_line内核参数的解析一共有两处,一处是setup_arch()->parse_cmdline()用于解析内核参数中关于内存的部分,另外一处是start_kernel()->parse_option()用于解析其余部分。解析配置根据执行的先后顺序,可以...转载 2018-06-20 11:33:55 · 6476 阅读 · 0 评论 -
Linux内核态调试函数BUG_ON
作用:一些内核调用可以用来方便标记bug,提供断言并输出信息。最常用的两个是BUG()和BUG_ON()。 当被调用的时候,它们会引发oops,导致栈的回溯和错误信息的打印。为什么这些声明会导致 oops跟硬件的体系结构 是相关的。大部分体系结构把BUG()和BUG_ON()定义成某种非法操作,这样自然会产生需要的oops。你可以把这些调用当作断言使用,想要断言某种情况不该...转载 2018-06-20 09:52:08 · 421 阅读 · 0 评论 -
Linux内核头文件
Linux内核根据与体系结构的关系,可以分为以下三大类头文件:1.<linux/xxx.h>:Linux内核标准头文件,与体系结构无关,位于内核源码顶层include目录中。2.<asm/xx.h>:与体系结构(CPU Core)相关的头的文件,位于体系结构目录下的include目录中,比如ARM,则位于arch/arm/include.3.<mach/x...转载 2018-06-13 11:54:14 · 952 阅读 · 0 评论 -
linux/init/main.c(一)
linux内核启动过程:启动Linux内核的最终目的是使用Linux上的应用程序,这些应用程序可以是纯软件的,也可以是硬件相关的。1.BIOS自检BIOS(Basic Input/Output System)又称基本输入输出系统,现在的主板都使用一种叫Flash EPROM的芯片来存储系统BIOS,里面的内容可通过使用主板厂商提供的擦写程序擦除后重新写入,这样就给用户升级BIOS提...原创 2018-06-19 17:07:15 · 3136 阅读 · 0 评论 -
Linux __setup与early_param
#define __setup_param(str, unique_id, fn, early) / static char __setup_str_##unique_id[] __initdata = str; / static struct obs_kernel_param __setup_##unique_id / __at...转载 2018-06-19 17:25:21 · 486 阅读 · 0 评论 -
Linux源码研究 - 初识Linux
官网https://www.kernel.org/ 源代码结构arch目录:包含了所有硬件体系结构特定的内核代码,每种硬件平台占一个相应的目录。在x86体系结构下,包括kernel、mm、lib等子目录,分别是与体系结构相关的核心、内存管理、库代码。 block目录:块设备驱动程序I/O调度。 crypto目录:常用的加密和散列算法,还有一些压缩和CRC校验算法。 Docum...翻译 2018-05-04 08:44:22 · 780 阅读 · 0 评论 -
Linux源码研究-Documentation/process/stable-api-nonsense.rst
这里会解释为什么Linux没有二进制的内核接口,也没有稳定的内核接口。注意这描述的是内核内部的接口,而不是内核面向用户空间的接口,而面向用户空间的内核接口是非常稳定的。只有古怪的人才会想写一个不用担心内核接口改变的内核驱动,大部分情况,它们看不到接口,也不关心接口。二进制内核接口假设我们有一个稳定的内核内部使用的接口,那么就一定会出现一个二进制接口吗? 依赖于你使用的C编译器版...翻译 2018-05-04 09:45:37 · 310 阅读 · 0 评论 -
Linux源码研究-用户和管理员手册-release 4.x
什么是LinuxLinux是Unix操作系统的克隆,由Linus Torvalds及通过网络组织在一起的团队开发,目标是遵循POSIX和单一Unix规范。它有Unix的所有特性,包括多任务、虚拟内存、共享库、请求加载、共享写时复制执行、合理的内存管理及IPv4-IPv6的多层网络。使用开源协议GPL v2。支持的硬件现在的Linux至少可以运行在Compaq Alpha AXP, Su...翻译 2018-05-04 13:18:27 · 320 阅读 · 0 评论 -
Linux源码研究-用户管理员手册-内核命令行参数
下面的列表是__setup(), core_param()和module_param()宏实现的内核参数,内核从命令-开始解析参数,如果参数不被识别,也不包含“.”,参数会被用来启动,含“=”的参数会初始化环境,其他的参数会被用作命令行参数初始化。模块参数可以以两种方式指定,通过内核命令行(使用模块名前缀),或通过modprobe(kernel command line) usbcore...翻译 2018-05-04 15:40:18 · 3844 阅读 · 0 评论 -
Linux源码研究-内核开发-内核编码风格
1) 缩进--------------制表符是 8 个字符,所以缩进也是 8 个字符。有些异端运动试图将缩进变为 4 (甚至2!) 字符深,这几乎相当于尝试将圆周率的值定义为 3。理由:缩进的全部意义就在于清楚的定义一个控制块起止于何处。尤其是当你盯着你的屏幕连续看了 20 小时之后,你将会发现大一点的缩进会使你更容易分辨缩进。现在,有些人会抱怨 8 个字符的缩进会使代码向右边移动的...翻译 2018-05-04 17:07:10 · 332 阅读 · 0 评论 -
Linux内核研究-内核开发-PGP
Linux内核开发中的PGP角色PGP帮助确保Linux内核社区的代码完整性,通过PGP签名邮件交换来在开发者间建立可信通信。Linux内核代码发布成两种主要格式: 分布式源码库(git) 周期性发布的快照(tarballs)不论是git库还中tarball都会有创建官方内核版本的内核开发者PGP签名,用于确保代码的完整性。 git库会为所有的tags提供PGP签名 ...翻译 2018-05-07 09:37:30 · 461 阅读 · 0 评论 -
Linux源码研究-内核开发-原理相关文档索引
Linux内核树中的文档Sphinx book , make {htmldocs | pdfdocs | epubdocs}在线文档 Linux内核邮件列表索引https://kernelnewbies.org/KernelGlossary如何通过Linux内核跟踪TCP连接的数据https://archive.org/details/linux_kernel_data_f...翻译 2018-05-07 10:10:51 · 337 阅读 · 0 评论 -
Linux源码研究-内核开发-魔数
使用魔数来保护内核数据结构是一个非常好的主意,这就允许你在运行期检查一个结构是否已经被攻击,或者你已经给一个例行程序通过了一个错误的结构。使用魔数值的方法是在结构的开始处声明的,如下:struct tty_ldisc { int magic; ... }; Magic Name Number Structure File PG_MAGIC ‘P’...翻译 2018-05-07 10:44:39 · 804 阅读 · 0 评论 -
Linux源码研究-内核开发-volatile类型
C程序员通常认为volatile表示某个变量可以在当前执行的线程外被改变,因此在内核中用到共享数据结构时,常常会有C程序员使用volatile这类变量,然而在内核中使用volatile几乎总是错误的。理解volatile的关键是知道它的目的用来消除优化,在内核中,程序员必须防止意外的并发访问破坏共享的数据结构,这其实是一个完全不同的任务。像volatile一样,内核提供了很多原语来保证并发...翻译 2018-05-07 11:14:25 · 578 阅读 · 0 评论 -
Linux源码研究-内核开发工具-Coccinelle
Coccinelle是一个文本模式转换的正则式匹配的工具。获取Coccinelle大部分Linux分支版本都有这个工具。 Debian Fedora Ubuntu OpenSUSE Arch Linux NetBSD FreeBSD还可以从http://coccinelle.lip6.fr/下载最新版,执行:./configuremake如果你是普通用户,...翻译 2018-05-07 13:31:40 · 3291 阅读 · 0 评论 -
Linux内核研究-内核开发工具-Sparse
Sparse是C语言的语义检查器。类型检查"__bitwise"是一个类型属性,所以你需要这么做:typedef int __bitwise pm_request_t;enum pm_request { PM_SUSPEND = (__force pm_request_t) 1, PM_RESUME = (__force pm_request_t)...翻译 2018-05-07 15:15:28 · 715 阅读 · 0 评论 -
Linux内核研究-内核开发工具-kcov
代码覆盖率(Code Coverage)是反映测试用例对被测软件覆盖程序的重要指标,kcov是用于随机测试中合适表达代码覆盖率的一种工具。前置需求内核需要配置CONFIG_KCOV=yCONFIG_KCOV需要231296以上版本的gcc,如果需要收集比较操作CONFIG_KCOV_ENABLE_COMPARISONS=y只有挂载了debugfs,才可以访问配置数据。...翻译 2018-05-08 15:13:39 · 4152 阅读 · 0 评论 -
Linux内核研究-内核开发工具-gcov
gcov是一个GCC使用的覆盖测试的工具,为了获得特定文件的覆盖结果,需要改变内核编译的目录和使用-o选项。# cd /tmp/linux-out# gcov -o /sys/kernel/debug/gcov/tmp/linux-out/kernel spinlock.c用途: 调试(这一行有没有到达) 改进测试(如何改进测试来覆盖这些行) 最小化内核配置(如果相关的代码...翻译 2018-05-08 16:05:51 · 1814 阅读 · 0 评论 -
Linux内核研究-内核开发工具-KASAN
Kernel Address Sanitizer是一个动态内存错误检测工具,常用来发现用后释放和越界的bug。使用在内核中启用KASANCONFIG_KASAN = y然后从CONFIG_KASAN_OUTLINE和CONFIG_KASAN_INLINE之间选择,前者产生较小的二进制文件,后者要快1.1~2倍。KASAN支持SLUB和SLAB内存分配器,为了更好的bug检测和...翻译 2018-05-08 16:22:29 · 2325 阅读 · 0 评论 -
Linux源码研究-内核开发工具-UBSAN
Undefined Behavior Sanitizer,用于运行时未定义行为检测。UBSAN使用编译时指令来获取未定义行为。编译器插入代码,在可能引起UB的操作之前运行某类检查,如果失败,会调用__ubsan_handle_*函数来输出错误信息。用法在内核中启用UBSANCONFIG_UBSAN=y检查全部内核CONFIG_UBSAN_SANITIZE_ALL=y ...翻译 2018-05-08 16:28:43 · 4811 阅读 · 0 评论 -
Linux源码研究-内核开发工具-Kmemleak
Kmemleak提供一种类似追踪垃圾回收的方式进行内存泄露检测方法。用法需要启用CONFIG_DEBUG_KMEMLEAK显示所有可能的内存泄露:# mount -t debugfs nodev /sys/kernel/debug/# cat /sys/kernel/debug/kmemleak立即触发一个内存扫描# echo scan > /sys/kerne...翻译 2018-05-08 16:42:12 · 955 阅读 · 0 评论 -
Linux源码研究-内核开发工具-gdb
gdb提供了一个python的脚本接口,内核提供了一些有用的脚本用来简化内核的调试步骤。设置 为QEMU/KVM创建一个虚拟机。 编译内核时启用CONFIG_GDB_SCRIPTS,但不要启用CONFIG_DEBUG_INFO_REQUCED。如果你的机器架构支持CONFIG_FRAME_POINTER,也开启这个选项。 把内核安装在guest,关闭KASLR。 在QEMU/KV...翻译 2018-05-08 16:53:20 · 359 阅读 · 0 评论