linux 4 内核 c,4. 使代码正确 — The Linux Kernel documentation
4.2.代码检查工具¶
至少目前,编写无错误代码仍然是我们中很少人能达到的理想状态。不过,我们希望做
的是,在代码进入主线内核之前,尽可能多地捕获并修复这些错误。为此,内核开发人
员已经组装了一系列令人印象深刻的工具,可以自动捕获各种各样的模糊问题。计算机
发现的任何问题都是一个以后不会困扰用户的问题,因此,只要有可能,就应该使用
自动化工具。
第一步只是注意编译器产生的警告。当代版本的GCC可以检测(并警告)大量潜在错误。
通常,这些警告都指向真正的问题。提交以供审阅的代码通常不会产生任何编译器警告。
在消除警告时,注意了解真正的原因,并尽量避免“修复”,使警告消失而不解决其原因。
请注意,并非所有编译器警告都默认启用。使用“make KCFLAGS=-W”构建内核以
获得完整集合。
内核提供了几个配置选项,可以打开调试功能;大多数配置选项位于“kernel hacking”
子菜单中。对于任何用于开发或测试目的的内核,都应该启用其中几个选项。特别是,
您应该打开:
启用 ENABLE_MUST_CHECK and FRAME_WARN 以获得一组额外的警告,以解决使用不
推荐使用的接口或忽略函数的重要返回值等问题。这些警告生成的输出可能是冗长
的,但您不必担心来自内核其他部分的警告。
DEBUG_OBJECTS 将添加代码,以跟踪内核创建的各种对象的生存期,并在出现问题时
发出警告。如果要添加创建(和导出)自己的复杂对象的子系统,请考虑添加对对象
调试基础结构的支持。
DEBUG_SLAB 可以发现各种内存分配和使用错误;它应该用于大多数开发内核。
DEBUG_SPINLOCK, DEBUG_ATOMIC_SLEEP and DEBUG_MUTEXES 会发现许多常见的
锁定错误.
还有很多其他调试选项,其中一些将在下面讨论。其中一些具有显著的性能影响,不应
一直使用。但是,在学习可用选项上花费的一些时间可能会在短期内得到多次回报。
其中一个较重的调试工具是锁定检查器或“lockdep”。该工具将跟踪系统中每个锁
(spinlock或mutex)的获取和释放、获取锁的相对顺序、当前中断环境等等。然后,
它可以确保总是以相同的顺序获取锁,相同的中断假设适用于所有情况,等等。换句话
说,lockdep可以找到许多场景,在这些场景中,系统很少会死锁。在部署的系统中,
这种问题可能会很痛苦(对于开发人员和用户而言);LockDep允许提前以自动方式
发现问题。具有任何类型的非普通锁定的代码在提交包含前应在启用lockdep的情况
下运行。
作为一个勤奋的内核程序员,毫无疑问,您将检查任何可能失败的操作(如内存分配)
的返回状态。然而,事实上,最终的故障恢复路径可能完全没有经过测试。未测试的
代码往往会被破坏;如果所有这些错误处理路径都被执行了几次,那么您可能对代码
更有信心。
内核提供了一个可以做到这一点的错误注入框架,特别是在涉及内存分配的情况下。
启用故障注入后,内存分配的可配置百分比将失败;这些失败可以限制在特定的代码
范围内。在启用了故障注入的情况下运行,程序员可以看到当情况恶化时代码如何响
应。有关如何使用此工具的详细信息,请参阅
Fault injection capabilities infrastructure。
使用“sparse”静态分析工具可以发现其他类型的错误。对于sparse,可以警告程序员
用户空间和内核空间地址之间的混淆、big endian和small endian数量的混合、在需
要一组位标志的地方传递整数值等等。sparse必须单独安装(如果您的分发服务器没
有将其打包,可以在 https://sparse.wiki.kernel.org/index.php/Main_page)找到,
然后可以通过在make命令中添加“C=1”在代码上运行它。
“Coccinelle”工具 http://coccinelle.lip6.fr/
能够发现各种潜在的编码问题;它还可以为这些问题提出修复方案。在
scripts/coccinelle目录下已经打包了相当多的内核“语义补丁”;运行
“make coccicheck”将运行这些语义补丁并报告发现的任何问题。有关详细信息,请参阅
其他类型的可移植性错误最好通过为其他体系结构编译代码来发现。如果没有S/390系统
或Blackfin开发板,您仍然可以执行编译步骤。可以在以下位置找到一组用于x86系统的
大型交叉编译器:
花一些时间安装和使用这些编译器将有助于避免以后的尴尬。
linux 4 内核 c,4. 使代码正确 — The Linux Kernel documentation相关推荐
- 【Linux 】内核签名(签名内核模块)、linux 驱动签名、安装特定版本的 kernel-devel
Linux 内核签名 Linux 内核签名(签名内核模块).linux 驱动签名_西京刀客-CSDN博客_linux内核签名 安装特定版本的 kernel-devel 两种方法. 一.yum 安装 查 ...
- linux不同内核驱动移植问题,基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)...
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- linux编译内核时出现问题:recipe for target ‘kernel/timeconst.h‘ failed
百度上有很多解决办法,说的是将/timeconst.ql文件中第373行的defined()去掉 但是我找遍了整个目录都没有看见有.ql的文件 后来我发现其实只需要安装bc就可以完成编译了 sudo ...
- 如何阅读linux软件程序代码,如何阅读linux源代码
如何阅读linux源代码 随着linux的逐步普及,现在有不少人对于Linux的安装已经比较熟悉了.与Linux的蓬勃发展相适应,想深入了解Linux的也越来越多.而要想深入了解Linux,就需要阅读 ...
- linux 的内核参数优化,Linux服务器内核参数优化
Linux服务器内核参数优化 cat >> /etc/sysctl.conf << EOF #kernel optimization net.ipv4.tcp_fin_time ...
- Linux 编译内核且增加一个系统调用
Linux 编译内核且增加一个系统调用 文章目录 Linux 编译内核且增加一个系统调用 一.在添加系统调用之前需要先编译一个Linux的内核. 解压 安装依赖 编译 安装内核 二.系统调用 声名和定 ...
- 初识Linux操作系统,Linux的特点与其他操作系统的区别,及Linux版本划分
操作系统 操作系统是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石.操作系统需要处理如管理与配置内存.决定系统资源供需的优先次序.控制输入设备与输出设备.操作网络与管理文件系统等 ...
- 浅谈Linux内核编程规范与代码风格
1 缩进 Tab的宽度是八个字符,因此缩进的宽度也是八个字符.有些异教徒想让缩进变成四个字符,甚至是两个字符的宽度,这些人和那些把 PI 定义为 3 的人是一个路子的. 注意:缩进的全部意义在于清晰地 ...
- 2012-Linux-18(使U-BOOT能正确引导LINUX for 1_20 error,but...)-1
1.为了能使得U-BOOT正确引导linux内核.必须传递合适的参数给内核. 修改include/configs/zj2410.h如下: -- -- /************************ ...
最新文章
- MySQL group replication
- linq调用mysql函数_如何为linq对象制作一个展平函数(Linq To Entities for mysql)?
- 云炬金融每日一题20210906
- 微信小程序开发系列教程三:微信小程序的调试方法
- Java 7中对String.substring的更改
- C++primer 第 3 章 字符串、向量和数组 3.1 命名空间的using声明 3.2标准库类型string
- LeetCode 1305. 两棵二叉搜索树中的所有元素(二叉树迭代器)
- 标签页 html实现,htmlcssjs实现tab标签页示例代码.pdf
- postgresql9.1_gaussdb200_解析表结构
- fragment类中的点击事件空指针异常
- android - 小技巧合集(不断更新)
- weka API,创建线性回归时出现缺少no.uib.cipr.matrix和org.netlib.blas的解决方案
- 都说发展存储产业一定要走IDM模式,你怎么看?
- 各种定律(心理学定律、思考定律)
- C#实现程序一次打开两个窗口,两个窗口分别放置在两个屏幕
- Android MVP伴侣,Nucleus框架使用简介
- 判断方阵是否沿主对角线对称
- windows功能_Windows新功能全在这,新系统确实强大!
- 【魔方攻略】SQ1魔方教程(原创)
- 【T3】打印单据(非新打印)表头显示不全
热门文章
- 【Python3网络爬虫开发实战】1.3.1-lxml的安装
- 【技术角度看问题之一】ARM到底是个啥?
- 不会吧不会吧!不会有人还有没有用CSDN的浏览器插件吧!
- python3 循环语句 for语句和while语句
- 微信开发---微信网页授权、JS-SDK和微信公众号的基本设置
- mongodb更新操作符$min,$max
- android开发,加法,上课写的demo
- android socket 代理服务器,Android 使用Socket进行服务器通信
- 普通路由器改4g路由器_4G宽带随心用,办公娱乐更自由,蒲公英X4C路由器体验|路由器|蒲公英|宽带|wifi|sim...
- Java基础01 1个和2个区别比较