返回顶部
首页 > 资讯 > 操作系统 >如何理解Linux内核驱动的编码风格
  • 874
分享到

如何理解Linux内核驱动的编码风格

2023-06-16 13:06:20 874人浏览 薄情痞子
摘要

本篇文章给大家分享的是有关如何理解linux内核驱动的编码风格,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。最近在向Linux内核提交一些驱动程序,在提交的过程中,发现自己的代

本篇文章给大家分享的是有关如何理解linux内核驱动的编码风格,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

最近在向Linux内核提交一些驱动程序,在提交的过程中,发现自己的代码离Linux内核的coding  style要求还是差很多。当初自己对内核文档里的CodingStyle一文只是粗略的浏览,真正写代码的时候在很多细节上会照顾不周。不过, 在不遵守规则的程序员队  伍里,我并不是孤独的。如果去看drivers/staging下的代码,就会发现很多驱动程序都没有严格遵守内核的coding  style,而且在很多驱动程序的TODO文件里,都会把”checkpatch.pl  fixes”作为自己的目标之一(checkpatch.pl是用来检查代码是否符合coding style的脚本)。

不可否认,coding style是仁者见仁、智者见智的事情。比如Microsoft所推崇的匈牙利命名法,在Linus看来就是及其脑残(brain  damaged)的做法。也许您并不赞成Linus制定的coding  style,但在提交内核驱动这件事上,***还是以大局为重。对于这么一个庞大的集市式的开发来说,随意书写代码必将带来严重的可维护性的灾难。

一些辅助工具

当代码量达到一定程度时,手动去检查和修改coding style是非常繁琐的工作,幸好,我们还有一些工具可以使用。

scripts/checkpatch.pl

这是一个检查代码是否符合内核编码规范的的脚本。顾名思义,checkpatch是用来检查patch的,默认的调用也确实如此。如果用来检查原文件,需要加上“-f”的选项。

我们来看一段无聊的代码(文件名为print_msg.c):

void print_msg(int a) { switch (a) { case 1: printf("a == 1\n"); break;  case 2: printf("a == 2\n"); break; } }

这段代码的coding style是否有问题呢?用checkpatch.pl来检查一下:

scripts/checkpatch.pl -f print_msg.c

检查的结果是:

ERROR: switch and case should be at the same indent #3: FILE: switch.c:3: + switch (a) { + case 1: [...] + case 2:  total: 1 errors, 0 warnings, 12 lines checked  switch.c has style problems, please review. If any of these errors are false positives report them to the maintainer, see CHECKPATCH in MAINTAINERS.

在Linux内核的coding  style里,switch和case要求有相同的缩进。本例的代码很少,错误也只有这一个,手动修改很方便。如果类似的缩紧错误很多怎么办?

scripts/Lindent

scripts目录下的工具Lindent可以用来自动修改缩进问题。提醒一下,使用Lindent要求系统安装indent这个工具。

对于上面这个例子,执行Lindent命令:

scripts/Lindent print_msg.c

得到的新代码是:

void print_msg(int a) { switch (a) { case 1: printf("a == 1\n"); break;  case 2: printf("a == 2\n"); break; } }

sed

sed是一个流编辑器,其强大的功能可以帮助我们处理很多重复性的工作。比如,Linux内核的coding  style要求,行尾不能有空格(包括Tab),去除这些空格就可以借助sed。

我自己的习惯很差,经常在代码的行尾留下一些空格。比如一行代码过长需要换行时,总是下意识的在换行的地方敲一个空格。另外,我常用的编辑器之一的Kate,为了对齐的需要,经常在空行的前面留上几个缩进的Tab(如下图)。

如何理解Linux内核驱动的编码风格

手动去除这些行尾的空格是一件头大的事情,但对于sed来说不过是举手之劳。命令格式如下:

sed ‘s/[ \t]*$//g’ your_code.c

一些需要注意的Coding Style

缩进

除了注释、文档和Kconfig之外,使用Tab缩进,而不是空格,并且Tab的宽度为8个字符;

switch … case …语句中,switch和case具有相同的缩进(参考上文);

花括号

花括号的使用参考K&R风格。

如果是函数,左花括号另起一行:

int function(int x) { body of function }

否则,花括号紧接在语句的***:

if (x is true) { we do y }

如果只有一行语句,则不需要用花括号:

if (condition) action();

但是,对于条件语句来说,如果一个分支是一行语句,另一个分支是多行,则需要保持一致,使用花括号:

if (condition) { do_this(); do_that(); } else { otherwise(); }

空格

在关键字“if, switch, case, for, do, while”之后需要加上空格,如:

if (something)

在关键字“sizeof, typeof, alignof, or __attribute__”之后不要加空格,如:

sizeof(struct file)

在括号里的表达式两边不要加空格,比如,下面是一个反面的例子:

sizeof( struct file )

大多说的二元和三元运算符两边需要空格,如“= + &ndash; < > * / % | & ^ <= >= == != ?  :”;

一元运算符后面不要空格,如“& * + &ndash; ~ ! sizeof typeof alignof __attribute__  defined”;

在前缀自增自减运算符之后和后缀自增自减运算符之前不需要空格(“++”和“&ndash;”);

结构成员运算符(“.”和“->”)的两边不需要空格;

行尾不需要空格;

注释

使用C89的“”风格而不是C99的“// &hellip;”风格;

对于多行注释,可以参考下例:

Kconfig

“config”定义下面的语句用Tab缩进,help下面的语句再额外缩进两个空格,如:

config AUDIT bool "Auditing support" depends on NET help Enable auditing infrastructure that can be used with another kernel subsystem, such as SELinux (which requires this for logging of avc messages output). Does not do system-call auditing without CONFIG_AUDITSYSCALL.

多行的宏定义需要用“do .. while”封装,如:

#define Macrofun(a, b, c) \ do { \ if (a == 5) \ do_this(b, c); \ } while (0)

函数返回值

函数返回值的定义***也要遵循一定的章法。

如果函数的名称是一种动作或者命令式的语句,应该以错误代码的形式返回(通常是0表示成功,-Exxx这种形式的负数表示错误),如:

do_something()

如果函数的名称是判断语句,则返回值应该类似与布尔值(通常1表示成功,0表示错误),如:

something_is_present()

以上就是如何理解Linux内核驱动的编码风格,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网操作系统频道。

--结束END--

本文标题: 如何理解Linux内核驱动的编码风格

本文链接: https://lsjlt.com/news/283885.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何理解Linux内核驱动的编码风格
    本篇文章给大家分享的是有关如何理解Linux内核驱动的编码风格,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。最近在向Linux内核提交一些驱动程序,在提交的过程中,发现自己的代...
    99+
    2023-06-16
  • Linux内核编码风格分析
    这篇文章主要介绍了Linux内核编码风格分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux内核编码风格分析文章都会有所收获,下面我们一起来看看吧。为什么要竖向对齐代码?举一个简单的例子:int&nbs...
    99+
    2023-06-17
  • 如何理解Linux驱动中内核互斥锁
    如何理解Linux驱动中内核互斥锁,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 互斥体概述信号量是在并行处理环境中对多个处理器访问某个公共资源进行保护的机制,mut...
    99+
    2023-06-15
  • 如何理解Linux内核编译
    这篇文章给大家介绍如何理解Linux内核编译,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、前言(仅供参考)linux内核该如何学习安装vmware虚拟机或者virtualbox,再安装发行版本linuxwww.ke...
    99+
    2023-06-15
  • 如何养成良好的Linux编码风格
    这篇文章将为大家详细讲解有关如何养成良好的Linux编码风格,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Linux操作系统是一个开源的操作系统,为此你在Linux系统上开发的一个工具软件,...
    99+
    2023-06-17
  • Linux内核设备驱动之内核的时间管理笔记整理
    (1)内核中的时间概念 时间管理在linux内核中占有非常重要的作用。 相对于事件驱动而言,内核中有大量函数是基于时间驱动的。 有些函数是周期执行的,比如每10毫秒刷新一次屏幕; 有些函数是推后一定时间执行的,比...
    99+
    2022-06-04
    linux内核的时间管理 linux内核设备驱动
  • Linux内核设备驱动之内核的调试技术笔记整理
    (1)内核源代码中的一些与调试相关的配置选项 内核的配置选项中包含了一些与内核调试相关的选项,都集中在"kernel hacking"菜单中。包括: CONFIG_DEBUG_KERNEL 使其他的调试选项可用,...
    99+
    2022-06-04
    linux内核调试 linux内核调试技术 linux内核设备驱动
  • Linux内核设备驱动之内核中链表的使用笔记整理
    (1)介绍 在linux内核中使用了大量的链表结构来组织数据,包括设备列表以及各种功能模块中的数据组织。这些链表大多采用在include/linux/list.h实现的一个相当精彩的链表数据结构。 链表数据结构的...
    99+
    2022-06-04
    linux内核中链表的使用 linux内核设备驱动
  • 如何理解Linux内核的文件
    本篇内容介绍了“如何理解Linux内核的文件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Linux文件预读算法磁盘I/O性能的发展远远滞后...
    99+
    2023-06-13
  • 如何理解Linux内核中Watchdog
    这期内容当中小编将会给大家带来有关如何理解Linux内核中Watchdog,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在Linux内核中有三个watchdog,它们都需要被悉心的喂养照料,分别是: /d...
    99+
    2023-06-15
  • 如何理解Linux内核信号量
    本篇文章给大家分享的是有关如何理解Linux内核信号量,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。概念Linux内核的信号量在概念和原理上和用户态的System V的IPC机...
    99+
    2023-06-15
  • 如何解决Linux内核编译失败的问题
    本篇内容主要讲解“如何解决Linux内核编译失败的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决Linux内核编译失败的问题”吧!内核常识我们先要了解一点.一个内核有哪些东西.比如我...
    99+
    2023-06-12
  • 如何理解linux内核的软中断的情况
    这篇文章主要讲解了“如何理解linux内核的软中断的情况”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解linux内核的软中断的情况”吧!软中断介绍把可以延迟的处理从硬中断处理程序独立...
    99+
    2023-06-13
  • Java+Linux内核源码之如何理解多线程之进程
    这篇文章主要讲解了“Java+Linux内核源码之如何理解多线程之进程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java+Linux内核源码之如何理解多线程之进程”吧!Linux 内核如...
    99+
    2023-06-15
  • Linux内核中的数据双链表如何理解
    这篇文章给大家介绍Linux内核中的数据双链表如何理解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Linux 内核中自己实现了双向链表,可以在 include/linux/list.h 找到定义。我们将会首...
    99+
    2023-06-28
  • 如何在ArchLinux中进行内核和驱动程序的更新和管理
    在ArchLinux中,可以使用以下步骤来更新和管理内核和驱动程序: 更新系统:首先,使用以下命令来更新系统的软件包列表和已安装的...
    99+
    2024-04-02
  • 如何理解Linux内核参数overcommit_memory和OOM killer
    如何理解Linux内核参数overcommit_memory和OOM killer,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是Linux Overcommit和OOMo...
    99+
    2023-06-05
  • linux内核的安全问题如何解决
    要解决Linux内核的安全问题,可以采取以下措施:1. 及时更新:及时更新Linux内核版本,以获取最新的安全补丁和修复程序。2. ...
    99+
    2023-10-18
    linux
  • 测试驱动技术系列之如何理解操控excel的核心api
    这篇文章主要讲解了“测试驱动技术系列之如何理解操控excel的核心api”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“测试驱动技术系列之如何理解操控excel的核心api”吧!测试数据格式展...
    99+
    2023-06-15
  • Linux设备驱动指的定时与延时如何理解
    本篇文章为大家展示了Linux设备驱动指的定时与延时如何理解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Linux通过系统硬件定时器以规律的间隔(由HZ度量)产生定时器中断,每次中断使得一个内核计...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作