首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内核中可能/不太可能的宏如何工作以及它们的好处是什么?

Linux内核是一个复杂的操作系统,它支持许多不同的硬件设备和系统,其中许多都需要特定的宏来实现正确的行为。在这里,我将为每个可能的宏提供简要描述,以及一个好处。对于不太可能的宏,我会简要解释它们。

可能宏:

  1. 内核宏:#define CONFIG_ABC: 该宏定义了配置选项,例如CPU核心数或CPU性能。
  2. #define CONFIG_DEF_DRV: 该宏定义了一个可选的驱动程序,例如网络设备驱动。
  3. #define CONFIG_GHI: 该宏可用于定义CPU功能,例如支持特定的指令集。

不太可能的宏:

  1. #define BUG() do_bug_me()::这个宏用于表示内核中的错误情况。
  2. #define WARN_ON_ONCE(condition) */;: 这个宏用于在运行中向用户发出警告,但是它不会报告警告,直到发生了不止一个条件。

好处:

宏简化了内核源代码,提高了可读性。这些宏有助于减少重复和冗余代码,并帮助调试和修复内核中的问题。在调试阶段,可以轻松找到并修复潜在的问题。宏还简化了内核配置过程,并且可以减少可能出现的错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux内核代码中max和min宏的实现以及语句表达是({})的应用

Linux内核代码中有很多比较精巧的程序设计技巧,include/linux/kernel.h中实现max和min宏就是其中的一部分。...我们先来看一下普通的max和min一般怎么写: #define min(x,y) ((x)>(y)?(y):(x)) #define max(x,y) ((x)>(y)?...(x++) : (y++)) 很明显,这么做是不安全的,那我们来看Linux Kernel是如何做的: #define max(x, y) ({ \ typeof(..._max1 : _max2; }) 这么做主要涉及以下几个知识点: 1、typeof(x) 找出x的数据类型 2、语句表达是({S1;S2;......;Sn;}) 总的语句表达是的值是Sn,这个技巧我之前写代码是也用到过,呵呵 3、(void) (&_x == &_y);的巧妙 这个主要是用来判断x,y数据类型是否一样,利用了编译器的一个小特性:不同数据类型的变量进行比较时会产生

1.5K50

Linux内核源码分析方法

透过阅读Linux内核代码的方式,我们学习到的不光是内核相关的知识,在我看来更具价值的是学习和体会它们的编程技巧以及对计算机的理解。...我也是通过一个项目接触了Linux内核源码的分析,从源码的分析工作中,我受益颇多。除了获取相关的内核知识外,也改变了我对内核代码的过往认知: 1.内核源码的分析并非“高不可攀”。...如何在保证内核高效的前提下提高内核的可维护性,这需要依赖于内核中那些“优美”的设计。 3.神奇的编程技巧。...总之这里的一切资源指的就是你能想到的一切可用资源。当然,我们不太可能通过这种形式的信息搜集获得所有的我们想要的信息,我们只求尽可能全面即可。...因此,我们需要对资料中涉及代码文件的资料进行仔细甄选。当然,这一步也不太可能一次性完成,谁也不能保证一次就能选择出所有待分析的源码文件而且一个不漏。

5.4K70
  • Linux kernel 的设计是否已经过时?

    然后,文件系统驱动要求内核与硬件通信,这也意味着两次 ring transitions。然后文件系统驱动发送其回复,这意味着又一轮的两次,以及另一次上下文切换。...宏内核将所有设备驱动合拢到内核中。所以当出现一个错误的图形驱动,就可以占用内核,或者如果它有一个安全漏洞,那么可能被用来危及系统。...KugelKurt: 尽管这里讨论的大部分内容都是关于微内核与宏内核的关系,但是最近的研究还涉及到编程语言。如果你今天启动一个全新的内核,那么就可能不会用 C 去写。...比如,理论上微内核也有一些非常好的设计选择,使得它们具有便携性、可靠性和潜在的自我修正能力。 然而,无论理论多么好,人们总是会根据实际情况进行设计。...Linux 内核拥有如此多的硬件支持,那么多公司支持开发,其他内核(不管设计得多炫酷)都不太可能赶得上。

    1.2K60

    被神话的Linux, 一文带你看清Linux在多核可扩展性设计上的不足

    ---- 有破就要有立,我下面将用一套用户态的代码来模拟 无仲裁的宏内核 以及 有仲裁的微内核 分别是如何对待共享资源访问的。代码比较简单,所以我就没加入太多的注释。...---- 当我们评价传统UNIX以及Linux这种操作系统内核时,应该更多的去看它们缺失了什么,而不是一味的觉得它们就是对的。...操作系统以两种态度对待它们: 认为其它资源并非操作系统核心的一部分,于是微内核,用户态驱动等等就形成了概念。 认为其它底层的资源也是操作系统核心的一部分,这就是宏内核比如Linux的态度。...态度如何,这并不重要,宏内核,微内核,用户态,内核态,这些也只是概念而已,没有什么大不了的。关键的问题乃是: 如何协调共享资源的分配。 或空间资源,或时间资源的或并发争锁,或仲裁调度的方式分配。...无疑,最大的争议就在CPU/内存之外如何协调非进程虚拟化的文件系统的访问和网络协议栈的访问。但无论它们俩的哪一个,目前无论是宏内核还是微内核都有非常非常棒的方案。

    2K20

    Linux设备驱动程序(二)——建立和运行模块

    内核编程和应用程序编程之间的重要不同是每一个环境是如何处理错误:在应用程序开发中段错误是无害的,一个调试器常常用来追踪错误到源码中的问题,而一个内核错误至少会杀掉当前进程,如果不终止整个系统。...2、内核的并发 常见引起并发原因: linux 系统中通常正在运行多个并发进程,并且可能有多个进程同时使用我们的驱动程序。...3、版本依赖 如果你编写一个模块想用来在多个内核版本上工作(特别地是如果它必须跨大的发行版本)你可能只能使用宏定义和 #ifdef 来使你的代码正确建立,利用 linux/version.h 中发现的定义...五、内核符号表 通常情况下,一个模块完成它自己的功能不需要输出如何符号。但是,你需要输出符号,在任何别的模块能得益于使用它们的时候。...最重要的设备不能在用户空间处理,包括但不限于网络接口和块设备。 十、快速参考 insmod modprobe rmmod 用户空间工具,加载模块到运行中的内核以及去除它们。

    90941

    聊一聊宏内核和微内核

    宏内核和微内核最大的区别就是,宏内核的用户服务和内核服务都保存在相同的地址空间中,它们都由内核进行统一管理,而微内核的用户服务和内核服务会保存在不同的地址空间中,下图可以很好的解释这一点。...现代成功的 CPU 设计包括这两种技术中的任何一种,就像 Linux 内核是微内核和宏内核的混合产品一样。...可能有些人认为 Linux 它不就是个宏内核结构么,但实际上 Linux 不单单只是一个纯碎的集成内核。为什么 Linux 会使用单内核(此处叫单内核有点应景)结构呢?我猜有下面几个因素。...问题是没有必要为了追求未经证实的可维护性的小幅增加而重写 Linux 内核。Linus 一再强调以下观点:为了这个好处而损失速度是不值得的。...Linux 是一个借鉴了微内核精髓的宏内核结构,Linux 支持模块化的设计、抢占式内核、对内核线程的支持以及动态加载内核模块的能力。

    3.3K30

    【讨论】Linux kernel 的设计是否已经过时?微内核?

    在开源中国看到“Linux kernel 的设计是否已经过时?”这个题目,正好有企业界的朋友问到L4 基于微内核的操作系统怎么样。微内核与宏内核争论似乎是永远的话题,只是看你站在什么角度。...宏内核将所有设备驱动合拢到内核中。所以当出现一个错误的图形驱动,就可以占用内核,或者如果它有一个安全漏洞,那么可能被用来危及系统。...KugelKurt: 尽管这里讨论的大部分内容都是关于微内核与宏内核的关系,但是最近的研究还涉及到编程语言。如果你今天启动一个全新的内核,那么就可能不会用 C 去写。...比如,理论上微内核也有一些非常好的设计选择,使得它们具有便携性、可靠性和潜在的自我修正能力。 然而,无论理论多么好,人们总是会根据实际情况进行设计。...Linux 内核拥有如此多的硬件支持,那么多公司支持开发,其他内核(不管设计得多炫酷)都不太可能赶得上。 例如,MINIX 具有良好的设计和一些很棒的功能,但硬件支持很少,几乎没有人为此平台开发。

    2.2K10

    鸿蒙系统 PC 版要来了?和现有国产 PC 系统有什么不同?

    从大类上划分,操作系统一般有宏内核(Monolithic Kernel)和微内核(Microkernel)两种架构,它们的主要区别在于内核的功能划分和实现方式。...由于所有核心功能在内核空间中运行,不涉及频繁的上下文切换,因此系统调用和内核操作的性能较高。对于许多操作系统开发者来说,宏内核架构相对简单,因为所有核心功能集中在内核中,数据传递和调用路径短。...操作系统是伴随则电脑的发展而成长起来的,早期硬件性能比较差,所以Linux、Windows、BSD 等随着 PC 发展起来的操作系统,都是采用宏内核架构。...其次,从商业竞争的角度来看,其他厂商也不太可能采用鸿蒙系统,尤其是那些与华为产品线直接竞争的公司,如小米。这是可以理解的,毕竟软硬件都掌握在竞争对手手中,这无异于把命脉交给对方。...通过本土化定制和深度优化,它们能够更好地适应中国市场的需求。例如,在安全性、兼容性和国产化硬件支持方面,这些系统均做了大量工作,逐渐完善了本土生态链。

    23210

    操作系统内核之争

    然而,如果开发顺利,宏内核结构就可以从运行效率上得到好处。...“老一点的操作系统都是宏内核的,也就是说,整个操作系统是一个运行在核心态的单独的a.out文件, 这个二进制文件包含进程管理,内存管理,文件系统以及其他。...另一种便是微内核,在这种系统中,操作系统的大部分都运行在单独的进程,而且多数在内核之外。它们 之间通过消息传递来通信。内核的任务是处理消息传递,中断处理,底层的进程管理,以及可能的I/O。...宏内核的代表:Linux 在Linux中,进程的结构如下: Struct task_struct{ pid_t pid;...这两个例子都可以看到宏内核与微内核有结合的趋势,但还没有完全真正的结合成功,不过它们都已经同时具备了模块化和内核空间运行等的特征。

    2.9K60

    linux内核编程_linux内核是什么

    内核——操作系统的内在核心 设备驱动程序 启动引导程序 命令行shell 其他种类的用户界面—-操作系统的外在表象 基本的文件管理工具和系统工具 Linux内核的组成 Linux内核源代码目录结构是什么...内核可进行任何操作,而应用程序则被禁止对硬件的直接访问和对内存的未授权访问。划分内核空间和用户空间用来区分程序执行的这两种不同状态,它们使用不同的地址空间。 如何实现从用户空间到内核空间的控制转移?...记录哪些部分被编译入内核、哪些部分被编译为内核模块。 在Linux 内核中增加程序需要完成哪些工作? 将编写的源代码复制到Linux 内核源代码的相应目录。...Linux下的C 编程 Linux中宏定义、变量名、函数名命名习惯是什么?...arg 表示其余的参数可以是零个或多个,这些参数以及参数之间的逗号构成 arg 的值,在宏扩展时替换arg,使用“##”的原因是处理arg 不代表任何参数的情况,这时候,前面的逗号就变得多余了。

    18.9K31

    第 1 部分: 在生产环境中使用 eBPF 调试 Go 程序

    在开发环境中, Delve 和 GDB 工作得很好, 但是在生产环境中并不经常使用它们. 那些使调试器强大的特性也让它们不适合在生产环境中使用....为了更好地捕获函数参数, 我们将探索使用 eBPF(在 Linux 4.x+ 中可用) 以及高级的 Go 程序库 gobpf. eBPF 是什么 ?...扩展的 BPF(eBPF) 是 Linux 4.x+ 里的一项内核技术. 你可以把它想像成一个运行在 Linux 内核中的轻量级的沙箱虚拟机, 可以提供对内核内存的经过验证的访问....下图显示了 Linux 内核如何使用uprobe 修改二进制文件. 软中断指令(int3)作为第一条指令被插入 main.computeE 中....另外, 因为这一过程工作在二进制层面, 它也可以用于其他语言(C++, Rust 等)编译的二进制文件. 我们只需考虑它们各自 ABI 的差异. 下一步是什么 ?

    1.4K11

    一张图看懂linux内核中percpu变量的实现

    但你知道吗,不仅是在编程语言中,在linux内核中,也有一个类似的机制,用来实现类似的目的,它叫做percpu变量。...linux内核在启动时,会先把vmlinux文件加载到内存中,然后根据cpu的个数,为每个cpu都分配一块用于存放percpu变量的内存区域,之后把vmlinux中的.data..percpu section...读过linux内核源码的同学都知道,在linux内核中,宏使用的非常多,且比较复杂,如果我们对自己进行宏展开的正确性没有信心的话,可以使用下面我介绍的这个方式,使用它,你可以非常容易的得到任意文件宏展开后的结果...那如何找到编译各个源文件时使用的命令呢? 这个内核其实已经帮我们做好了。...到这里,有关percpu变量的所有准备工作都已做好,下面我们来看下,在内核vmlinux文件启动过程中,它是怎么利用这些信息,为各个cpu分配percpu内存块,初始化内存块数据,及设置内存块地址到gs

    2.4K21

    在生产环境中使用 eBPF 调试 GO 程序

    观察状态的一种简单方法是使用调试器来捕获函数的参数。对于 Go 程序来说,我们经常使用 Delve 或者 GDB。 在开发环境中,Delve 和 GDB 工作得很好,但是在生产环境中并不经常使用它们。...为了更好地捕获函数参数,我们将探索使用 eBPF(在 Linux 4.x+ 中可用)以及高级的 Go 程序库 gobpf。 eBPF 是什么?...扩展的 BPF(eBPF) 是 Linux 4.x+ 里的一项内核技术。你可以把它想像成一个运行在 Linux 内核中的轻量级的沙箱虚拟机,可以提供对内核内存的经过验证的访问。...另外,因为这一过程工作在二进制层面,它也可以用于其他语言(C++,Rust 等)编译的二进制文件。我们只需考虑它们各自 ABI 的差异。 下一步是什么?...最大的缺点是,即使是最简单的程序状态的观测性,也需要编写代码来实现。编写和维护 BPF 代码很复杂。没有大量高级工具,不太可能把它当作一般的调试手段。

    1.6K10

    我是怎么样写出开发内功修炼的?秘密都在这里!

    这么做的好处是你不仅是有了实践经验,而且对你掌握的理论知识的认识也会进一步加深。 如果你已经工作了,可能手头的活儿干了很多。...比如我当时想查询内存的延时,带宽性能的时候,想看下内存的整体工作原理、CL、CD等各种延时究竟是什么含义。...这种对理论知识进行深度思考再加动手验证以后得来的知识在脑子里的印象特别深的。你几乎不太可能忘了它,因为它已经彻底内化到你的知识体系里了。...在我思考的过程中,虽然说有时候连经典的技术书籍也不一定能给到我全部想到的答案。但它们的价值仍然是非常巨大,所以值得你拥有。不单单是要看一遍,而且在工作中遇到问题的时候随时要拿出来查。...将socket怎么实现的,内核是如何监听的,怎么样来接收连接请求大概都写了一遍。如果你看其它书有难度的时候,可以把这本书拿出来帮你一下。

    1.4K10

    Linux内核源码规范解析

    15 内联弊病 16 函数返回值及命名 17 不要重新发明内核宏 18 编辑器模式行和其他需要罗嗦的事情 19 内联汇编 20 条件编译 从编码风格错误开始 曾经在开发Linux内核驱动的时候,创建了一个补丁文件...因此,Linux 特有的等同于标准类型的 u8/u16/u32/u64 类型和它们的有符号 类型是被允许的——尽管在你自己的新代码中,它们不是强制要求要使用的。...linux/device.h> 里有一些驱动模型诊断宏,你应该使用它们,以确保信息对应于正确 的设备和驱动,并且被标记了正确的消息级别。...17 不要重新发明内核宏 头文件 include/linux/kernel.h 包含了一些宏,你应该使用它们,而不要自己写一些 它们的变种。...19 内联汇编 在特定架构的代码中,你可能需要内联汇编与 CPU 和平台相关功能连接。需要这么做时 就不要犹豫。然而,当 C 可以完成工作时,不要平白无故地使用内联汇编。

    2.8K20

    牛客网论坛最具争议的Linux内核成神笔记,GitHub已下载量已过百万

    此外,由于Linux内核在实时补丁期间可以连续工作,因此在应用补丁进行安全修复时不会出现宕机。 1.2Linux 内核的作用是什么?...你会发现Linux这个复杂的系统开始透明起来。 二、如何学习Linux内核? 内核的知识就像下面的绳结一样,一环扣一环,我们要解开它们,就必须要先找到线头也就是内核中的函数接口。...记录内核中用法的好处或者有疑问的地方,这样你再次来看的话可能会有新的体会,能在之前看代码的基础上形成一个不断积累的过程,理解会更加深刻。...我希望你能更多地了解软件和硬件是如何配合工作的,以及启动电脑所需的文件。 五,学习Linux内核 学习linux内核不像学习语言。一个月或者三月就能掌握C或者java。...每个月诞生那么多的新硬件,如何让他们在Linux上工作起来,这是你的工作。

    93530

    什么是微内核架构设计?

    导读:作为一名Java程序员,相信同学们都听说过微内核架构设计,也有自己的理解。那么微内核是如何被提出来的?微内核在操作系统内核的设计中又有什么作用?...说白了,微内核是相对于宏内核而言的,像Linux就是典型的宏内核,它除了时钟中断、进程创建与销毁、进程调度、进程间通信外,其他的文件系统、内存管理、输入输出、设备驱动管理都需要内核完成。...微内核通过进程间通信来协调各个系统进程间的合作,这就需要系统调用,而系统调用需要切换堆栈以及保护进程现场,比较耗费时间;而宏内核则是通过简单的函数调用来完成各个模块之间的合作,所以理论上宏内核效率要比微内核高...那我们看一下微内核是如何解决服务之间的通讯问题的?以下摘自维基百科: 因为所有服务行程都各自在不同地址空间运行,因此在微核心架构下,不能像宏内核一样直接进行函数调用。...这就是微内核和宏内核之间的争论之处,使用函数调用非常快,而进程间的消息通讯则是非常慢的,但是这种通过中介进行通讯机制的好处也是非常明显的。那么如何提升这种基于总线的通讯性能呢?

    1.5K20

    【专业技术】如何在Linux中添加新的系统调用

    在Linux中,大 部分的系统调用包含在Linux的libc库中,通过标准的C函数调用方法可以调用这些系统调用。那么,对Linux的发烧友来说,如何在Linux中增 加新的系统调用呢? ?...它所要做的工作只是将送给系统调用的参数加载到CPU寄存器中,接着执行int $0x80指令。...它们可以用在程序中。这些宏指令取一定的参数,然后扩展为调用指定的系统调用的函数。   ...后面是系统调用所需要的每个参数。这一宏指令后面还有两个参数uid_t和uid分别用来指定参数的类型和名称。   另外,用作系统调用的参数的数据类型有一个限制,它们的容量不能超过四个字节。...#pwd   /usr/src/linux   # 超级用户在当前工作目录(/usr/src/linux)下,才可以重建内核。

    2.4K40

    有关微内核OS史上最透彻一篇 - 写于华为鸿蒙发布一周之际

    要想快速理解什么是微内核,了解一个常用的场景在微内核中是如何表现的,便是最有效率的方法了,加以和宏内核同样的场景进行对比,基本就了解微内核行为的大概了。是为情景分析。...其实,可以这样理解,在微内核中,FS,MM这些服务进程的逻辑以及快照数据在宏内核中就是对应内核本身的,只不过它们的访问方式不同: 宏内核通过函数调用访问特定的逻辑和数据。...微内核通过IPC(进程间通信)访问特定的逻辑和数据。 作为对比,我们看一下宏内核Linux是如何完成与上面的情景IPC等价的操作步骤的: ?...首先,内核很小,出现问题的概率自然小,即便出现问题,也很容易知道如何去恢复而不会对其它结构造成损害;其次,很多重要的数据结构以及逻辑都在用户态的服务进程中,比如文件系统,网络协议栈,甚至驱动,这种服务进程拥有自己隔离的地址空间...将Linux改成微内核有多难? 很难,但也不是不可能。首先,需要改变Linux特定代码和数据的地址空间结构,说到底就是将它们映射在用户态的空间并且给它们一套独立的页表。

    4.4K41

    BPF的可移植性和CO-RE (Compile Once – Run Everywhere)

    BPF:最前沿的技术 自BPF成立以来,BPF社区将尽可能简化BPF应用程序的开发作为工作重点,目的是将BPF的使用变得与用户空间的应用一样简单明了。...不同的内核版本会在结构体内部混用结构体字段,甚至会转移到新的内部结构体中。结构体中的字段可能会被重命名或删除,类型可能会改变(变为微兼容或完全不同的类型)。...BPF CO-RE:面向用户的体验 现在我们将看一下BPF应用的一些典型场景,以及如何通过BPF CO-RE解决兼容性问题。...该头文件包含了所有的内核类型:暴露了UAPI,通过kernel-devel提供的内部类型,以及其他一些更加内部的内核类型 不幸的是,BTF(即DWARF)不会记录#define宏,因此在vmlinux.h...中丢失一些常用的宏。

    1.4K20
    领券