0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

华为开发者贡献Linux内核补丁,将核心内核函数速度提升715倍

OSC开源社区 来源:OSC开源社区 作者:OSC开源社区 2022-12-16 11:36 次阅读

Linux 6.2 近日合并了一个重要补丁,该补丁能够将一个核心内核函数速度提升 715 倍。

3701515a-7ce2-11ed-8abf-dac502259ad0.png

从合并的注释可知,贡献此补丁的维护者 Zhen Lei 来自华为,他将 kallsyms_lookup_name () 的平均查找性能提高了 715 倍,从而使内核里面旧实现的时间复杂度从 O (n) 升级到 O (log (n)),大幅减少查找时间,同时还保留了 /proc/kallsyms 上旧的实现支持。 kallsyms_lookup_name () 函数用于根据名称查找符号的地址,并可用于查找内核符号表中的任何符号。

371909bc-7ce2-11ed-8abf-dac502259ad0.png

Zhen Lei 曾在较早的补丁中描述了kallsyms_lookup_name () 的优化思路:

目前,要搜索一个符号,我们需要将 'kallsyms_names' 中的符号一个一个展开,然后使用展开后的字符串进行比较。这种算法的时间复杂度是 O (n)。

如果我们像地址一样按升序对名称进行排序,则可以使用二分查找。这种算法的时间复杂度是 O (log (n))。

为了不改变 “/proc/kallsyms” 的实现,表 kallsyms_names [] 仍然按照升序与地址一一对应存储。

添加数组 kallsyms_seqs_of_names [],以排序后的 names 序号为索引,对应的内容为排序后的地址序号。例如:假设 NameX 在数组 kallsyms_seqs_of_names [] 中的索引为 'i',kallsyms_seqs_of_names [i] 的内容为 'k',则 NameX 对应的地址为 kallsyms_addresses [k]。kallsyms_names [] 中的偏移量是 get_symbol_offset (k)。

请注意,使用此方法内存使用量将增加 (4 * kallsyms_num_syms) 字节,接下来的两个补丁将减少 (1 * kallsyms_num_syms) 字节并正确处理 CONFIG_LTO_CLANG=y 的情况。

性能测试结果:(x86)

Before:

min=234, max=10364402, avg=5206926

min=267, max=11168517, avg=5207587

After:

min=1016, max=90894, avg=7272

min=1014, max=93470, avg=7293

kallsyms_lookup_name () 的平均查找性能提高了 715 倍。

因此,该补丁带来的唯一缺点是将内存占用量增加 3 * kallsyms_num_syms。 Linux 6.2 的模块代码还包含一个小的启动优化,将启动时间缩短了大约 30 毫秒。 相关链接:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3ba2c3ff98ea8bfb219288dbacf2a23a902c751b

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10991

    浏览量

    206742
  • 函数
    +关注

    关注

    3

    文章

    3903

    浏览量

    61310

原文标题:华为开发者贡献Linux内核补丁,将核心内核函数速度提升715倍

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    微软发布Linux内核Rust模块优化补丁

    在此之前,Linux 内核中要想实现模块初始化,必须先创建一个实例,再将其移至特定内存空间。然而,经过新补丁调整后,各模块可直接在预设定好的内存地址上完成初始化工作。
    的头像 发表于 04-02 15:11 217次阅读

    请问如何给STM32MP157上Linux5.4.31打实时内核补丁

    我这边想给STM32MP157芯片A7上面的Linux打实时内核补丁,从而运行一些对实时性要求较高的应用程序。我看到我的Linux内核版本是
    发表于 03-11 06:09

    鸿蒙开发者预览版如何?

    在24年的华为鸿蒙发布会中表示。预览版已经向开发者开放申请,首批支持的机型有三款分别为华为 Mate 60、华为Mate 60 Pro、华为
    发表于 02-17 21:54

    C++在Linux内核开发中从争议到成熟

    Linux 内核邮件列表中一篇已有六年历史的老帖近日再次引发激烈讨论 —— 主题是建议将 Linux 内核开发语言从 C 转换为更现代的
    的头像 发表于 01-31 14:11 239次阅读
    C++在<b class='flag-5'>Linux</b><b class='flag-5'>内核</b><b class='flag-5'>开发</b>中从争议到成熟

    兆芯正引入Linux首选内核调度技术,优化性能

    近期,兆芯工程团队亦在致力于将首选内核调度技术引进Linux系统中。他们试图通过提议的Linux内核补丁,利用已有的ACPI功能来辨别每个
    的头像 发表于 12-29 14:30 214次阅读
    兆芯正引入<b class='flag-5'>Linux</b>首选<b class='flag-5'>内核</b>调度技术,优化性能

    获取Linux内核源码的方法

    (ELF1/ELF1S开发板及显示屏)Linux内核是操作系统中最核心的部分,它负责管理计算机硬件资源,并提供对应用程序和其他系统组件的访问接口,控制着计算机的内存、处理器、设备驱动程
    的头像 发表于 12-13 09:49 301次阅读
    获取<b class='flag-5'>Linux</b><b class='flag-5'>内核</b>源码的方法

    Linux内核自解压过程分析

    uboot完成系统引导以后,执行环境变量bootm中的命令;即,将Linux内核调入内存中并调用do_bootm函数启动内核,跳转至kernel的起始位置。
    的头像 发表于 12-08 14:00 407次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>自解压过程分析

    Linux内核如何使用结构体和函数指针?

    我将结合具体的Linux内核驱动框架代码来展示Linux内核如何使用结构体和函数指针。
    的头像 发表于 09-06 14:17 570次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>如何使用结构体和<b class='flag-5'>函数</b>指针?

    C语言函数指针在Arm Linux内核源码中的高级玩法

    函数指针在ARM Linux内核源码中有许多高级应用。在这里,我将列举一些常见的应用,附上相应的代码示例,并对代码进行解释。
    发表于 09-06 11:23 243次阅读
    C语言<b class='flag-5'>函数</b>指针在Arm <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>源码中的高级玩法

    万千设备,linux内核如何知道?

    linux内核设备的注册由device_register()函数完成,这个函数linux设备驱动模型的
    的头像 发表于 07-12 08:52 506次阅读
    万千设备,<b class='flag-5'>linux</b><b class='flag-5'>内核</b>如何知道?

    Linux内核的作用

    Linux操作系统是当今世界上最为广泛使用的开源操作系统之一,内核则是一个操作系统的核心和灵魂所在。对于一名Linux驱动开发者来说,了解
    发表于 07-06 11:46 1223次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>的作用

    Linux内核内存泄漏怎么办

    Linux内核开发中,Kmemleak是一种用于检测内核中内存泄漏的工具。
    发表于 07-04 11:04 598次阅读

    Linux内核学习笔记:printk调试

    很多内核开发者喜欢的调试工具是printk,在Linux内核中,使用printk()函数来打印信息,它与C库的printf()
    发表于 06-01 15:14 637次阅读

    Linux内核调试的方式以及工具汇总(下)

    内核总是那么捉摸不透, 内核也会犯错, 但是调试却不能像用户空间程序那样, 为此内核开发者为我们提供了一系列的工具和系统来支持内核的调试.
    的头像 发表于 05-12 14:59 961次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>调试的方式以及工具汇总(下)

    Linux内核调试的方式以及工具汇总(上)

    内核总是那么捉摸不透, 内核也会犯错, 但是调试却不能像用户空间程序那样, 为此内核开发者为我们提供了一系列的工具和系统来支持内核的调试.
    的头像 发表于 05-12 14:58 679次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>调试的方式以及工具汇总(上)