首页
学习
活动
专区
工具
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.4K50

Linux内核源码分析方法

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

5.2K70

Linux kernel 设计是否已经过时?

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

1.1K60

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

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

1.9K20

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

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

53441

聊一聊内核和微内核

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

2.1K30

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

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

2K10

操作系统内核之争

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

2.5K60

linux内核编程_linux内核是什么

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

18.8K30

第 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.3K11

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

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

1.8K21

在生产环境中使用 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.5K10

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

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

1.2K10

Linux内核源码规范解析

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

2.7K20

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

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

69330

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

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

2.3K40

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

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

3.6K41

什么是微内核架构设计?

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

1.3K20

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.2K20

BPF 可移植性和 CO-RE(一次编译,到处运行)

接下来内容如下: 首先讨论 BPF 可移植性问题本身,分析它所面临挑战,以及为什么解决这些挑战如此重要; 然后从较高层次查看 BPF CO-RE 各组件,以及它们如何组织成一个完整方案解决这个问题...这听上去似乎不可能 —— 内核环境都在不断变化, 依赖内核环境执行 BPF 程序又如何能幸免于难呢? 但实际上,这是可能: 首先,不是所有 BPF 程序都依赖内核内部数据结构。...DWARF)并不记录 #define ,因此某些常用 可能在 vmlinux.h 是缺失。...4.4 根据用户提供配置修改程序行为 BPF 程序知道内核版本和配置信息,有时还不足以判断如何 —— 以及以何种方式 —— 从该版本内核获取数据。...在这些场景,用户空间控制应用(control application)可能是唯一知道 究竟需要做哪些事情,以及需要启用或禁用哪些特性主体。

1.7K20
领券