精华内容
下载资源
问答
  • linux内核开发
    千次阅读
    2021-02-20 18:13:43

    vscode在linux下搭建内核驱动开发环境

    一、前言

    Souce insight是一个阅读、开发linux内核驱动模块的好工具,但是Source insight是收费的软件,而且没有原生linux版本,要是想在纯linux环境下进行linux驱动开发,就只能wine+Source insight,而wine版的不好用容易卡死而且cpu占用还高,我就想到用开源跨平台的vscode进行linux内核开发,体验能否和source insight一样好呢?

    二、实践

    经过搜索和自己亲身实践,最后发现vscode+global插件,可以实现和source insight相媲美的体验

    三、准备工作

    • linux内核源代码文件夹
    • linux下安装好vscode

    四、安装global软件包和vscode global插件

    我用的是deepin-linux操作系统,在终端输入apt命令安装global

    sudo apt install global

    Shell

    Copy

    在vscode的插件商店里搜索安装global插件

     

    五、打开linux源码文件夹

    利用vscode的打开文件夹的功能,打开linux内核源码的文件夹

     

    提示无法在这个工作区中监视文件更改,按照网页的提示,修改最大文件监控数就可以了,不改对开发也没什么影响

     

    六、安装c/c++扩展

    随便打开一个c文件,右下角会提示你安装c/c++扩展,点安装就可以自动安装了

     

    安装完毕,又会提示你配置 IntelliSense 设置以帮助查找缺少的标头,点配置即可,这里我配置了一个交叉编译器的地址,这个其实也没什么用,不配置也可以

     

    关闭配置页面,这个页面不配置也不影响,这个时候下面会有问题输出,不用管

     

    七、生成global数据库

    在vscode下Ctrl+Shift+P进入命令行模式,输入gl,选择Global: Rebuild Gtags Database执行

     

    过几分钟生成完毕,就会在linux源码目录下生成GTAGS、GRTAGS、GPATH三个tag数据库文件

     

     

    接着,就可以用F12愉快的跳转定义啦,输入代码的时候也会有给力的代码提示

     

    备注:global的版本要注意

    又备注:目前在使用过程中,有自定义的结构体成员比如u32这种类型的无法识别无法提示的问题,不知大家有无方法解决,可以在下方评论我

    更多相关内容
  • linux 内核开发

    2018-05-11 16:53:56
    GNU make 中文手册 htm格式,提供linux 下make规则及语法学习,makefile编写调试等
  • linux内核开发

    2018-07-30 10:15:38
    这本书介绍如何定制自己的linux系统,这本书通俗易懂,深受linux爱好者喜欢!
  • 学习交流使用,当前在做嵌入式开发,希望能够和更多的人一起学习
  • Linux内核开发.pdf

    2021-09-27 13:02:31
    Linux内核开发.pdf
  • 《嵌入式系统Linux开发实战指南(ARM平台)》凝聚了作者12年的工作经验和学习心得与体会,内容覆盖了嵌入式系统Linux内核开发的各个方面。作者根据自己11年的一线工作经验,介绍了嵌入式系统的概念、组织架构、工作...
  • 嵌入式系统Linux内核开发实战指南(ARM平台).pdf和配合的(嵌入式系统Linux内核开发实战指南.iso)光盘镜像.受上传所限,分3卷.这是第三卷
  • 嵌入式系统Linux内核开发实战指南(ARM平台).pdf和配合的(嵌入式系统Linux内核开发实战指南.iso)光盘镜像.受上传所限,分3卷.这是第一卷
  • 嵌入式系统Linux内核开发实战指南(ARM平台).pdf和配合的(嵌入式系统Linux内核开发实战指南.iso)光盘镜像.受上传所限,分3卷.这是第二卷
  • 何为 Linux 内核开发? 首先,初步认识下 Linux kernel Linux 内核的框架如上图。 设备子系统负责和硬件打交道。 大部分工作集中在设备子系统部分。 内核开发是什么? 广义上讲,新增或修改上图中内核部分的所有...

    此文包含 Linux 系统的学习路径和书籍推荐。

    我觉得学习 Linux 系统,内核驱动时,最开始只需要 ‘Know what, not know how ’。 不用去探究细节,只需要知道整体的框架,知道有哪些需要我们重视的内容即可。

    何为 Linux 内核开发?

    首先,初步认识下 Linux kernel

    在这里插入图片描述

    • Linux 内核的框架如上图。
    • 设备子系统负责和硬件打交道。
    • 大部分工作集中在设备子系统部分。

    内核开发是什么?

    • 广义上讲,新增或修改上图中内核部分的所有子系统。
    • 非 Linux 源码贡献者,一般来说只修改设备子系统部分。

    接下来,简单聊聊初学者需要重点关注的三个部分:设备树,字符设备,平台设备驱动。

    设备树(DTS)

    设备树相当于一份软件中描述硬件结构的配置框图。假设下图为硬件框图:
    在这里插入图片描述
    那么其软件描述的代码片段如下:

    / { // root node
        model = "Qualcomm Technologies, Inc. SDM xxx";
        compatible = "qcom,sdmxxx";
        cpus {
            ... 
            cpu@0 {
                ... 
            };
            cpu@1 {
                ... 
            };
        };
        usb@<address> {
            ... 
        };
        serial@<address> {
            ... 
        };
        gpio@<address> {
            ... 
        };
        intc: interrupt-controller@<address> {
            ... 
        };
        external-bus {
            ...
            i2c@0,0 {
                ... 
                xxx@<address> { // I2C Dev
                .... 
                };
            };
            flash@1,0 {
                ... 
            };
        };
    };
    

    字符设备驱动

    • 字符设备驱动是理解设备驱动的基础。
    • 大多数设备都可以归于字符设备。
      在这里插入图片描述

    kernel 开发需要什么样的知识储备?

    我觉得这部分可以当着 Linux 系统的学习路径了。

    C 语言

    良好的 C 语言能力是必要条件, Linux 官方推荐了如下书籍。

    • The C Programming Language
    • Practical C Programming
    • C: A Reference Manual

    不过我觉得结合如下书籍一步步学习会更适合学习:

    《啊哈 C 语言》入门书籍,号称马桶上看的 C 语言,通俗易懂。
    《The C Programming Language》的中文版 《C 程序设计语言》,英文版也是很好一个选择的,一书两用,技术和英语都学习了。我觉得这一本是学习 C 语言的朋友们,必读的一本。

    在这里插入图片描述
    3. 《C 专家编程》,这本书主要讲语法特性,告诉我们 C 语言是怎么设计出来的,看了这本书,我们可以更深刻的理解每一行代码。

    在这里插入图片描述
    4. 《C 缺陷与陷阱》,《C 专家编程 》的延续,针对性更强,告诉我们 C 语言这个工具的缺陷与陷阱,让我们使用 c 语言时更加游刃有余。
    在这里插入图片描述
    5.《数据结构与算法分析 : C语言描述》,入门数据结构与算法,也是一本经典书籍,比《算法导论》那边砖头厚的书友好得多。
    在这里插入图片描述

    GNU

    这个也可以归为 C 语言里面,内核由 GNU C 和 GNU toolchain 实现,所以如下两方面的知识是需要的。

    • GNU C 的编码规则
    • GNU 工具链的使用

    Linux 基本命令

    学习 Linux 前,我们需要先熟悉 Linux 的“命令行 + 文件”的使用模式,要想学好一个东西,开始肯定需要用好这个东西。《鸟哥的 Linux 私房菜》应该是最适合初学者的一本书了。
    在这里插入图片描述
    如果想深入的话,推荐 《Linux 系统管理技术手册》,这本书很厚,算是 Linux 运维必备的手册。
    在这里插入图片描述

    应用程序设计

    通过系统调用或者 glibc,学会自己进行程序设计。如果每个系统调用都深入地学习、看书看文档、做实验,这样坚持一段时间,啃下这些东西,就很接近操作系统的原理了,就能看到另一番风景,甚至在应用编程时会有一览宗山小的感觉。参考书籍首推《UNIX 环境高级编程》,有代码,有介绍,有原理,非常实用。
    在这里插入图片描述

    设备驱动相关知识

    设备驱动方面的知识看下《Linux 设备驱动程序》应该就差不多了, 国内宋宝华写的《Linux 设备驱动开发详解》也还可以。
    在这里插入图片描述

    内核原理

    学习内核原理的话,推荐《Linux 内核设计与实现》,《Linux 内核完全注释》,《深入理解 Linux 内核 》三本书,当然也可以只买《深入理解 Linux 内核 》, 本书言简意赅地讲述了主要的内核机制。
    在这里插入图片描述

    阅读源码

    一开始阅读代码不要纠结一城一池的得失,不要每一行都一定要搞清楚它是干嘛的,而要聚焦于核心逻辑和使用场景。

    《Linux 内核源代码情景分析》是一本很适合参考的书,这本书最大的优点是结合场景进行分析,看得见、摸得着,非常直观,唯一的缺点还是内核版本比较老
    在这里插入图片描述
    Linux内核学习资料 教学视频 点击获取
    在这里插入图片描述
    在这里插入图片描述

    Linux内核学习免费课程:https://ke.qq.com/course/3485817?flowToken=1036460

    实践

    实现一个设备驱动程序,重新实现一些系统调用,或者重新实现一个文件系统或其他子系统等等。这部分难度会比较大,需要自己搞清楚所有细节,但是只要熬出来了,进步的愉悦是难以言说的。

    总结

    其实这部分内容已经不仅仅是针对内核开发了,而是针对 Linux 系统。C 语言, Linux 命令行,应用程序设计,设备驱动,内核原理,阅读源码, 实践, 只要我们踏实地把这样七个步骤走完,基本就已经领先绝大多数人了(甚至可以说 98% 以上,我也还在路上_),工作中 Linux 系统相关的绝大多数问题也难不倒你了,接下来就是在实战中不停地被捶打,最后成为一代宗师。

    当然如果只是对内核和驱动感兴趣,应用程序设计部分可以不用花太多时间。

    C/C++Linux服务器开发/后台架构师免费学习课程:https://ke.qq.com/course/417774?flowToken=1031343

    展开全文
  • 经典嵌入式黒皮巨著《嵌入式系统Linux内核开发实战指南(ARM平台)王洪辉著.pdf》。值得一读!
  • Linux 内核开发

    千次阅读 2018-11-08 23:27:35
    Linux 内核开发 简介 如你所知,我从去年开始写了一系列关于 x86_64 架构汇编语言程序设计的博文。除了大学期间写过一些 Hello World 这样无实用价值的程序之外,我从来没写过哪怕一行的底层代码。那些程序也...

    Linux 内核开发

    简介

    如你所知,我从去年开始写了一系列关于 x86_64 架构汇编语言程序设计的博文。除了大学期间写过一些 Hello World 这样无实用价值的程序之外,我从来没写过哪怕一行的底层代码。那些程序也是很久以前的事情了,就像我刚才说的,我几乎完全没有写过底层代码。直到不久前,我才开始对这些事情感兴趣,因为我意识到我虽然可以写出程序,但是我却不知道我的程序是怎样被组织运行的。

    在写了一些汇编代码之后,我开始大致了解了程序在编译之后会变成什么样子。尽管如此,还是有很多其他的东西我不能够理解。例如:当 syscall 指令在我的汇编程序内执行时究竟发生了什么,当 printf 函数开始工作时又发生了什么,还有,我的程序是如何通过网络与其他计算机进行通信的。汇编语言并没有为这些问题带来答案,于是我决定做一番深入研究。我开始学习 Linux 内核的源代码,并且尝试着理解那些让我感兴趣的东西。然而 Linux 内核源代码也没有解答我所有的问题,不过我自身关于 Linux 内核及其外围流程的知识确实掌握的更好了。

    在我开始学习 Linux 内核的九个半月之后,我写了这部分内容,并且发布了本书的第一部分。到现在为止,本书共包括了四个部分,而这并不是终点。我之所以写这一系列关于 Linux 内核的文章其实更多的是为了我自己。你也知道,Linux 内核的代码量极其巨大,另外还非常容易忘记这一块或那一块内核代码做了什么,或者忘记某些东西是怎么实现的。出乎意料的是 linux-insides 很快就火了,并且在九个月后积攒了 9096 个星星:

    github

    看起来人们对 Linux 内核的内在机制非常的感兴趣。除此之外,在我写 linux-insides 的这段时间里,我收到了很多人发来的问题,这些问题大都是关于如何开始向 Linux 内核贡献代码。通常来说,人们是很有兴趣为开源项目做贡献的,Linux 内核也不例外:

    google-linux

    这么看起来大家对 Linux 内核的开发流程非常感兴趣。我认为如果这么一本关于 Linux 内核的书却不包括一部分来讲讲如何参与 Linux 内核开发的话,那就非常奇怪了。这就是我决定写这篇文章的原因。在本文中,你不会看到为什么你应该对贡献 Linux 内核感兴趣,但是如果你想参与 Linux 内核开发的话,那这部分就是为你而作。

    让我们开始吧。

    如何入门 Linux 内核

    首先,让我们看看如何获取、构建并运行 Linux 内核。你可以通过两种方式来运行你自己定制的内核:

    • 在虚拟机里运行 Linux 内核;
    • 在真实的硬件上运行 Linux 内核。

    我会对这两种方式都展开描述。在我们开始对 Linux 内核做些什么之前,我们首先需要先获取它。根据你目的的不同,有两种方式可以做到这一点。如果你只是想更新一下你电脑上的 Linux 内核版本,那么你可以使用特定于你 Linux 发行版的命令。

    在这种情况下,你只需要使用软件包管理器下载新版本的 Linux 内核。例如,为了将 Ubuntu (Vivid Vervet) 系统的 Linux 内核更新至 4.1版本,你只需要执行以下命令:

     
    1. $ sudo add-apt-repository ppa:kernel-ppa/ppa

    2. $ sudo apt-get update

    在这之后,再执行下面的命令:

    $ apt-cache showpkg linux-headers
    

    然后选择你感兴趣的 Linux 内核的版本。最后,执行下面的命令并且将 ${version} 替换为你从上一条命令的输出中选择的版本号。

    $ sudo apt-get install linux-headers-${version} linux-headers-${version}-generic linux-image-${version}-generic --fix-missing
    

    最后重启你的系统。重启完成后,你将在 grub 菜单中看到新的内核。

    另一方面,如果你对 Linux 内核开发感兴趣,那么你就需要获得 Linux 内核的源代码。你可以在 kernel.org 网站上找到它并且下载一个包含了 Linux 内核源代码的归档文件。实际上,Linux 内核的开发流程完全建立在 git 版本控制系统之上,所以你需要通过 git 来从 kernel.org 上获取内核源代码:

    $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
    

    我不知道你怎么看,但是我本身是非常喜欢 github 的。它上面有一个 Linux 内核主线仓库的镜像,你可以通过以下命令克隆它:

    $ git clone git@github.com:torvalds/linux.git
    

    我是用我自己 fork 的仓库来进行开发的,等到我想从主线仓库拉取更新的时候,我只需要执行下方的命令即可:

     
    1. $ git checkout master

    2. $ git pull upstream master

    注意这个主线仓库的远程主机名叫做 upstream。为了将主线 Linux 仓库添加为一个新的远程主机,你可以执行:

    git remote add upstream git@github.com:torvalds/linux.git
    

    在此之后,你将有两个远程主机:

     
    1. ~/dev/linux (master) $ git remote -v

    2. origin git@github.com:0xAX/linux.git (fetch)

    3. origin git@github.com:0xAX/linux.git (push)

    4. upstream https://github.com/torvalds/linux.git (fetch)

    5. upstream https://github.com/torvalds/linux.git (push)

    其中一个远程主机是你的 fork 仓库 (origin),另一个是主线仓库 (upstream)。

    现在,我们已经有了一份 Linux 内核源代码的本地副本,我们需要配置并编译内核。Linux 内核的配置有很多不同的方式,最简单的方式就是直接拷贝 /boot 目录下已安装内核的配置文件:

    $ sudo cp /boot/config-$(uname -r) ~/dev/linux/.config
    

    如果你当前的内核被编译为支持访问 /proc/config.gz 文件,你也可以使用以下命令复制当前内核的配置文件:

    $ cat /proc/config.gz | gunzip > ~/dev/linux/.config
    

    如果你对发行版维护者提供的标准内核配置文件并不满意,你也可以手动配置 Linux 内核,有两种方式可以做到这一点。Linux 内核的根 Makefile 文件提供了一系列可配置的目标选项。例如 menuconfig 为内核配置提供了一个菜单界面:

    menuconfig

    defconfig 参数会为当前的架构生成默认的内核配置文件,例如 x86_64 defconfig。你可以将 ARCH 命令行参数传递给 make,以此来为给定架构创建 defconfig 配置文件:

    $ make ARCH=arm64 defconfig
    

    allnoconfig、 allyesconfig 以及 allmodconfig 参数也允许你生成新的配置文件,其效果分别为尽可能多的选项都关闭、尽可能多的选项都启用或尽可能多的选项都作为模块启用。nconfig 命令行参数提供了基于 ncurses 的菜单程序来配置 Linux 内核:

    nconfig

    randconfig 参数甚至可以随机地生成 Linux 内核配置文件。我不会讨论如何去配置 Linux 内核或启用哪个选项,因为没有必要这么做:首先,我不知道你的硬件配置;其次,如果我知道了你的硬件配置,那么剩下的问题就是搞清楚如何使用程序生成内核配置,而这些程序的使用都是非常容易的。

    好了,我们现在有了 Linux 内核的源代码并且完成了配置。下一步就是编译 Linux 内核了。最简单的编译 Linux 内核的方式就是执行以下命令:

     
    1. $ make

    2. scripts/kconfig/conf --silentoldconfig Kconfig

    3. #

    4. # configuration written to .config

    5. #

    6. CHK include/config/kernel.release

    7. UPD include/config/kernel.release

    8. CHK include/generated/uapi/linux/version.h

    9. CHK include/generated/utsrelease.h

    10. ...

    11. ...

    12. ...

    13. OBJCOPY arch/x86/boot/vmlinux.bin

    14. AS arch/x86/boot/header.o

    15. LD arch/x86/boot/setup.elf

    16. OBJCOPY arch/x86/boot/setup.bin

    17. BUILD arch/x86/boot/bzImage

    18. Setup is 15740 bytes (padded to 15872 bytes).

    19. System is 4342 kB

    20. CRC 82703414

    21. Kernel: arch/x86/boot/bzImage is ready (#73)

    为了增加内核的编译速度,你可以给 make 传递命令行参数 -jN,这里的 N 指定了并发执行的命令数目:

    $ make -j8
    

    如果你想为一个架构构建一个与当前内核不同的内核,那么最简单的方式就是传递下面两个参数:

    • ARCH 命令行参数是目标架构名;
    • CROSS_COMPILER 命令行参数是交叉编译工具的前缀;

    例如,如果我们想使用默认内核配置文件为 arm64 架构编译 Linux 内核,我们需要执行以下命令:

     
    1. $ make -j4 ARCH=arm64 CROSS_COMPILER=aarch64-linux-gnu- defconfig

    2. $ make -j4 ARCH=arm64 CROSS_COMPILER=aarch64-linux-gnu-

    编译的结果就是你会看到压缩后的内核文件 - arch/x86/boot/bzImage。既然我们已经编译好了内核,那么就可以把它安装到我们的电脑上或者只是将它运行在模拟器里。

    安装 Linux 内核

    就像我之前写的,我们将考察两种运行新内核的方法:第一种情况,我们可以在真实的硬件上安装并运行新版本的 Linux 内核,第二种情况就是在虚拟机上运行 Linux 内核。在前面的段落中我们看到了如何从源代码来构建 Linux 内核,并且我们现在已经得到了内核的压缩镜像:

     
    1. ...

    2. ...

    3. ...

    4. Kernel: arch/x86/boot/bzImage is ready (#73)

    在我们获得了 bzImage 之后,我们需要使用以下命令来为新的 Linux 内核安装 headers 和 modules

     
    1. $ sudo make headers_install

    2. $ sudo make modules_install

    以及内核自身:

    $ sudo make install
    

    从这时起,我们已经安装好了新版本的 Linux 内核,现在我们需要通知 bootloader 新内核已经安装完成。我们当然可以手动编辑/boot/grub2/grub.cfg 配置文件并将新内核添加进去,但是我更推荐使用脚本来完成这件事。我现在在使用两种不同的 Linux 发行版:Fedora 和 Ubuntu,有两种方式可以用来更新 grub 配置文件,我目前正在使用下面的脚本来达到这一目的:

    #!/bin/bash
    
    source "term-colors"
    
    DISTRIBUTIVE=$(cat /etc/*-release | grep NAME | head -1 | sed -n -e 's/NAME\=//p')
    echo -e "Distributive: ${Green}${DISTRIBUTIVE}${Color_Off}"
    
    if [[ "$DISTRIBUTIVE" == "Fedora" ]] ;
    then
        su -c 'grub2-mkconfig -o /boot/grub2/grub.cfg'
    else
        sudo update-grub
    fi
    
    echo "${Green}Done.${Color_Off}"

    这是新 Linux 内核安装过程中的最后一步,在这之后你可以重启你的电脑,然后在启动过程中选择新版本的内核。

    第二种情况就是在虚拟机内运行新的 Linux 内核,我更倾向于使用 qemu。首先我们需要为此构建初始的虚拟内存盘 - initrdinitrd 是一个临时的根文件系统,它在初始化期间被 Linux 内核使用,而那时其他的文件系统尚未被挂载。我们可以使用以下命令构建 initrd

    首先我们需要下载 busybox,然后运行 menuconfig 命令配置它:

    $ mkdir initrd
    $ cd initrd
    $ curl http://busybox.net/downloads/busybox-1.23.2.tar.bz2 | tar xjf -
    $ cd busybox-1.23.2/
    $ make menuconfig
    $ make -j4

    busybox 是一个可执行文件 - /bin/busybox,它包括了一系列类似于 coreutils 的标准工具。在 busysbox 菜单界面上我们需要启用 Build BusyBox as a static binary (no shared libs) 选项:

    busysbox menu

    我们可以按照下方的路径找到这个菜单项:

     
    1. Busybox Settings

    2. --> Build Options

    之后,我们从 busysbox 的配置菜单退出去,然后执行下面的命令来构建并安装它:

     
    1. $ make -j4

    2. $ sudo make install

    既然 busybox 已经安装完了,那么我们就可以开始构建 initrd 了。为了完成构建过程,我们需要返回到之前的 initrd 目录并且运行命令:

     
    1. $ cd ..

    2. $ mkdir -p initramfs

    3. $ cd initramfs

    4. $ mkdir -pv {bin,sbin,etc,proc,sys,usr/{bin,sbin}}

    5. $ cp -av ../busybox-1.23.2/_install/* .

    这会把 busybox 复制到 bin 目录、sbin 目录以及其他相关目录内。现在我们需要创建可执行的 init 文件,该文件将会在系统内作为第一个进程执行。我的 init 文件仅仅挂载了 procfs 和 sysfs 文件系统并且执行了 shell 程序:

    #!/bin/sh
    
    mount -t proc none /proc
    mount -t sysfs none /sys
    
    exec /bin/sh

    最后,我们创建一个归档文件,这就是我们的 initrd 了:

    $ find . -print0 | cpio --null -ov --format=newc | gzip -9 > ~/dev/initrd_x86_64.gz
    

    我们现在可以在虚拟机里运行内核了。就像我之前写过的,我偏向于使用 qemu 来完成这些工作,下面的命令可以用来运行我们的 Linux 内核:

    $ qemu-system-x86_64 -snapshot -m 8GB -serial stdio -kernel ~/dev/linux/arch/x86_64/boot/bzImage -initrd ~/dev/initrd_x86_64.gz -append "root=/dev/sda1 ignore_loglevel"
    

    qemu

    从现在起,我们就可以在虚拟机内运行 Linux 内核了,这意味着我们可以开始对内核进行修改和测试了。

    除了上面的手动过程之外,还可以考虑使用 ivandaviov/minimal 来自动生成 initrd

    Linux 内核开发入门

    这部分的核心内容主要回答了两个问题:在你发送第一个 Linux 内核补丁之前你应该做什么 (to do) 和不能做什么 (not to do)。请千万不要把应该做的事 (to do) 和待办事项 (todo) 搞混了。我无法回答你能为 Linux 内核修复什么问题,我只是想告诉你我拿 Linux 内核源代码做实验的过程。

    首先,我需要使用以下命令从 Linus 的仓库中拉取最新的更新:

     
    1. $ git checkout master

    2. $ git pull upstream master

    在这之后,我的本地 Linux 内核源代码仓库已经和主线仓库同步了。现在我们可以在源代码上做些修改了。就像我之前写的,关于从哪开始修改或者可以做些什么,我并不能给你太多建议。不过,对于新手来说最好的地方就是 staging 源码树,也就是 drivers/staging 上的驱动集合。staging 源码树的主要维护者是 Greg Kroah-Hartman,该源码树正是你的琐碎补丁可以被接受的地方。让我们看一个简单的例子,该例子描述了如何生成补丁、检查补丁以及如何将补丁发送到 Linux 内核邮件列表

    如果我们查看一下为 Digi International EPCA PCI 基础设备所写的驱动程序,在 295 行我们将会看到 dgap_sindex 函数:

    static char *dgap_sindex(char *string, char *group)
    {
        char *ptr;
    
        if (!string || !group)
            return NULL;
    
        for (; *string; string++) {
            for (ptr = group; *ptr; ptr++) {
                if (*ptr == *string)
                    return string;
            }
        }
    
        return NULL;
    }

    这个函数查找 group 和 string 共有的字符并返回其位置。在研究 Linux 内核源代码期间,我注意到 lib/string.c 文件里实现了一个 strpbrk 函数,该函数和 dgap_sinidex 函数做了同样的事。使用现存函数的另一种自定义实现并不是一个好主意,所以我们可以从drivers/staging/dgap/dgap.c 源码文件中移除 dgap_sindex 函数并使用 strpbrk 替换它。

    首先,让我们基于当前主分支创建一个新的 git 分支,该分支与 Linux 内核主仓库同步:

    $ git checkout -b "dgap-remove-dgap_sindex"
    

    然后,我们可以将 dgap_sindex 函数替换为 strpbrk。做完这些修改之后,我们需要重新编译 Linux 内核或者只重编译 dgap 目录。不要忘了在内核配置文件中启用这个驱动,你可以在如下位置找到该驱动:

     
    1. Device Drivers

    2. --> Staging drivers

    3. ----> Digi EPCA PCI products

    dgap menu

    现在是时候提交修改了,我使用下面的命令组合来完成这件事:

     
    1. $ git add .

    2. $ git commit -s -v

    最后一条命令运行后将会打开一个编辑器,该编辑器会从 $GIT_EDITOR 或 $EDITOR 环境变量中进行选择。 -s 命令行参数会在提交信息的末尾按照提交者名字加上一行 Signed-off-by。你在每一条提交信息的最后都能看到这一行,例如 - 00cc1633。这一行的主要目的是追踪谁做的修改。-v 选项按照合并格式显示 HEAD 提交和即将进行的最新提交之间的差异。这样做不是并必须的,但有时候却很有用。再来说下提交信息,实际上,一条提交信息由两部分组成:

    第一部分放在第一行,它包括了一句对所做修改的简短描述。这一行以 [PATCH] 做前缀,后面跟上子系统、驱动或架构的名字,以及在 :之后的简述信息。在我们这个例子中,这一行信息如下所示:

    [PATCH] staging/dgap: Use strpbrk() instead of dgap_sindex()
    

    在简述信息之后,我们通常空一行再加上对本次提交的详尽描述。在我们的这个例子中,这些信息如下所示:

     
    1. The <linux/string.h> provides strpbrk() function that does the same that the

    2. dgap_sindex(). Let's use already defined function instead of writing custom.

    在提交信息的最后是 Sign-off-by 这一行。注意,提交信息的每一行不能超过 80 个字符并且提交信息必须详细地描述你所做的修改。千万不要只写一条类似于 Custom function removed 这样的信息,你需要描述你做了什么以及为什么这样做。补丁的审核者必须据此知道他们正在审核什么内容,除此之外,这里的提交信息本身也非常有用。每当你不能理解一些东西的时候,我们都可以使用 git blame 命令来阅读关于修改的描述。

    提交修改之后,是时候生成补丁文件了。我们可以使用 format-patch 命令来完成:

     
    1. $ git format-patch master

    2. 0001-staging-dgap-Use-strpbrk-instead-of-dgap_sindex.patch

    我们把分支名字 (这里是master) 传递给 format-patch 命令,该命令会根据那些包括在 dgap-remove-dgap_sindex 分支但不在 master 分支的最新改动来生成补丁。你会发现, format-patch 命令生成的文件包含了最新所做的修改,该文件的名字是基于提交信息的简述来生成的。如果你想按照自定义的文件名来生成补丁,你可以使用 --stdout 选项:

    $ git format-patch master --stdout > dgap-patch-1.patch
    

    最后一步就是在我们生成补丁之后将之发送到 Linux 内核邮件列表。当然,你可以使用任意的邮件客户端,不过 git 为此提供了一个专门的命令:git send-email。在发送补丁之前,你需要知道发到哪里。虽然你可以直接把它发送到 linux-kernel@vger.kernel.org 这个邮件列表,但这很可能让你的补丁因为巨大的消息流而被忽略掉。最好的选择是将补丁发送到你的修改所属子系统的维护者那里。你可以使用 get_maintainer.pl 这个脚本来找到这些维护者的名字。你所需要做的就是将你代码所在的文件或目录作为参数传递给脚本。

     
    1. $ ./scripts/get_maintainer.pl -f drivers/staging/dgap/dgap.c

    2. Lidza Louina <lidza.louina@gmail.com> (maintainer:DIGI EPCA PCI PRODUCTS)

    3. Mark Hounschell <markh@compro.net> (maintainer:DIGI EPCA PCI PRODUCTS)

    4. Daeseok Youn <daeseok.youn@gmail.com> (maintainer:DIGI EPCA PCI PRODUCTS)

    5. Greg Kroah-Hartman <gregkh@linuxfoundation.org> (supporter:STAGING SUBSYSTEM)

    6. driverdev-devel@linuxdriverproject.org (open list:DIGI EPCA PCI PRODUCTS)

    7. devel@driverdev.osuosl.org (open list:STAGING SUBSYSTEM)

    8. linux-kernel@vger.kernel.org (open list)

    你将会看到一组姓名和与之相关的邮件地址。现在你可以通过下面的命令发送补丁了:

     
    1. $ git send-email --to "Lidza Louina <lidza.louina@gmail.com>" \

    2. --cc "Mark Hounschell <markh@compro.net>" \

    3. --cc "Daeseok Youn <daeseok.youn@gmail.com>" \

    4. --cc "Greg Kroah-Hartman <gregkh@linuxfoundation.org>" \

    5. --cc "driverdev-devel@linuxdriverproject.org" \

    6. --cc "devel@driverdev.osuosl.org" \

    7. --cc "linux-kernel@vger.kernel.org"

    这就是全部的过程。补丁被发出去了,现在你所需要做的就是等待 Linux 内核开发者的反馈。在你发送完补丁并且维护者接受它之后,你将在维护者的仓库中看到它 (例如前文你看到的补丁)。一段时间后,维护者将会向 Linus 发送一个拉取请求,之后你就会在主线仓库里看到你的补丁了。

    这就是全部内容。

    一些建议

    在该部分的最后,我想给你一些建议,这些建议大都是关于在 Linux 内核的开发过程中需要做什么以及不能做什么的:

    • 考虑,考虑,再考虑。在你决定发送补丁之前再三考虑。

    • 在你每次改完 Linux 内核源代码之后 - 试着编译它。我指的是任何修改之后,都要不断的编译。没有人喜欢那些连编译都不通过修改。

    • Linux 内核有一套代码规范指南,你需要遵守它。有一个很棒的脚本可以帮你检查所做的修改。这个脚本就是 -scripts/checkpatch.pl。只需要将被改动的源码文件传递给它即可,然后你就会看到如下输出:

     
    1. $ ./scripts/checkpatch.pl -f drivers/staging/dgap/dgap.c

    2. WARNING: Block comments use * on subsequent lines

    3. #94: FILE: drivers/staging/dgap/dgap.c:94:

    4. +/*

    5. + SUPPORTED PRODUCTS

    6.  
    7. CHECK: spaces preferred around that '|' (ctx:VxV)

    8. #143: FILE: drivers/staging/dgap/dgap.c:143:

    9. + { PPCM, PCI_DEV_XEM_NAME, 64, (T_PCXM|T_PCLITE|T_PCIBUS) },

    10.  
    11.  

    在 git diff 命令的帮助下,你也会看到一些有问题的地方:

    git diff

    • Linus 不接受 github pull requests

    • 如果你的修改是由一些不同的且不相关的改动所组成的,你需要通过分离提交来切分修改。git format-patch 命令将会为每个提交生成一个补丁,每个补丁的标题会包含一个 vN 前缀,其中 N 是补丁的编号。如果你打算发送一系列补丁,也许给 git format-patch命令传递 --cover-letter 选项会对此很有帮助。这会生成一个附加文件,该文件包括的附函可以用来描述你的补丁集所做的改动。在 git send-email 命令中使用 --in-reply-to 选项也是一个好主意,该选项允许你将补丁集作为对附函的回复发送出去。对于维护者来说,你补丁集的结构看起来就像下面这样:

     
    1. |--> cover letter

    2. |----> patch_1

    3. |----> patch_2

    你可以将 message-id 参数传递给 --in-reply-to 选项,该选项可以在 git send-email 命令的输出中找到。

    有一件非常重要的事,那就是你的邮件必须是纯文本格式。通常来说,send-email 和 format-patch 这两个命令在内核开发中都是非常有用的,所以请查阅这些命令的的相关文档,你会发现很多有用的选项,例如:git send-email 和 git format-patch

    • 如果你发完补丁之后没有得到立即答复,请不要惊讶,因为维护者们都是很忙的。

    • scripts 目录包含了很多对 Linux 内核开发有用的脚本。我们已经看过此目录中的两个脚本了:checkpatch.pl 和get_maintainer.pl。除此之外,你还可以找到 stackusage 脚本,它可以打印栈的使用情况,extract-vmlinux 脚本可以提取出未经压缩的内镜镜像,还有很多其他的脚本。在 scripts 目录之外,你也会发现很多有用的脚本,这些脚本是 Lorenzo Stoakes 为内核开发而编写的。

    • 订阅 Linux 内核邮件列表。lkml 列表中每天都会有大量的信件,但是阅读它们并了解一些类似于 Linux 内核目前开发状态的内容是很有帮助的。除了 lkml 之外,还有一些其他的邮件列表,它们分别对应于不同的 Linux 内核子系统。

    • 如果你发的补丁第一次没有被接受,你就会收到 Linux 内核开发者的反馈。请做一些修改然后以 [PATCH vN](N 是补丁版本号) 为前缀重新发送补丁,例如:

    [PATCH v2] staging/dgap: Use strpbrk() instead of dgap_sindex()
    

    同样的,这次的补丁也必须包括更新日志以便描述自上一次的补丁以来所做的修改。当然,本文并不是对 Linux 内核开发详尽无遗的指导清单,但是一些最重要的事项已经都被阐明了。

    Happy Hacking!

    总结

    我希望这篇文章能够帮助其他人加入 Linux 内核社区!如果你有其他问题或建议,可以给我写邮件或者在 Twitter 上联系

    请注意,英语并不是我的母语,对此带来的不便我感到很抱歉。如果你发现了错误,请通过邮件或发 PR 来通知我。

     

    原文:https://github.com/MintCN/linux-insides-zh/blob/master/Misc/contribute.md

    展开全文
  • "还真不对,我们平时说的Linux其实是指Linux内核,而Linux操作系统真正的称呼为GNU/linux操作系统(GNU/linux是指 ,linux内核+GNU组织的软件)。在过去的2021年,Linux内核添加了大量令人兴奋地改进,并引入了新的...

    大家每次听到Linux都会说:"哦,就是那个操作系统对吧?"还真不对,我们平时说的Linux其实是指Linux内核,而Linux操作系统真正的称呼为GNU/linux操作系统(GNU/linux是指 ,linux内核+GNU组织的软件)。在过去的2021年,Linux内核添加了大量令人兴奋地改进,并引入了新的硬件支持等。

    近日业内知名的性能测评网站Phoronix发布了2021年Linux内核的发展报告。尽管这一年Linux内核的发展令人振奋,可它实际上在内容提交次数和代码行上都比以往的数据低。下面让我们来看看每年的GitStats开发统计。

    GitStats开发统计

    截止至2021年12月31日,在Linux内核源码树上运行GitStats时,可以看到约有24.3万个作者进行了1,060,172次提交。该源码树目前由3,220万行的代码组成,涉及74,300个文件。

    图片来源Phoronix

    随着Linux内核中的新功能不断涌现以及对于硬件支持的提高,它的内核代码行数始终在以相当稳定的速度增长,并被合并进主要内核版本中。

     图片来源Phoronix

    提交量为什么减少?

    虽然2021年发布了一些令人振奋的新功能和硬件支持,但在2021年只看到了73.7k的提交,比2020年至2018年的90.2k、82.8k、80.1k下降了很多。上一次年提交量比7.3k还少的还是在2013年的70.9k。导致提交量下降的部分原因是因为2021年仅有5个主要内核发布,而某些年份有6个内核发布。要知道每年额外内核发布期的合并窗口都会带来大量的新提交产生。同时,Linux 5.16将在几周后发布,这也就意味着Linux 5.17的合并窗口在2022年的1月才会启动。

    Linux内核代码行数量变化

    除了提交量比以往少很多以外,Linux内核代码新增行数也低于去年的数据。在2021年,Linux内核代码行数增加320万行,删除130万行,低于2020年的增加400万行以及删除150万行。

    Linux内核代码高产贡献者

    像以往一样,Linus Torvalds依然还是Linux源代码树上最高产的贡献者。除了他之外,Linux内核源码树上,排名靠前的代码贡献者分别是David S. Miller、Arnd Bergmann、Christoph Hellwig、Lee Jones和Jakub Kicinski等知名的长期内核贡献者。

     图片来源GitStats

    用于内核代码提交的电子邮件数量

    2021年,有4421封不同的电子邮件与Linux内核代码提交有关,比2020年的4603封有所下降,但与2019年的4383封相比又有所增加。

    2021Linux内核科技圈趣事

    在2021年中Linux内核科技圈也发生了许多有趣的事:

    原文链接:Samsung 860/870 SSDs Continue Causing Problems For Linux Users - Phoronix

    展开全文
  • LINUX内核开发(二)

    2020-12-18 04:25:35
    这一款整理发布的LINUX内核开发(二),适用于日常学习、参考、借鉴LINUX内核开发(二)使用,...该文档为LINUX内核开发(二),是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • Publication_LinuxKernelReport_2017.7z,Linux公社www.linuxidc.com.png,Linux公社PDF.pdf,Publication_LinuxKernelReport_2017.pdf
  • Linux内核开发框架的学习资料说明
  • LINUX内核开发(一)

    2020-12-17 21:49:03
    你还在苦苦寻找LINUX内核开发(一)吗?你还在为LINUX内核开发(一)而烦恼么?在这里,为您提...该文档为LINUX内核开发(一),是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 浅谈 Linux 内核开发之 PCI 设备驱动1
  • AspectC在Linux内核开发中的应用研究.pdf
  • Linux内核开发-入门篇

    万次阅读 2019-01-09 19:17:18
    如何入门 Linux 内核 首先,让我们看看如何获取、构建并运行 Linux 内核。你可以通过两种方式来运行你自己定制的内核: 在虚拟机里运行 Linux 内核; 在真实的硬件上运行 Linux 内核。 我会对这两种...
  • Linux内核开发[收集].pdf
  • Linux内核开发_1_编译LInux内核

    千次阅读 多人点赞 2020-05-13 01:23:32
    Linux内核版本: cat /proc/version Linux version 4.15.0-20-generic (buildd@lgw01-amd64-039)\ (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 ...
  • Linux内核开发框架学习.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 298,735
精华内容 119,494
关键字:

linux内核开发