LWN:在kernel中更安全地使用可变长度数组!

A struct sockaddr sequel Linux内核网络子系统面临的安全挑战源于40年前定义的sockaddr结构体。KSPP项目十年来致力于改进数组边界检查,但sockaddr的变长使用方式(未声明为可变数组却实际充当可变数组)成为主要障碍。Kees Cook提出的解决方案是引入新的sockaddr_unsized结构体专门用于内部接口,同时保留经典定义。虽然这一改进消除了编译器警告,但内存安全问题仍需进一步解决,未来可能通过添加长度字段实现自动边界检查。尽管Rust能减少新代码的安全隐患,但现存大量C代码仍需持续优化,内核安全改进任重道远。 阅读详情

关注了就能看到更多这么棒的文章哦~

Safer flexible arrays for the kernel

By Jake Edge
September 22, 2022
LSS EU
DeepL assisted translation
https://lwn.net/Articles/908817/

在 2022 年欧洲 Linux 安全峰会(LSS EU)上,Gustavo A. R. Silva 报告了他在内核 "flexible" array 方面的工作。虽然这些数组提供了一些所谓的“灵活性”,但它们也导致了不少 bug,往往会导致安全漏洞。他一直在研究如何让 flexible array 能更安全地在内核中使用。

Silva 的北京是在嵌入式系统方面,他从事实时操作系统(RTOS)和嵌入式 Linux 的工作。在过去的六年里,他的工作主要就是提交代码到 upstream。他与内核自我保护项目(KSPP, Kernel Self Protection Project)和谷歌开源安全团队的 Linux kernel 部门配合工作。

Trailing and flexible arrays

他首先介绍了 C 语言的 array 数组功能,从最简单的 int happy_array[10]; 开始,这声明了一个包含了 10 个 int 类型元素的数组,后面可以用 0 到 9 的 index 作为索引来访问。 happy_array "只要我们确保使用它时不越界,就会保持 happy"。但是 C 语言并没有强制确保不越界,所以开发者必须要自己确保;否则的话,他们就会落入他经常称为 "The Land of Possibilities" 的境地,也就是所谓的 undefined behavior(未定义行为)。

所谓的 "trailing" array,是指在一个 struct 声明中,处于最后一个 field 的这个 array 数组。它们可以是定义了具体的 size,就像 happy_array 那样,或者它们可以代表一个 "blob" 数据,在运行才被添加给这个 struct。比如说:

struct blob_holder {
    ...
    size_t count;
    unsigned char blob[];
}

通常情况下,structure 中的一些元素会记录这个 blob 的长度,比如这个例子里的 count。这样,在 C 语言中,经常会用 training array 来构造一个可变长度的对象(VLO, variable-length object)。因此,flexible array 其实就是一个作为 VLO 来使用的 training array;其 size 是在运行时确定的。所谓的 flexible structure,就是一个使用 flexible array 作为其最后一个元素的结构。Silva 说,有三种方法来声明 flexible array。其中两种被判定为 "假的, fake" flexible array,因为它们没有使用上述 C99 方式的空括号方式的声明(这是所谓的 "真" flexible array)。许多 fake 方式的使用在是在 C99 之前出现的,它们会要么声明一个 0 元素或 1 个元素的数组作为 flexible array 使用。这种用法会导致 bug。

声明一个单个元素的 flexible array 是一个 "buggy hack" 的方式。这里的问题是,这个元素也会被计入数组(和外包的 struct)的 size 里,这很容易导致错位 1 个(off-by-one)这种 bug。struct 中的 count 字段比应该分配的空间要大 1,所以很多地方需要使用 count-1。在分析使用这种 flexible structure 的代码时,必须始终注意 sizeof() 在数组和结构中的使用。通常经过分析就会发现代码中存在 off-by-one 或者其他 bug。

使用 0 元素的 fake flexible array 是 GNU 里的一个扩展,是为了解决当时语言中缺乏真正的 flexible array 的问题而加入的。它带来的问题比单个元素数组的要少一些,因为它们不会对包围结构的 size 产生影响。真正的 flexible array 必须在结构的最后才出现,这是由编译器强制确保的。不过,fake flexible array 则可能出现在结构中的任何地方,这当然也就会导致其他类型的问题。

Problems

sizeof() 操作符对这三种变种得到的 size 返回值是不同的。对于单个元素的数组这种情况,数组的 size 是数组类型中一个元素的 size;对于零元素数组,size 就是零。但是对于真正的 flexible array,sizeof() 会在编译时报错,因为 size 是未知的。

442e87a98753674b6491fd25b48787c2.png

[Gustavo A. R. Silva]。

作为 KSPP 工作的一部分,他所做的第一个 flexible-array-transformation fix 就展示了 fake flexible array 可能产生的问题。在结构的末尾声明了一个长度为 0 的数组,但今后有人在 flexible array 之后添加了一个用于 read-copy-update(RCU)的字段。编译器不会给出警告,所以这个 bug 就从 2011 年一直持续存在,直到他在 2019 年进行了 fix。他使用了一个真正的 flexible array 的声明(并将其移到 struct 最后);现在,如果有人在最后添加一个新的结构成员的话,编译器会报告错误。

人们一直在致力于用 -Warray-bounds 选项在编译器中来启用 array-bound (数组边界)检查,但 fake flexible array 造成了太多的误报(同时也会有一些真正的 bug 报出来)。一个 flexible array 在被访问时使用的 index 已经超出 array 的末尾,这种情况经常出现。在开启边界检查之前,这些都需要先被 fix。

他在 2021 年中期的 fix 就是一个简单的例子。其中有一个单个元素的数组在被访问时使用了[1] 作为 index,这显然越界了;只要把它改成一个真正的 flexible array,就可以去除 warning。其他的例子就比较复杂了,但归根结底都是换成了真正的 flexible array;此外移除这些单个元素的数组也就可以去除一些分配 size-1 的计算的代码。

flexible array 可以是 memcpy() 操作的源地址或者目标地址,因此在加固 memcpy() 的工作中也许要考虑这部分。在内核启用 CONFIG_FORTIFY_SOURCE 时,memcpy() 会使用 __builtin_object_size() 函数(type 参数为 1)来计算运行时 source 和 destination 的大小。

然而,对于真正的 flexible array 来说,这个函数返回-1,因为它不能确定 size。fake flexible array 确实会有一个 size,但事实上 __builtin_object_size() 对这些数组也会返回 -1。正如他在幻灯片中所展示的那样,这个行为如果跟 sizeof() 的行为结合起来,会使事情变得有点混乱。

__builtin_object_size(flex_struct->one_element_array, 1) == -1
__builtin_object_size(flex_struct->zero_length_array, 1) == -1
__builtin_object_size(flex_struct->flex_array_member, 1) == -1

sizeof(flex_struct->one_element_array) == size-of-element-type
sizeof(flex_struct->zero_length_array) == 0
sizeof(flex_struct->flex_array_member) == ? /* Error */

因为 __builtin_object_size() 不能确定 trailing array 的 size,所以今天在 memcpy() 中没有对这些数组进行边界检查(使用了 CONFIG_FORTIFY_SOURCE)。更让人奇怪的是,__builtin_object_size() 对任何 trailing array 都会返回-1,哪怕它指定了大于 1 的 size。因为 __builtin_object_size() 没有返回 trailing array 的 size (哪怕是那些它表面上可以确定 size 的数组),如今在 memcpy() 中就没有对这些数组进行边界检查 (在使用 CONFIG_FORTIFY_SOURCE 的情况下) 。__builtin_object_size() 采用这种行为的原因,就是要支持历史遗留代码,那些以固定的长度来声明 trailing array 但又将它们视为 flexible array 的代码。他展示了一个 BSD 版本的 struct sockaddr,其中有一个 trailing array 是 char sa_data[14],在运行时实际上可以容纳 255 字节。

为了让 memcpy() 能够对 trailing array 进行合理性检查,就需要消除 flexible array 声明中的这种模糊性。所有要作为 flexible array 使用的数组都应该用 [] 来声明为真正的 flexible array;然后,可以指示编译器将固定长度的 trailing array 当作普通的固定长度数组。他提到了一个 GCC 的 bug 报告,其中包含了解决这个问题的编译器改动。

Compiler flag

在即将发布的 GCC 13 和 Clang 16 版本中,有一个新的编译器标志,允许开发者设置 flexible array 的严格程度。-fstrict-flex-arrays[=n] (通常缩写为-fsfa)。n的默认设置是 0,这意味着跟当前的行为比起来没有什么变化,所有 trailing array 都被 __builtin_object_size()视为 flexible array。n 的值从 1 到 3,通过改变__builtin_object_size() 的行为来逐步提高这里检查的严格程度:

  • -fsfa=1: 只有用 [1], [0], 和 [] 声明的尾部数组被视为 flexible array;__builtin_object_size() 对其它数组返回适当的长度。

  • -fsfa=2: 只有用[0]和[]声明的尾部数组被视为 flexible array;__builtin_object_size()对其他数组返回适当的长度。

  • -fsfa=3: 只有用[]声明的尾部数组被视为 flexible array;__builtin_object_size()对任何有具体大小的数组返回适当的长度。

不幸的是,Clang 的开发者没有(暂时还没有?)被说服加入 -fsfa=3;Silva 说,关于这个问题正在进行讨论。将内核中的 flexible array 转变为真正的 flexible array 的工作已经进行了好几年,还有更多的工作要做。对零元素的数组的使用所进行的改造是相当直接明确的,但是单个元素数组的改造更加困难,因为它们需要更仔细地人为检查代码,从而找到 off-by-one 的问题。在这样做之后,并且编译器也准备好了的话,memcpy() 就能够对所有不是 flexible array 的 trailing array 进行边界检查,所以所有固定大小的数组最终都可以在内核中进行边界检查了。

那么我们有方案可以让所有这种数组都得到边界检查了,那么对实际的 flexible array 的检查呢?Silva 说,这是一个更具挑战性的问题,但是有一些方案提出来了。这里的关键是要确定持有数组长度的结构成员。这可以通过对数组加上一个 attribute 来完成,如下所示:

struct bounded_flex_struct {
...
size_t elements;
struct foo flex_array[]
  __attribute__((__element_count__(elements)));
  };

然而,在从单个元素的 flexible array 转换到真正的 flexible array 时,有一些用户空间的 API 问题需要解决。最开始是尝试同时支持现有的 API 以及新的机制,在面向 user space 的结构中来重复这个字段,并将它们放在一个 union 中,这样用户空间可以采用一种方式来使用数组,kernel 可以采用另一种方式:

struct farray {
    union {
        struct {
            ... /* renamed versions of the members */
            size_t renamed_count;
            int orig_array_name[1];
        };
        struct {
            ... /* members with existing names */
            size_t count;
            int orig_array_name_flex[];
        };
    };
};

这样做会在大量代码中造麻烦,所以添加了__DECLARE_FLEX_ARRAY() 这个 helper 宏,会被放入一个只包含数组的 union 中:

struct farray {
    ...
    size_t count;
    union {
        int orig_array_name[1];
        __DECLARE_FLEX_ARRAY(int, orig_array_name_flex);
    };
};

在这两种情况下,用户空间都会继续使用 orig_array_name,而内核将使用 orig_array_name_flex。有一点需要注意的是,structure 的 size 并没有改变;单个元素的数组仍然会对 structure 的 size 有贡献。

Status, conclusions, and questions

目前,内核中的大多数零长度的数组已经被改造完了,其中包括处理用户空间的 API 问题。但是没有什么方法可以避免今后加入的代码中又加进来了,所以他提醒内核开发者不要引入新的使用点。对单个元素的数组的改造仍然是一项正在进行的工作;这项工作更具挑战性,需要确保被改变的代码的相应维护者能感到放心,能确保这些改动并没有破坏任何功能。为此,他正在使用各种 diff 类型的工具,试图验证改造过程中是否有明显的行为改变。

他重申,重点是把所有内核中使用的 flexible array 都变成真正的 flexible array,然后确保不增加零长度或单个元素的 flexible array 的使用。内核的安全性可以通过 -fstrict-flex-arrays=3 得到显著改善,这就意味着很需要说服 Clang 开发者来支持这个设置。这项工作已经发现了内核中的一些漏洞,而且随着工作的继续进行,肯定会发现更多的漏洞。这还需要一些时间,但我们有一个清晰的愿景,那就是希望达到让所有的 trailing array, 不管是固定大小还是 flexible 的,在 memcpy()中都要进行边界检查。

Silva 在演讲结束时接受了一些评论和提问。LSS EU 组织者 Elena Reshetova 指出,当从 atomic_t 转换到 recount_t 时,那些开发者也面临着类似的问题,也就是阻止开发者在新代码中使用他们正在进行转换的类型。他们最后在 0-day test robot 中整合了一个 test,捕捉这种新增代码,并发送电子邮件。这种方式很有效,她鼓励 Silva 也尝试类似的做法。

编者提问, Clang 的开发者有什么理由反对新编译器标志中的最严格设置。Silva 说,他们的立场是 "不要使用零长度数组",但他把这个问题留给了 Kees Cook 来回答,Cook 说他可以介绍一下 "这方面的细节问题"。Cook 说,Clang 开发者们指出,根据标准,零长度的数组不是合法的 C 语言,所以如果移除这个对零长度数组支持的 GNU 扩展,那么零长度数组就不再存在了,所以 =2 级别就足够了。添加另一个选项来支持不是 flexible array 的零长度数组,在 Clang 社区看来似乎毫无意义。

"不幸的是,这不是我们世界的现实情况。" 在 GNU 扩展被添加时,一些代码将零长度数组作为 flexible array 使用,而其他代码则将其作为没有元素的真实数组,从而方便比如在结构内放置 marker 标记之类的操作。此外,在内核中有些数组通常有一些固定的 size,但是在某些配置中,这个 size 可能会降为零。

Cook 说,可能有办法解决 Clang 缺乏这种选项的问题,但是 Clang 的开发者更容易接受零长度数组已经存在的这个现实,以及内核(至少)希望能够不再把它们当作 flexible array。Silva 说,有一个 flag 可以对零长度数组的使用代码给出 warning,但是它在内核代码上产生了 6 万个 warning,所以这也不是一个明智的做法。很明显,希望 Clang 社区在这一点上能改变观点。

[我想感谢 LWN 的订阅者支持我去都柏林参加欧洲 Linux 安全峰会。]

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

format,png

第九章 GPU 虚拟地址空间管理:9.2 GPU 内存管理与 CPU MM 的对照 本章对比 CPU 内存管理与 DRM GPU 虚拟地址空间(drm_gpuvm)在地址空间、后备存储、回收及失效恢复四方面的异同。二者均需在有限物理内存下管理多上下文虚拟地址,但 GPU 因硬件约束(如不可缺页、异步迁移)而演化出不同机制:用户态指定地址、提交前集中放置、基于 fence 的异步驱逐与恢复。核心差异源于 GPU 不支持缺页恢复,驱动需通过“提交式”、“长时运行”或“缺页”三种模式实现映射管理,体现 GPU 内存模型对硬件特性的依赖。 阅读详情

相关推荐

使用LogisticRegression和LightGBM模型对信贷违约进行预测----基于kaggle比赛数据

3.分离数值型变量与类别型变量,发现有些数值型变量因为输入不规范,比如数值中含有字符(28_,_10000_等)被划分为类别型变量 ,比如 'Age','Annual_Income','Num_of_Loan', 'Num_of_Delayed_Payment', 'Changed_Credit_Limit','Credit_Mix','Monthly_Balance', 'Outstanding_Debt' ,'Amount_invested_monthly'等。三、分箱,woe编码,计算IV值。

I_am_a_big_tiger的博客 1682

__builtin_object_size

转自: https://www.ibm.com/support/knowledgecenter/en/SSXVZZ_16.1.0/com.ibm.xlcpp161.lelinux.doc/compiler_ref/bif_gcc_objectsize__builtin_object_size.html Purpose When used with-O2or higher optim...

zhangjiajieshiyongdi的专栏 1352

告别倍福开发板:手把手教你用SSC工具为STM32生成EtherCAT从站代码

本文详细介绍了如何使用SSC工具为STM32生成EtherCAT从站代码,帮助开发者在不依赖倍福开发板的情况下实现高效的工业以太网通信。通过SSC工具的配置、XML文件设计、代码移植与硬件适配等步骤,开发者可以轻松构建自定义的EtherCAT通信系统,提升工业自动化项目的灵活性和效率。

weixin_33925615的博客 410

linux kernel变长数组使用示例

在一个结构体中,定义了长度为0的数组,而我们有希望这个变成数组和结构体是物理连续的,如图所示: 可以参考linux kernel的代码,如下所示: struct skcipher_sg_list { struct list_head list; int cur; struct scatterlist sg[0]; }; #define MAX_SGL_ENTS ((4096 - sizeof(struct skcipher_sg_list)) / \ sizeof(struct sc

baron-周贺贺-代码改变世界ctw 2686

从零开始编写一个上位机(串口助手)QT Creator + C++

提示:本博客作为学习笔记,有错误的地方希望指正,此文可能会比较长,作为学习笔记的积累,希望对来着有帮助。   绪论:笔者这里使用的是QTCreator和C++来实现一个简单的串口上位机的开发的简单过程,使用到C++,主要是为了后面使用Python开发上位机打下基础。这里主要分为初识C++的一些基本知识,其次是QT Creator的使用。特别声明感谢【北京迅为】嵌入式学习之QT学习篇的学习视频,这里的学习笔记就是根据视频中的内容实战记录下来的。 文章目录一、C++知识1、初识C++2、C++输入输出控制2.1

believe666的博客 4万+

Cadence元件库介绍

Cadence安装完之后,在安装目录下,会有默认自带的一些常用元件库。例如,我的Candece安装目录为: D:\Cadence\Cadence_SPB_17.2-2016 元件库所在目录为: D:\Cadence\Cadence_SPB_17.2-2016\tools\capture\library 各个元件库对应的内容如下: AMPLIFIER.OLB 共 182 个零件,存放模拟放大器 IC,如 CA3280,TL027C,EL4093 等。 ARITHMETIC.OLB 共 182 个零件,存放

年少时的棉花糖 1万+

Flex 数组 Array 用法

示例 如何使用示例 下面的示例演示 Array() 函数在参数不是原始值时的行为。 转换为数组的一种常见用法是转换以数组格式存储值的 Object 实例。 如果调用 Array() 时使用了 Object 类型或其它任何非原始数据类型的参数,则对对象的引用将存储在新数组的元素中。 也就是说,如果传递的唯一参数是一个对象,则对该对象的引用将成为新数组的第一个元素。 var obj:Obje

passport_daizi的博客 8404

sid图像数据_遥感影像数据

影像数据基本概念影像数据是由卫星或飞机上的成像系统获得的影像,多为遥感影像数据。影像数据的每个像元都有一个值,表示传感器探测到像素对应地面面积上目标物的电磁辐射强度,也叫亮度值、灰度值。SuperMap支持的影像数据格式有:*.img、*.tif、*.tiff、*.bmp、*.jpg、*.png、*.gif、*.raw、*.sid等。计算机以二进制记录数据,所以其量化的等级以二进制来划分,即2n。...

weixin_39534395的博客 1626

变长结构体

看到老师写的一个结构体很好奇,结构体的最后是一个长度为0的数组,当时感觉老师是不是写错了,这样写意义何在呢?都没有分配空间,貌似没有存在的意义。 后来网上查了一下,其实这是在很多高级的东东里面都用到的东西,linux kernel, MFC, openoffice, 估计更多的地方都用到了。 先说说我的理解: struct example{     __u16 tag_type;

深入思考 1330

1、使用Spark SQL查询Databricks:全面指南

本博客全面介绍了如何使用Spark SQL在Databricks平台上进行高效的数据查询与分析。内容涵盖SQL基础操作、数据过滤、复杂查询技巧、简单与高级计算、数据聚合、日期处理等核心主题,适合数据分析师、开发人员及SQL学习者。通过逐步讲解和实用示例,帮助读者掌握从入门到高级的SQL技能,并提供学习路径建议和免费代码资源,助力实际数据分析工作。

redis7keeper的博客 90

基于FPGA的UDP 通信(六)

本文基于FPGA和MATLAB对千兆以太网通信模块UDP数据发送(FPGA发送)进行联合调试。

记录所学,分享知识,结识挚友 4729

【维生素C语言】第十五章 - 柔性数组(可变长数组)

本篇将对C99标准中引入的新特性——柔性数组,进行讲解。并探讨柔性数组的优势,简单的介绍内存池的相关概念,来体会柔性数组的优点。

有道无术, 术尚可求。有术无道, 止于术。 2万+

57、各向异性材料力学问题的分析与求解

本文系统分析了各向异性材料在扭转和平面变形问题中的力学行为,介绍了基于应力和位移的求解方法,包括应力函数推导、位移场假设、艾里应力函数法等。通过具体示例,如椭圆截面杆的扭转和各向异性板的均匀拉伸,展示了求解过程,并讨论了各向异性材料在工程应用中的意义及未来研究方向。

7h6j5k4l3的博客 204

LWN: 对kernel memcpy() 进行更严格的越界检查!

关注了就能看到更多这么棒的文章哦~Strict memcpy() bounds checking for the kernelBy Jonathan CorbetJuly 30, 2021...

Linux News搬运工 681

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

LWN:让kernel使用更大的block size!

关注了就能看到更多这么棒的文章哦~Moving the kernel to large block sizesBy Jake EdgeSeptember 27, 2023OSSEUChatGPT translationhttps://lwn.net/Articles/945646/使用更大的块大小(block size)进行I/O内核是存储和块层领域经常讨论的话题。这个话题在2023年5月的Lin...

Linux News搬运工 957

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LWN:Rust 另一些对 kernel 有用的特性!

关注了就能看到更多这么棒的文章哦~More Rust concepts for the kernelBy Jonathan CorbetSeptember 20, 2021Kangrejo...

Linux News搬运工 476

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LWN:有助于内核加固的GCC功能!

关注了就能看到更多这么棒的文章哦~GCC features to help harden the kernelBy Jonathan CorbetOctober 5, 2023CauldronChatGPT translationhttps://lwn.net/Articles/946041/加固Linux内核是一项无休止的任务,需要在多个方面努力推动。有时,并不需要在内核本身里进行修改,而是通过...

Linux News搬运工 782

LWN:引人眼球的Popcorn Linux能合入kernel吗?

关注了就能看到更多这么棒的文章哦~Popcorn Linux pops up on linux-kernelByJonathan CorbetMay 5, 2020原文来自:https...

Linux News搬运工 1183

LWN: 终结 /dev/kmem!

关注了就能看到更多这么棒的文章哦~Killing off /dev/kmemBy Jonathan CorbetApril 5, 2021DeepL assisted translatio...

Linux News搬运工 435

LWN:内核中Rust支持的下一步动作!

关注了就能看到更多这么棒的文章哦~Next steps for Rust in the kernelBy Jonathan CorbetSeptember 19, 2022Maintainers SummitDeepL assisted translationhttps://lwn.net/Articles/908347/Rust for Linux 这个项目是希望今后可以使用 Rust 编程语言...

Linux News搬运工 352

LWN:epoll也要用ring buffer来跟用户程序交互了

A ring buffer for epollByJonathan CorbetMay 30, 2019epoll这一组system call系统调用设计目的就是希望能...

Linux News搬运工 479

LWN:怕不怕编译器优化让你的代码彻底乱套?

Who's afraid of a big bad optimizing compiler? July 15, 2019 (Many contributors) 本文贡献者包括Jade Alglave, Will Deacon, Boqun Feng, David Howells, Daniel Lustig, Luc Maranget, Paul E. McKenney, Andrea P...

Linux News搬运工 1522

全局变量的初始化是在 期间完成的_LWN 761215: 关于内核初始化早期阶段内存分配管理机制的发展回顾...

LWN中文翻译项目简介:LWN.net是一份著名的计算机在线刊物,专注于报道有关自由软件,特别是有关 Linux 和其他 Unix-like 相关操作系统的新闻和技术动态。泰晓科技LWN 中文翻译项目针对 LWN.net 的内核相关文章进行中文翻译,欢迎大家踊跃参与,翻译或者校对皆可,详情请阅读该项目主页位置:http://tinylab.org/lwn/。版权声明:本文最先发表...

weixin_39793098的博客 158

linux 11.16

<br />头文件include/linux/kernel.h 包含了一些宏,你应该使用它们,而不要自己写一些它们的<br /> 变种。比如,如果你需要计算一个数组的长度,使用这个宏<br /><br />   #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))<br /><br /> 类似的,如果你要计算某结构体成员的大小,使用<br /><br />   #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f

270

Linux中rps/rfs的原理及实现

rps的全称是Receive Package Steering,rfs的全称是Receive Flow Steering,rps和rfs是google的工程师提供的两个补丁,用以在软件层面实现报文在多个cpu之间的负载均衡以及提高报文处理的缓存命中率。rps和rfs出现的原因主要有以下两个:   1、 对于多队列网卡,网卡硬件接收队列与cpu核数在数量上不匹配导致报文在cpu之间分配不均。   2、 对于单队列网卡,rps和rfs可以在软件层面将报文平均分配到多个cpu上。   关于rps和rfs更为详细的

maimang1001的专栏 5164

linux内存管理笔记(十一)---CMA

在我们使用ARM等嵌入式Linux系统的时候,一个头疼的问题是GPU,Camera,HDMI等都需要预留大量连续内存,对于内核如果申请一块连续的内存空间该怎么处理呢? 首先向到的是利用内核提供的kmalloc申请,尽管kmalloc可以申请连续的内存空间,但是在长时间的测试中,会出现内存空间可能申请失败的情况,无法保证能成功分配。 使用memblock分配器中提供的方法,称为预留内存,但这么预留...

奇小葩 4963
上一篇: LWN:让BPF成为一个更安全的内核编程环境!
下一篇: LWN:6.0开发周期数据!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值