返回顶部
首页 > 资讯 > 操作系统 >Linux内核补丁举例分析
  • 932
分享到

Linux内核补丁举例分析

2023-06-15 18:06:52 932人浏览 薄情痞子
摘要

这篇文章主要介绍“linux内核补丁举例分析”,在日常操作中,相信很多人在Linux内核补丁举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux内核补丁举例分析”的疑惑有所帮助!接下来,请跟着小编

这篇文章主要介绍“linux内核补丁举例分析”,在日常操作中,相信很多人在Linux内核补丁举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux内核补丁举例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

如果在系统中读一个文件时会调用

generic_file_buffered_read

这个函数的功能是把磁盘中的数据读到page之后,或者直接获取cache中的page,然后调用copy_page_to_iter把page拷贝到用户层的buffer中。

一天寂静的下午,得空,打开电脑,准备仔细研究一下这个函数,发现这个函数的注释上面就写明了:

* This is really ugly. But the Goto's actually try to clarify some * of the logic when it comes to error handling etc.

仔细看了一下代码,果然ugly的不像话,到处都是跳转和判断,令人眩晕,而且整个函数达到300行左右(原谅我看了注释才斗胆这样讲:-)  ),发现要是把这个函数看下去,今天一整天的心情都不会好了(当时看的是Linux5.10的代码)

ssize_t generic_file_buffered_read(struct kiocb *iocb,                 struct iov_iter *iter, ssize_t written) {  find_page:                 if (fatal_signal_pending(current)) {                         error = -EINTR;                         goto out;                 }                         error = wait_on_page_locked_killable(page);                         if (unlikely(error))                                 goto readpage_error;                         if (PageUptodate(page))                                 goto page_ok;                          if (inode->i_blkbits == PAGE_SHIFT ||                                         !mapping->a_ops->is_partially_uptodate)                                 goto page_not_up_to_date;                                                  if (unlikely(iov_iter_is_pipe(iter)))                                 goto page_not_up_to_date;                         if (!trylock_page(page))                                 goto page_not_up_to_date;                                                  if (!page->mapping)                                 goto page_not_up_to_date_locked;                         if (!mapping->a_ops->is_partially_uptodate(page,                                                         offset, iter->count))                                 goto page_not_up_to_date_locked;                         unlock_page(page);                 }

于是就想内核社区这么多牛人,他们整天盯着这些代码,肯定很多人早已经注意到了,于是想去看看有没有人提交patch重构这个函数:

./scripts/get_maintainer.pl   mm/filemap.c linux-kernel@vger.kernel.org (open list)

然后我就在下面网址中搜索generic_file_buffered_read,果然在10月25号(我看代码那天在11月1号前后),就有人发了相关patch:

https://lore.kernel.org/lkml/

然后迫不及待查看patch,并把整个patch 下载下来:

这里推荐一个工具,使用b4工具

Https://git.kernel.org/pub/scm/utils/b4/b4.git

可以直接从

https://lore.kernel.org

获取原始格式的patch,便于自己git am之后测试

# b4 am https://lore.kernel.org/lkml/20201025212949.602194-1-kent.overstreet@gmail.com v2_20201025_kent_overstreet_generic_file_buffered_read_improvements.cover v2_20201025_kent_overstreet_generic_file_buffered_read_improvements.mbx

然后直接 git am ,非常方便,这样就打上了lore.kernel.org上提交的patch.

git am v2_20201025_kent_overstreet_generic_file_buffered_read_improvements.mbx 提示:在git am之前,可以提前git apply --check 一下
# gitlogdate -3 fc5608fc9917    2020-10-25      Kent Overstreet fs: generic_file_buffered_read() now uses find_get_pages_contig 3bcadc3306be    2020-10-25      Kent Overstreet fs: Break generic_file_buffered_read up into multiple functions 3650b228f83a    2020-10-25      Linus Torvalds  Linux 5.10-rc1  alias gitlogdate='git log --pretty=fORMat:"%h%x09%ad%x09%an%x09%s" --date=short'

打了这个patch之后,generic_file_buffered_read变成了这个样子:

ssize_t generic_file_buffered_read(struct kiocb *iocb,                 struct iov_iter *iter, ssize_t written) { .. pg_nr = generic_file_buffered_read_get_pages(iocb, iter,                                  pages, nr_pages);                                   ... for (i = 0; i < pg_nr; i++) {    copied = copy_page_to_iter(pages[i], offset, bytes, iter);    }

而且

generic_file_buffered_read_get_pages

也非常之清晰:

static int generic_file_buffered_read_get_pages(struct kiocb *iocb,                                                 struct iov_iter *iter,                                                 struct page **pages,                                                 unsigned int nr)         nr_got = find_get_pages_contig(mapping, index, nr, pages);         if (nr_got)                 goto got_pages;          if (iocb->ki_flags & IOCB_NOIO)                 return -EAGAIN;          page_cache_sync_readahead(mapping, ra, filp, index, last_index - index);          nr_got = find_get_pages_contig(mapping, index, nr, pages);         if (nr_got)                 goto got_pages; ... }

到此,关于“Linux内核补丁举例分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Linux内核补丁举例分析

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

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

猜你喜欢
  • Linux内核补丁举例分析
    这篇文章主要介绍“Linux内核补丁举例分析”,在日常操作中,相信很多人在Linux内核补丁举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux内核补丁举例分析”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-15
  • linux weblogic 10.3 打补丁的示例分析
    这期内容当中小编将会给大家带来有关linux weblogic 10.3 打补丁的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。解压补丁包zip文件,得到两个文件 一个.jar 一个.xml 将这...
    99+
    2023-06-05
  • CentOS7中Linux Kernel补丁的示例分析
    这篇文章主要为大家展示了“CentOS7中Linux Kernel补丁的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“CentOS7中Linux Kernel补丁的示例分析”这篇文章吧。...
    99+
    2023-06-10
  • KB2565063补丁的示例分析
    这篇文章将为大家详细讲解有关KB2565063补丁的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Windows 10 系统中勾选了设置中“更新和安全”中的“更新Windows 时提供其他Micr...
    99+
    2023-06-13
  • CentOS发布内核安全补丁:修复Meltdown和Spectre漏洞的示例分析
    小编给大家分享一下CentOS发布内核安全补丁:修复Meltdown和Spectre漏洞的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! Cen...
    99+
    2023-06-10
  • Linux内核编译的示例分析
    小编给大家分享一下Linux内核编译的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!   下载源代码Linux内核总是不断发展的,***的内核K...
    99+
    2023-06-16
  • Linux内核中断的示例分析
    这篇文章主要介绍了Linux内核中断的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时...
    99+
    2023-06-27
  • oracle 11.2.0.4单实例打补丁的示例分析
    这篇文章主要介绍oracle 11.2.0.4单实例打补丁的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 0、如何获取oracle 11g安装...
    99+
    2024-04-02
  • openSUSE如何给内核源代码打补丁
    小编给大家分享一下openSUSE如何给内核源代码打补丁,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!内核源码升级可能使某个补丁失效,所以并不是一个补丁可以&qu...
    99+
    2023-06-16
  • Linux中内核链表的示例分析
    这篇文章主要介绍Linux中内核链表的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Linux中的内核链表实例详解链表中一般都要进行初始化、插入、删除、显示、释放链表,寻找节点这几个操作,下面我对这几个操作进...
    99+
    2023-06-09
  • Linux内核开发经历的示例分析
    这篇文章主要为大家展示了“Linux内核开发经历的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux内核开发经历的示例分析”这篇文章吧。Linux内核社区在2016年庆祝了成立二十...
    99+
    2023-06-10
  • Linux内核体系简介的实例分析
    Linux内核体系简介的实例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Linux 内核简介现在让我们从一个比较高的高度来审视一下 GNU/Linux 操作系统的体系结构...
    99+
    2023-06-17
  • Linux内核双向链表的示例分析
    小编给大家分享一下Linux内核双向链表的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Linux 内核中自己实现了双向链表,可以在 include/li...
    99+
    2023-06-27
  • Linux 内核中reuseport 的演进示例分析
    今天给大家介绍一下Linux 内核中reuseport 的演进示例分析。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。SO_REUSEPORT选项在Linux ...
    99+
    2023-06-28
  • C#内存管理举例分析
    本篇内容主要讲解“C#内存管理举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#内存管理举例分析”吧!C#内存管理C#内存管理提供了与java一样的自动内存管理功能,让程序员从繁重的内存...
    99+
    2023-06-17
  • Linux系统中内核调试的示例分析
    这篇文章主要介绍了Linux系统中内核调试的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。调试是软件开发过程中一个必不可少的环节,在 Linux 内核开发的过程中也不...
    99+
    2023-06-12
  • Linux内核编译与开发的示例分析
    这篇文章将为大家详细讲解有关Linux内核编译与开发的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.Linux内核简介linux kernel map:linux 系统体系结构:linux k...
    99+
    2023-06-16
  • Python的内存管理举例分析
    这篇文章主要介绍“Python的内存管理举例分析”,在日常操作中,相信很多人在Python的内存管理举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python的内存管理举例分析”的疑惑有所帮助!接下来...
    99+
    2023-06-17
  • oracle 11.2.0.4补丁问题怎样分析
    这篇文章将为大家详细讲解有关oracle 11.2.0.4补丁问题怎样分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 春节...
    99+
    2024-04-02
  • Linux文件系统与持久性内存举例分析
    本篇内容主要讲解“Linux文件系统与持久性内存举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux文件系统与持久性内存举例分析”吧!在 Linux 系统中一切皆文件,除了通常所说的...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作